From: Todd C. Miller Date: Thu, 6 Jan 2005 03:16:11 +0000 (+0000) Subject: Can't use strtok() since it doesn't handle empty fields so add X-Git-Tag: SUDO_1_7_0~742 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8c4e2770d4e7427645f2c0ca6b70cd3cd877af9;p=sudo Can't use strtok() since it doesn't handle empty fields so add getpwent()/getgrent() functions and call those. --- diff --git a/tsgetgrpw.c b/tsgetgrpw.c index 24e80de37..a4f8428fb 100644 --- a/tsgetgrpw.c +++ b/tsgetgrpw.c @@ -70,12 +70,14 @@ static char *gr_mem[GRMEM_MAX+1]; void my_setgrfile __P((const char *)); void my_setgrent __P((void)); void my_endgrent __P((void)); +struct group *my_getgrent __P((void)); struct group *my_getgrnam __P((const char *)); struct group *my_getgruid __P((gid_t)); void my_setpwfile __P((const char *)); void my_setpwent __P((void)); void my_endpwent __P((void)); +struct passwd *my_getpwent __P((void)); struct passwd *my_getpwnam __P((const char *)); struct passwd *my_getpwuid __P((uid_t)); @@ -108,45 +110,60 @@ my_endpwent() pw_stayopen = 0; } +struct passwd * +my_getpwent() +{ + size_t len; + char buf[LINE_MAX], *cp, *colon; + + if ((colon = fgets(buf, sizeof(buf), pwf)) == NULL) + return(NULL); + + memset(&pwbuf, 0, sizeof(pwbuf)); + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_uid = atoi(cp); + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_gid = atoi(cp); + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_gecos = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + pwbuf.pw_dir = cp; + pwbuf.pw_shell = colon; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + return(&pwbuf); +} + struct passwd * my_getpwnam(name) const char *name; { - struct passwd *pw = NULL; - size_t len, nlen; - char buf[LINE_MAX], *cp; + struct passwd *pw; if (pwf != NULL) rewind(pwf); else if ((pwf = fopen(pwfile, "r")) == NULL) return(NULL); - - memset(&pwbuf, 0, sizeof(pwbuf)); - nlen = strlen(name); - while (fgets(buf, sizeof(buf), pwf)) { - if (strncmp(buf, name, nlen) != 0 || buf[nlen] != ':') - continue; - if ((pwbuf.pw_name = strtok(buf, ":")) == NULL) - continue; - if ((pwbuf.pw_passwd = strtok(NULL, ":")) == NULL) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - pwbuf.pw_uid = atoi(cp); - if ((cp = strtok(NULL, ":")) == NULL) - continue; - pwbuf.pw_gid = atoi(cp); - if ((pwbuf.pw_gecos = strtok(NULL, ":")) == NULL) - continue; - if ((pwbuf.pw_dir = strtok(NULL, ":")) == NULL) - continue; - if ((pwbuf.pw_shell = strtok(NULL, ":")) != NULL) { - len = strlen(pwbuf.pw_shell); - if (pwbuf.pw_shell[len - 1] == '\n') - pwbuf.pw_shell[len - 1] = '\0'; - } - pw = &pwbuf; - break; + while ((pw = my_getpwent()) != NULL) { + if (strcmp(pw->pw_name, name) == 0) + break; } if (!pw_stayopen) { fclose(pwf); @@ -159,40 +176,15 @@ struct passwd * my_getpwuid(uid) uid_t uid; { - struct passwd *pw = NULL; - size_t len; - char buf[LINE_MAX], *cp; + struct passwd *pw; if (pwf != NULL) rewind(pwf); else if ((pwf = fopen(pwfile, "r")) == NULL) return(NULL); - - memset(&pwbuf, 0, sizeof(pwbuf)); - while (fgets(buf, sizeof(buf), pwf)) { - if ((pwbuf.pw_name = strtok(buf, ":")) == NULL) - continue; - if ((pwbuf.pw_passwd = strtok(NULL, ":")) == NULL) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - pwbuf.pw_uid = atoi(cp); - if (pwbuf.pw_uid != uid) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - pwbuf.pw_gid = atoi(cp); - if ((pwbuf.pw_gecos = strtok(NULL, ":")) == NULL) - continue; - if ((pwbuf.pw_dir = strtok(NULL, ":")) == NULL) - continue; - if ((pwbuf.pw_shell = strtok(NULL, ":")) != NULL) { - len = strlen(pwbuf.pw_shell); - if (pwbuf.pw_shell[len - 1] == '\n') - pwbuf.pw_shell[len - 1] = '\0'; - } - pw = &pwbuf; - break; + while ((pw = my_getpwent()) != NULL) { + if (pw->pw_uid == uid) + break; } if (!pw_stayopen) { fclose(pwf); @@ -230,50 +222,58 @@ my_endgrent() gr_stayopen = 0; } +struct group * +my_getgrent() +{ + size_t len; + char buf[LINE_MAX], *cp, *colon; + int n; + + if ((colon = fgets(buf, sizeof(buf), grf)) == NULL) + return(NULL); + + memset(&grbuf, 0, sizeof(grbuf)); + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + grbuf.gr_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + grbuf.gr_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + return(NULL); + *colon++ = '\0'; + grbuf.gr_gid = atoi(cp); + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + if (*colon != '\0') { + grbuf.gr_mem = gr_mem; + cp = strtok(colon, ","); + for (n = 0; cp != NULL && n < GRMEM_MAX; n++) { + grbuf.gr_mem[n] = cp; + cp = strtok(NULL, ","); + } + grbuf.gr_mem[n++] = NULL; + } else + grbuf.gr_mem = NULL; + return(&grbuf); +} + struct group * my_getgrnam(name) const char *name; { - struct group *gr = NULL; - size_t len, nlen; - char buf[LINE_MAX], *cp, *m; - int n; + struct group *gr; if (grf != NULL) rewind(grf); else if ((grf = fopen(grfile, "r")) == NULL) return(NULL); - - nlen = strlen(name); - memset(&grbuf, 0, sizeof(grbuf)); - while (fgets(buf, sizeof(buf), grf)) { - if (strncmp(buf, name, nlen) != 0 || buf[nlen] != ':') - continue; - if ((grbuf.gr_name = strtok(buf, ":")) == NULL) - continue; - if ((grbuf.gr_passwd = strtok(NULL, ":")) == NULL) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - grbuf.gr_gid = atoi(cp); - if ((cp = strtok(NULL, ":")) == NULL) - continue; - len = strlen(cp); - if (cp[len - 1] == '\n') - cp[len - 1] = '\0'; - /* Fill in group members */ - if (*cp != '\0') { - grbuf.gr_mem = gr_mem; - m = strtok(cp, ","); - for (n = 0; m != NULL && n < GRMEM_MAX; n++) { - grbuf.gr_mem[n++] = m; - m = strtok(NULL, ","); - } - grbuf.gr_mem[n++] = NULL; - } else - grbuf.gr_mem = NULL; - gr = &grbuf; - break; + while ((gr = my_getgrent()) != NULL) { + if (strcmp(gr->gr_name, name) == 0) + break; } if (!gr_stayopen) { fclose(grf); @@ -286,45 +286,15 @@ struct group * my_getgrgid(gid) gid_t gid; { - struct group *gr = NULL; - size_t len; - char buf[LINE_MAX], *cp, *m; - int n; + struct group *gr; if (grf != NULL) rewind(grf); else if ((grf = fopen(grfile, "r")) == NULL) return(NULL); - - memset(&grbuf, 0, sizeof(grbuf)); - while (fgets(buf, sizeof(buf), grf)) { - if ((grbuf.gr_name = strtok(buf, ":")) == NULL) - continue; - if ((grbuf.gr_passwd = strtok(NULL, ":")) == NULL) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - grbuf.gr_gid = atoi(cp); - if (grbuf.gr_gid != gid) - continue; - if ((cp = strtok(NULL, ":")) == NULL) - continue; - len = strlen(cp); - if (cp[len - 1] == '\n') - cp[len - 1] = '\0'; - /* Fill in group members */ - if (*cp != '\0') { - grbuf.gr_mem = gr_mem; - m = strtok(cp, ","); - for (n = 0; m != NULL && n < GRMEM_MAX; n++) { - grbuf.gr_mem[n++] = m; - m = strtok(NULL, ","); - } - grbuf.gr_mem[n++] = NULL; - } else - grbuf.gr_mem = NULL; - gr = &grbuf; - break; + while ((gr = my_getgrent()) != NULL) { + if (gr->gr_gid == gid) + break; } if (!gr_stayopen) { fclose(grf);