From be4e6bbed0ccd09c605bff2671cd9c79b9c82217 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 4 Dec 2002 00:08:52 +0000 Subject: Properly allocate memory when size is 0, but so is buf --- libc/sysdeps/linux/common/getcwd.c | 53 ++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 25 deletions(-) (limited to 'libc/sysdeps/linux/common/getcwd.c') diff --git a/libc/sysdeps/linux/common/getcwd.c b/libc/sysdeps/linux/common/getcwd.c index 9cdd84b47..9e64a3dd8 100644 --- a/libc/sysdeps/linux/common/getcwd.c +++ b/libc/sysdeps/linux/common/getcwd.c @@ -17,33 +17,36 @@ static inline _syscall2(int, __syscall_getcwd, char *, buf, unsigned long, size) char *getcwd(char *buf, int size) { - int olderrno, ret; - char *allocbuf; - - if (size == 0) { - __set_errno(EINVAL); - return NULL; - } - if (size < 3) { - __set_errno(ERANGE); - return NULL; - } - allocbuf=NULL; - olderrno = errno; - if (buf == NULL) { - buf = allocbuf = malloc (size); - if (buf == NULL) - return NULL; + int olderrno, ret; + char *allocbuf; + + if (size == 0) { + if (buf != NULL) { + __set_errno(EINVAL); + return NULL; } - ret = INLINE_SYSCALL(getcwd, 2, buf, size); - if (ret < 0) { - if (allocbuf) { - free(allocbuf); - } + size = PATH_MAX; + } + if (size < 3) { + __set_errno(ERANGE); + return NULL; + } + allocbuf=NULL; + olderrno = errno; + if (buf == NULL) { + buf = allocbuf = malloc (size); + if (buf == NULL) return NULL; - } - __set_errno(olderrno); - return buf; + } + ret = INLINE_SYSCALL(getcwd, 2, buf, size); + if (ret < 0) { + if (allocbuf) { + free(allocbuf); + } + return NULL; + } + __set_errno(olderrno); + return buf; } #else -- cgit v1.2.3