From bf3b6d780d2abf2ed09e64bb3e11481e88708115 Mon Sep 17 00:00:00 2001 From: szaka Date: Wed, 11 Jun 2008 20:33:02 +0000 Subject: [PATCH] fix potential hang for huge/corrupted directories (Miklos Szeredi, Szabolcs Szakacsits) --- libfuse-lite/fuse.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libfuse-lite/fuse.c b/libfuse-lite/fuse.c index 9e850743..808cd315 100644 --- a/libfuse-lite/fuse.c +++ b/libfuse-lite/fuse.c @@ -310,8 +310,12 @@ static char *add_name(char **buf, unsigned *bufsize, char *s, const char *name) unsigned newbufsize = *bufsize; char *newbuf; - while (newbufsize < pathlen + len + 1) - newbufsize *= 2; + while (newbufsize < pathlen + len + 1) { + if (newbufsize >= 0x80000000) + newbufsize = 0xffffffff; + else + newbufsize *= 2; + } newbuf = realloc(*buf, newbufsize); if (newbuf == NULL) @@ -1852,8 +1856,12 @@ static int extend_contents(struct fuse_dh *dh, unsigned minsize) unsigned newsize = dh->size; if (!newsize) newsize = 1024; - while (newsize < minsize) - newsize *= 2; + while (newsize < minsize) { + if (newsize >= 0x80000000) + newsize = 0xffffffff; + else + newsize *= 2; + } newptr = (char *) realloc(dh->contents, newsize); if (!newptr) {