Use strtoul() not atoi().

This commit is contained in:
Todd C. Miller
2013-01-23 06:21:45 -05:00
parent 0fdb89e3b3
commit c00c968010

View File

@@ -42,6 +42,7 @@
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@@ -55,6 +56,14 @@
#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;
@@ -114,7 +123,8 @@ getpwent(void)
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)
@@ -132,11 +142,21 @@ next_entry:
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';
@@ -235,7 +255,8 @@ getgrent(void)
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:
@@ -254,7 +275,12 @@ 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';