Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/gen/getpwent.c
Show First 20 Lines • Show All 732 Lines • ▼ Show 20 Lines | pwdbopen(int *version) | ||||
key.data = _PWD_VERSION_KEY; | key.data = _PWD_VERSION_KEY; | ||||
key.size = strlen(_PWD_VERSION_KEY); | key.size = strlen(_PWD_VERSION_KEY); | ||||
rv = res->get(res, &key, &entry, 0); | rv = res->get(res, &key, &entry, 0); | ||||
if (rv == 0) | if (rv == 0) | ||||
*version = *(unsigned char *)entry.data; | *version = *(unsigned char *)entry.data; | ||||
else | else | ||||
*version = 3; | *version = 3; | ||||
if (*version < 3 || | if (*version < 3 || | ||||
*version >= nitems(pwdb_versions)) { | (size_t)*version >= nitems(pwdb_versions)) { | ||||
syslog(LOG_CRIT, "Unsupported password database version %d", | syslog(LOG_CRIT, "Unsupported password database version %d", | ||||
*version); | *version); | ||||
res->close(res); | res->close(res); | ||||
res = NULL; | res = NULL; | ||||
} | } | ||||
return (res); | return (res); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 466 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
nis_map(char *domain, enum nss_lookup_type how, char *buffer, size_t bufsize, | nis_map(char *domain, enum nss_lookup_type how, char *buffer, size_t bufsize, | ||||
int *master) | int *master) | ||||
{ | { | ||||
int rv, order; | int rv, order; | ||||
*master = 0; | *master = 0; | ||||
if (geteuid() == 0) { | if (geteuid() == 0) { | ||||
if (snprintf(buffer, bufsize, "master.passwd.by%s", | if ((size_t)snprintf(buffer, bufsize, "master.passwd.by%s", | ||||
(how == nss_lt_id) ? "uid" : "name") >= bufsize) | (how == nss_lt_id) ? "uid" : "name") >= bufsize) | ||||
return (NS_UNAVAIL); | return (NS_UNAVAIL); | ||||
rv = yp_order(domain, buffer, &order); | rv = yp_order(domain, buffer, &order); | ||||
if (rv == 0) { | if (rv == 0) { | ||||
*master = 1; | *master = 1; | ||||
return (NS_SUCCESS); | return (NS_SUCCESS); | ||||
} | } | ||||
} | } | ||||
if (snprintf(buffer, bufsize, "passwd.by%s", | if ((size_t)snprintf(buffer, bufsize, "passwd.by%s", | ||||
(how == nss_lt_id) ? "uid" : "name") >= bufsize) | (how == nss_lt_id) ? "uid" : "name") >= bufsize) | ||||
return (NS_UNAVAIL); | return (NS_UNAVAIL); | ||||
return (NS_SUCCESS); | return (NS_SUCCESS); | ||||
} | } | ||||
static int | static int | ||||
nis_adjunct(char *domain, const char *name, char *buffer, size_t bufsize) | nis_adjunct(char *domain, const char *name, char *buffer, size_t bufsize) | ||||
{ | { | ||||
int rv; | int rv; | ||||
char *result, *p, *q, *eor; | char *result, *p, *q, *eor; | ||||
int resultlen; | int resultlen; | ||||
result = NULL; | result = NULL; | ||||
rv = yp_match(domain, "passwd.adjunct.byname", name, strlen(name), | rv = yp_match(domain, "passwd.adjunct.byname", name, strlen(name), | ||||
&result, &resultlen); | &result, &resultlen); | ||||
if (rv != 0) | if (rv != 0) | ||||
rv = 1; | rv = 1; | ||||
else { | else { | ||||
eor = &result[resultlen]; | eor = &result[resultlen]; | ||||
p = memchr(result, ':', eor - result); | p = memchr(result, ':', eor - result); | ||||
if (p != NULL && ++p < eor && | if (p != NULL && ++p < eor && | ||||
(q = memchr(p, ':', eor - p)) != NULL) { | (q = memchr(p, ':', eor - p)) != NULL) { | ||||
if (q - p >= bufsize) | if ((size_t)(q - p) >= bufsize) | ||||
rv = -1; | rv = -1; | ||||
else { | else { | ||||
memcpy(buffer, p, q - p); | memcpy(buffer, p, q - p); | ||||
buffer[q - p] ='\0'; | buffer[q - p] ='\0'; | ||||
} | } | ||||
} else | } else | ||||
rv = 1; | rv = 1; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | nis_passwd(void *retval, void *mdata, va_list ap) | ||||
do { | do { | ||||
rv = NS_NOTFOUND; | rv = NS_NOTFOUND; | ||||
switch (how) { | switch (how) { | ||||
case nss_lt_name: | case nss_lt_name: | ||||
if (strlcpy(buffer, name, bufsize) >= bufsize) | if (strlcpy(buffer, name, bufsize) >= bufsize) | ||||
goto erange; | goto erange; | ||||
break; | break; | ||||
case nss_lt_id: | case nss_lt_id: | ||||
if (snprintf(buffer, bufsize, "%lu", | if ((size_t)snprintf(buffer, bufsize, "%lu", | ||||
(unsigned long)uid) >= bufsize) | (unsigned long)uid) >= bufsize) | ||||
goto erange; | goto erange; | ||||
break; | break; | ||||
case nss_lt_all: | case nss_lt_all: | ||||
if (st->done) | if (st->done) | ||||
goto fin; | goto fin; | ||||
break; | break; | ||||
} | } | ||||
Show All 28 Lines | if (how == nss_lt_all) { | ||||
rv = NS_NOTFOUND; | rv = NS_NOTFOUND; | ||||
continue; | continue; | ||||
} else if (rv != 0) { | } else if (rv != 0) { | ||||
free(result); | free(result); | ||||
rv = NS_UNAVAIL; | rv = NS_UNAVAIL; | ||||
continue; | continue; | ||||
} | } | ||||
} | } | ||||
if (resultlen >= bufsize) { | if ((size_t)resultlen >= bufsize) { | ||||
free(result); | free(result); | ||||
goto erange; | goto erange; | ||||
} | } | ||||
memcpy(buffer, result, resultlen); | memcpy(buffer, result, resultlen); | ||||
buffer[resultlen] = '\0'; | buffer[resultlen] = '\0'; | ||||
free(result); | free(result); | ||||
rv = __pw_match_entry(buffer, resultlen, how, name, uid); | rv = __pw_match_entry(buffer, resultlen, how, name, uid); | ||||
if (rv == NS_SUCCESS) | if (rv == NS_SUCCESS) | ||||
▲ Show 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | #undef COPY | ||||
p = buffer; | p = buffer; | ||||
eob = &buffer[bufsize]; | eob = &buffer[bufsize]; | ||||
#define COPY(field, flag) do { \ | #define COPY(field, flag) do { \ | ||||
q = (template->pw_fields & flag) ? template->field : hold.field; \ | q = (template->pw_fields & flag) ? template->field : hold.field; \ | ||||
if (q == NULL) \ | if (q == NULL) \ | ||||
pwd->field = NULL; \ | pwd->field = NULL; \ | ||||
else { \ | else { \ | ||||
pwd->field = p; \ | pwd->field = p; \ | ||||
if ((n = strlcpy(p, q, eob-p)) >= eob-p) { \ | if ((long)(n = strlcpy(p, q, eob-p)) >= eob-p) { \ | ||||
free(copy); \ | free(copy); \ | ||||
return (ERANGE); \ | return (ERANGE); \ | ||||
} \ | } \ | ||||
p += n + 1; \ | p += n + 1; \ | ||||
} \ | } \ | ||||
} while (0) | } while (0) | ||||
COPY(pw_name, 0); | COPY(pw_name, 0); | ||||
#ifdef PW_OVERRIDE_PASSWD | #ifdef PW_OVERRIDE_PASSWD | ||||
▲ Show 20 Lines • Show All 442 Lines • ▼ Show 20 Lines | for (p = entry; p < eom; p++) | ||||
if (*p == ':') | if (*p == ':') | ||||
break; | break; | ||||
if (*p != ':') | if (*p != ':') | ||||
return (NS_NOTFOUND); | return (NS_NOTFOUND); | ||||
if (how == nss_lt_all) | if (how == nss_lt_all) | ||||
return (NS_SUCCESS); | return (NS_SUCCESS); | ||||
if (how == nss_lt_name) { | if (how == nss_lt_name) { | ||||
len = strlen(name); | len = strlen(name); | ||||
if (len == (p - entry) && memcmp(name, entry, len) == 0) | if (len == (size_t)(p - entry) && memcmp(name, entry, len) == 0) | ||||
return (NS_SUCCESS); | return (NS_SUCCESS); | ||||
else | else | ||||
return (NS_NOTFOUND); | return (NS_NOTFOUND); | ||||
} | } | ||||
for (p++; p < eom; p++) | for (p++; p < eom; p++) | ||||
if (*p == ':') | if (*p == ':') | ||||
break; | break; | ||||
if (*p != ':') | if (*p != ':') | ||||
Show All 20 Lines |