diff --git a/libnss_mxshadow.c b/libnss_mxshadow.c index b8f2487..6878fb6 100644 --- a/libnss_mxshadow.c +++ b/libnss_mxshadow.c @@ -14,14 +14,6 @@ #include "get_shadow_line.h" #include "common.h" -static long int atol_or_minus1(char *p) { - return *p == '\0' ? -1 : atol(p); -} - -static unsigned long int atoul_or_minus1(char *p) { - return *p == '\0' ? (unsigned long int) -1 : strtoul(p, NULL, 10); -} - enum nss_status _nss_mxshadow_getspnam_r(const char *name, struct spwd *spwd, char *buffer, size_t buflen, int *errnop) { char *line _cleanup_(free_string) = NULL; @@ -31,30 +23,16 @@ enum nss_status _nss_mxshadow_getspnam_r(const char *name, struct spwd *spwd, ch *errnop = errno; return NSS_STATUS_UNAVAIL; } - size_t len = strlen(line); - if (buflen < len+1) { - errno = ERANGE; - *errnop = errno; - return -1; - } - strcpy(buffer, line); - - if (buffer[0] == '\0') { + if (line[0] == '\0') { errno = ENOENT; *errnop = errno; return NSS_STATUS_NOTFOUND; } - - char *p; - - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_namp = p; - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_pwdp = p; - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_lstchg = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_min = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_max = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_warn = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_inact = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_expire = atol_or_minus1(p); - p = strsep(&buffer, ":"); if (p == NULL) return NSS_STATUS_NOTFOUND; spwd->sp_flag = atoul_or_minus1(p); + struct spwd *spbufp; + status = sgetspent_r(line, spwd, buffer, buflen, &spbufp); + if (status == -1) { + *errnop = errno; + return NSS_STATUS_UNAVAIL; + } return NSS_STATUS_SUCCESS; }