From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/4274 Path: news.gmane.org!not-for-mail From: Michael Forney Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH v2 1/2] shadow: Move spent parsing to internal function Date: Sat, 23 Nov 2013 22:17:42 -0800 Message-ID: <1385273862-29988-1-git-send-email-mforney@mforney.org> References: <1385003621-10289-2-git-send-email-mforney@mforney.org> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1385274007 2630 80.91.229.3 (24 Nov 2013 06:20:07 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 24 Nov 2013 06:20:07 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-4278-gllmg-musl=m.gmane.org@lists.openwall.com Sun Nov 24 07:20:13 2013 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1VkT3E-0000FL-90 for gllmg-musl@plane.gmane.org; Sun, 24 Nov 2013 07:20:12 +0100 Original-Received: (qmail 26035 invoked by uid 550); 24 Nov 2013 06:20:11 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 26024 invoked from network); 24 Nov 2013 06:20:11 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=mVZzHMKyaGLInyZ2LDaF1tFm9mIg8dFr0hAPzOanRBM=; b=kU6y/YwGhDKTGYIKdVFJK5p6S58HDQNaULDGN9+E7sw3Zz+U4FU9+hObwvG23wJEQm tK4ccOg6DBZ2NWY2h5/oy/8eEAx3pPBNTUPs8HWz5QKJSYN4FR3mKd+ztMu3y0BbOENJ wFshO/oFZaRb5cnPoPyTNHY83Xhaa2rk83/dSWmZreM3NRs4eCdajr5BwVzscV5XGtkR GBXKLe0+99TIpbFlmZOaYnmeCNge0DRVRlXh9+xPf1dzGGOQ4SVjLp7jOBR++xEOCWMo eHeKhn1YzFGjyszeoriEBusWt3SyOhjINVGTre42itE+jo/Qn3nwCBzIWKRUcG3dlg39 tMbg== X-Gm-Message-State: ALoCoQkWOKLlAuq97AJHjRzRZJI0eJ0ViRn1SPUs30+IZ26st1hKv7ifHi0JINy+CgbMvhHnb2rx X-Received: by 10.66.14.9 with SMTP id l9mr21058395pac.57.1385273998409; Sat, 23 Nov 2013 22:19:58 -0800 (PST) X-Mailer: git-send-email 1.8.4.2 In-Reply-To: <1385003621-10289-2-git-send-email-mforney@mforney.org> Xref: news.gmane.org gmane.linux.lib.musl.general:4274 Archived-At: --- src/passwd/getspnam_r.c | 69 ++++++++++++++++++++++++++++--------------------- src/passwd/pwf.h | 2 +- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/passwd/getspnam_r.c b/src/passwd/getspnam_r.c index f4d7b35..15f8c87 100644 --- a/src/passwd/getspnam_r.c +++ b/src/passwd/getspnam_r.c @@ -12,9 +12,45 @@ * file. It also avoids any allocation to prevent memory-exhaustion * attacks via huge TCB shadow files. */ -static long xatol(const char *s) +static long xatol(char **s) { - return isdigit(*s) ? atol(s) : -1; + long x; + if (**s == ':' || **s == '\n') return -1; + for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0'); + return x; +} + +int __parsespent(char *s, struct spwd *sp) +{ + sp->sp_namp = s; + if (!(s = strchr(s, ':'))) return -1; + *s = 0; + + sp->sp_pwdp = ++s; + if (!(s = strchr(s, ':'))) return -1; + *s = 0; + + s++; sp->sp_lstchg = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_min = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_max = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_warn = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_inact = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_expire = xatol(&s); + if (*s != ':') return -1; + + s++; sp->sp_flag = xatol(&s); + if (*s != '\n') return -1; + return 0; } static void cleanup(void *p) @@ -29,7 +65,6 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct int rv = 0; int fd; size_t k, l = strlen(name); - char *s; int skip = 0; int cs; @@ -71,34 +106,8 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct rv = ERANGE; break; } - buf[k-1] = 0; - - s = buf; - sp->sp_namp = s; - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_pwdp = s; - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_lstchg = xatol(s); - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_min = xatol(s); - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_max = xatol(s); - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_warn = xatol(s); - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_inact = xatol(s); - if (!(s = strchr(s, ':'))) continue; - - *s++ = 0; sp->sp_expire = xatol(s); - if (!(s = strchr(s, ':'))) continue; - *s++ = 0; sp->sp_flag = xatol(s); + if (__parsespent(buf, sp) < 0) continue; *res = sp; break; } diff --git a/src/passwd/pwf.h b/src/passwd/pwf.h index 0a76ef8..2d813ad 100644 --- a/src/passwd/pwf.h +++ b/src/passwd/pwf.h @@ -9,5 +9,5 @@ #include "libc.h" struct passwd *__getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size); -struct spwd *__getspent_a(FILE *f, struct spwd *sp, char **line, size_t *size); struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem); +int __parsespent(char *s, struct spwd *sp); -- 1.8.4.2