aboutsummaryrefslogtreecommitdiffstats
path: root/guts
diff options
context:
space:
mode:
Diffstat (limited to 'guts')
-rw-r--r--guts/README2
-rw-r--r--guts/getgrent_r.c8
-rw-r--r--guts/getgrgid_r.c1
-rw-r--r--guts/getgrnam_r.c4
-rw-r--r--guts/getpwent_r.c4
-rw-r--r--guts/getpwnam_r.c4
-rw-r--r--guts/getpwuid_r.c4
-rw-r--r--guts/mkdtemp.c3
-rw-r--r--guts/mktemp.c1
-rw-r--r--guts/readlinkat.c8
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);