Browse Source

getpwent(), getpwent_r(), and getgrent(), getgrent_r() would all
fail if you had not previously called setpwent() or setgrent()
respectively. Oops. My bad.
-Erik

Eric Andersen 21 years ago
parent
commit
fff9c70e33
3 changed files with 8 additions and 1 deletions
  1. 3 0
      libc/pwd_grp/__getgrent_r.c
  2. 3 0
      libc/pwd_grp/__getpwent_r.c
  3. 2 1
      libc/pwd_grp/pwent.c

+ 3 - 0
libc/pwd_grp/__getgrent_r.c

@@ -44,6 +44,9 @@ int __getgrent_r (struct group *__restrict group,
 		return ERANGE;
 	}
 
+	if (grp_fd==-1)
+		setgrent();
+
 	/* We use the restart label to handle malformatted lines */
 restart:
 	/* Read the group line into the buffer for processing */

+ 3 - 0
libc/pwd_grp/__getpwent_r.c

@@ -47,6 +47,9 @@ int __getpwent_r(struct passwd * passwd, char * line_buff, size_t buflen, int pw
 		return ERANGE;
 	}
 
+	if (pw_fd == -1)
+		setpwent();
+
 	/* We use the restart label to handle malformatted lines */
 restart:
 	/* Read the passwd line into the buffer for processing */

+ 2 - 1
libc/pwd_grp/pwent.c

@@ -72,7 +72,8 @@ int getpwent_r (struct passwd *password, char *buff,
 	int ret=EINVAL;
 	LOCK;
 	*result = NULL;
-	if (pw_fd != -1 && (ret=__getpwent_r(password, buff, buflen, pw_fd)) == 0) {
+
+	if ((ret=__getpwent_r(password, buff, buflen, pw_fd)) == 0) {
 		UNLOCK;
 		*result = password;
 		return 0;