diff options
| -rw-r--r-- | libc/sysdeps/linux/common/getcwd.c | 39 | 
1 files changed, 21 insertions, 18 deletions
diff --git a/libc/sysdeps/linux/common/getcwd.c b/libc/sysdeps/linux/common/getcwd.c index 9e64a3dd8..d1740fa31 100644 --- a/libc/sysdeps/linux/common/getcwd.c +++ b/libc/sysdeps/linux/common/getcwd.c @@ -151,29 +151,32 @@ static char *recurser(char *path_buf, int path_size, dev_t root_dev, ino_t root_  char *getcwd(char *buf, int size)  { -	struct stat st; +    struct stat st; -	if (size == 0) { -		__set_errno(EINVAL); -		return NULL; -	} -	if (size < 3) { -		__set_errno(ERANGE); -		return NULL; +    if (size == 0) { +	if (buf != NULL) { +	    __set_errno(EINVAL); +	    return NULL;  	} +	size = PATH_MAX; +    } +    if (size < 3) { +	__set_errno(ERANGE); +	return NULL; +    } -	if (buf == NULL) { -		buf = malloc (size); -		if (buf == NULL) -			return NULL; -	} +    if (buf == NULL) { +	buf = malloc (size); +	if (buf == NULL) +	    return NULL; +    } -	strcpy(buf, "."); -	if (stat("/", &st) < 0) { -		return NULL; -	} +    strcpy(buf, "."); +    if (stat("/", &st) < 0) { +	return NULL; +    } -	return recurser(buf, size, st.st_dev, st.st_ino); +    return recurser(buf, size, st.st_dev, st.st_ino);  }  #endif  | 
