#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
+#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#undef GRMEM_MAX
#define GRMEM_MAX 200
+#ifndef UID_MAX
+# define UID_MAX 0xffffffffU
+#endif
+
+#ifndef GID_MAX
+# define GID_MAX UID_MAX
+#endif
+
static FILE *pwf;
static const char *pwfile = "/etc/passwd";
static int pw_stayopen;
static struct passwd pw;
static char pwbuf[LINE_MAX];
size_t len;
- char *cp, *colon;
+ unsigned long id;
+ char *cp, *colon, *ep;
next_entry:
if ((colon = fgets(pwbuf, sizeof(pwbuf), pwf)) == NULL)
if ((colon = strchr(cp = colon, ':')) == NULL)
goto next_entry;
*colon++ = '\0';
- pw.pw_uid = atoi(cp);
+ id = strtoul(cp, &ep, 10);
+ if (*cp == '\0' || *ep != '\0')
+ goto next_entry;
+ if (id > UID_MAX || (id == ULONG_MAX && errno == ERANGE))
+ goto next_entry;
+ pw.pw_uid = (uid_t)id;
if ((colon = strchr(cp = colon, ':')) == NULL)
goto next_entry;
*colon++ = '\0';
- pw.pw_gid = atoi(cp);
+ id = strtoul(cp, &ep, 10);
+ if (*cp == '\0' || *ep != '\0')
+ goto next_entry;
+ if (id > GID_MAX || (id == ULONG_MAX && errno == ERANGE))
+ goto next_entry;
+ pw.pw_gid = (gid_t)id;
if ((colon = strchr(cp = colon, ':')) == NULL)
goto next_entry;
*colon++ = '\0';
static struct group gr;
static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1];
size_t len;
- char *cp, *colon;
+ unsigned long id;
+ char *cp, *colon, *ep;
int n;
next_entry:
if ((colon = strchr(cp = colon, ':')) == NULL)
goto next_entry;
*colon++ = '\0';
- gr.gr_gid = atoi(cp);
+ id = strtoul(cp, &ep, 10);
+ if (*cp == '\0' || *ep != '\0')
+ goto next_entry;
+ if (id > GID_MAX || (id == ULONG_MAX && errno == ERANGE))
+ goto next_entry;
+ gr.gr_gid = (gid_t)id;
len = strlen(colon);
if (len > 0 && colon[len - 1] == '\n')
colon[len - 1] = '\0';