summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib/realpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdlib/realpath.c')
-rw-r--r--lib/libc/stdlib/realpath.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/libc/stdlib/realpath.c b/lib/libc/stdlib/realpath.c
index ffbf8ec..185dbb6 100644
--- a/lib/libc/stdlib/realpath.c
+++ b/lib/libc/stdlib/realpath.c
@@ -65,7 +65,6 @@ realpath(const char * __restrict path, char * __restrict resolved)
errno = ENOENT;
return (NULL);
}
- serrno = errno;
if (resolved == NULL) {
resolved = malloc(PATH_MAX);
if (resolved == NULL)
@@ -83,9 +82,11 @@ realpath(const char * __restrict path, char * __restrict resolved)
left_len = strlcpy(left, path + 1, sizeof(left));
} else {
if (getcwd(resolved, PATH_MAX) == NULL) {
- if (m)
+ if (m) {
+ serrno = errno;
free(resolved);
- else {
+ errno = serrno;
+ } else {
resolved[0] = '.';
resolved[1] = '\0';
}
@@ -143,8 +144,11 @@ realpath(const char * __restrict path, char * __restrict resolved)
* occurence to not implement lookahead.
*/
if (lstat(resolved, &sb) != 0) {
- if (m)
+ if (m) {
+ serrno = errno;
free(resolved);
+ errno = serrno;
+ }
return (NULL);
}
if (!S_ISDIR(sb.st_mode)) {
@@ -184,8 +188,11 @@ realpath(const char * __restrict path, char * __restrict resolved)
if (lstat(resolved, &sb) != 0) {
if (errno != ENOENT || p != NULL)
errno = ENOTDIR;
- if (m)
+ if (m) {
+ serrno = errno;
free(resolved);
+ errno = serrno;
+ }
return (NULL);
}
if (S_ISLNK(sb.st_mode)) {
@@ -197,8 +204,11 @@ realpath(const char * __restrict path, char * __restrict resolved)
}
slen = readlink(resolved, symlink, sizeof(symlink) - 1);
if (slen < 0) {
- if (m)
+ if (m) {
+ serrno = errno;
free(resolved);
+ errno = serrno;
+ }
return (NULL);
}
symlink[slen] = '\0';
OpenPOWER on IntegriCloud