diff options
Diffstat (limited to 'guts')
-rw-r--r-- | guts/README | 2 | ||||
-rw-r--r-- | guts/getgrent_r.c | 8 | ||||
-rw-r--r-- | guts/getgrgid_r.c | 1 | ||||
-rw-r--r-- | guts/getgrnam_r.c | 4 | ||||
-rw-r--r-- | guts/getpwent_r.c | 4 | ||||
-rw-r--r-- | guts/getpwnam_r.c | 4 | ||||
-rw-r--r-- | guts/getpwuid_r.c | 4 | ||||
-rw-r--r-- | guts/mkdtemp.c | 3 | ||||
-rw-r--r-- | guts/mktemp.c | 1 | ||||
-rw-r--r-- | guts/readlinkat.c | 8 |
10 files changed, 33 insertions, 6 deletions
diff --git a/guts/README b/guts/README index efb6e4b..871e6bb 100644 --- a/guts/README +++ b/guts/README @@ -185,9 +185,11 @@ is set, or else the system /etc/* files. getpwnam_r getpwuid getpwuid_r + lckpwdf setgrent setgroups setpwent + ulckpwdf The implementation of getgroups() is inauthentic in that it always checks the group file when called, rather than checking the group file once diff --git a/guts/getgrent_r.c b/guts/getgrent_r.c index a080f14..b02466a 100644 --- a/guts/getgrent_r.c +++ b/guts/getgrent_r.c @@ -10,12 +10,16 @@ /* note that we don't wrap fgetgrent_r, since there's no path * references in it. */ + if (!pseudo_grp) { + errno = ENOENT; + return -1; + } rc = fgetgrent_r(pseudo_grp, gbuf, buf, buflen, gbufp); if (rc == 0 && *gbufp) { if (*gbufp == gbuf) { - pseudo_debug(1, "found group: %d/%s\n", gbuf->gr_gid, gbuf->gr_name); + pseudo_debug(3, "found group: %d/%s\n", gbuf->gr_gid, gbuf->gr_name); } else { - pseudo_debug(1, "found group, but it's wrong?"); + pseudo_debug(1, "found group (%d), but it's wrong?", gbuf->gr_gid); } } diff --git a/guts/getgrgid_r.c b/guts/getgrgid_r.c index fcaed89..06a91c9 100644 --- a/guts/getgrgid_r.c +++ b/guts/getgrgid_r.c @@ -13,6 +13,7 @@ if (gbuf->gr_gid == gid) { pseudo_debug(1, "found group gid %d, name %s\n", gbuf->gr_gid, gbuf->gr_name); + endgrent(); return rc; } } diff --git a/guts/getgrnam_r.c b/guts/getgrnam_r.c index 73c1c45..39de641 100644 --- a/guts/getgrnam_r.c +++ b/guts/getgrnam_r.c @@ -10,8 +10,10 @@ setgrent(); while ((rc = wrap_getgrent_r(gbuf, buf, buflen, gbufp)) == 0) { /* 0 means no error occurred, and *gbufp == gbuf */ - if (gbuf->gr_name && !strcmp(gbuf->gr_name, name)) + if (gbuf->gr_name && !strcmp(gbuf->gr_name, name)) { + endgrent(); return rc; + } } endgrent(); /* we never found a match; rc is 0 if there was no error, or diff --git a/guts/getpwent_r.c b/guts/getpwent_r.c index aadd97b..d55763e 100644 --- a/guts/getpwent_r.c +++ b/guts/getpwent_r.c @@ -10,6 +10,10 @@ /* note that we don't wrap fgetpwent_r, since there's no path * references in it. */ + if (!pseudo_pwd) { + errno = ENOENT; + return -1; + } return fgetpwent_r(pseudo_pwd, pwbuf, buf, buflen, pwbufp); /* return rc; diff --git a/guts/getpwnam_r.c b/guts/getpwnam_r.c index 1a870f2..5d7a4ea 100644 --- a/guts/getpwnam_r.c +++ b/guts/getpwnam_r.c @@ -10,8 +10,10 @@ setpwent(); while ((rc = wrap_getpwent_r(pwbuf, buf, buflen, pwbufp)) == 0) { /* 0 means no error occurred, and *pwbufp == pwbuf */ - if (pwbuf->pw_name && !strcmp(pwbuf->pw_name, name)) + if (pwbuf->pw_name && !strcmp(pwbuf->pw_name, name)) { + endpwent(); return rc; + } } endpwent(); /* we never found a match; rc is 0 if there was no error, or diff --git a/guts/getpwuid_r.c b/guts/getpwuid_r.c index 92996f3..06b920e 100644 --- a/guts/getpwuid_r.c +++ b/guts/getpwuid_r.c @@ -10,8 +10,10 @@ setpwent(); while ((rc = wrap_getpwent_r(pwbuf, buf, buflen, pwbufp)) == 0) { /* 0 means no error occurred, and *pwbufp == pwbuf */ - if (pwbuf->pw_uid == uid) + if (pwbuf->pw_uid == uid) { + endpwent(); return rc; + } } endpwent(); /* we never found a match; rc is 0 if there was no error, or diff --git a/guts/mkdtemp.c b/guts/mkdtemp.c index 54f8759..fb23bc3 100644 --- a/guts/mkdtemp.c +++ b/guts/mkdtemp.c @@ -32,13 +32,14 @@ if (real___xstat64(_STAT_VER, rc, &buf) != -1) { pseudo_client_op(OP_CREAT, 0, -1, -1, tmp_template, &buf); } else { - pseudo_debug(1, "mkstemp (path %s) succeeded, but fstat failed (%s).\n", + pseudo_debug(1, "mkdtemp (path %s) succeeded, but fstat failed (%s).\n", rc, strerror(errno)); } errno = save_errno; } /* mkdtemp only changes the XXXXXX at the end. */ memcpy(template + len - 6, tmp_template + strlen(tmp_template) - 6, 6); + rc = template; free(tmp_template); /* return rc; * } diff --git a/guts/mktemp.c b/guts/mktemp.c index 2d2d927..7cf594a 100644 --- a/guts/mktemp.c +++ b/guts/mktemp.c @@ -28,6 +28,7 @@ * a file -- note the race condition implied here. */ memcpy(template + len - 6, tmp_template + strlen(tmp_template) - 6, 6); + rc = template; free(tmp_template); /* return rc; diff --git a/guts/readlinkat.c b/guts/readlinkat.c index d483ab5..5282e2b 100644 --- a/guts/readlinkat.c +++ b/guts/readlinkat.c @@ -6,7 +6,15 @@ * wrap_readlinkat(int dirfd, const char *path, char *buf, size_t bufsiz) { * ssize_t rc = -1; */ +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS + if (dirfd != AT_FDCWD) { + errno = ENOSYS; + return -1; + } + rc = real_readlink(path, buf, bufsiz); +#else rc = real_readlinkat(dirfd, path, buf, bufsiz); +#endif if (rc > 0) { rc = pseudo_dechroot(buf, rc); |