X-Git-Url: https://ruderich.org/simon/gitweb/?p=nsscash%2Fnsscash.git;a=blobdiff_plain;f=nss%2Fpw.c;h=c772bb10133e2d7c29feb4565f6327739cb2497e;hp=d2c1bfa4acd793b12e5cbdf084de22ddefe6ed33;hb=67fb8cb9a157931c94bb420f25c36d55c2876d02;hpb=4e4725f0f28f60af004efb6e481008715ef5a673 diff --git a/nss/pw.c b/nss/pw.c index d2c1bfa..c772bb1 100644 --- a/nss/pw.c +++ b/nss/pw.c @@ -25,12 +25,13 @@ #include -#include "cash.h" #include "cash_nss.h" #include "file.h" #include "search.h" +// NOTE: This file is very similar to gr.c, keep in sync! + struct passwd_entry { uint64_t uid; uint64_t gid; @@ -47,7 +48,7 @@ struct passwd_entry { * concatenated, with their trailing NUL. The off_* variables point to * beginning of each string. */ - char data[]; + const char data[]; } __attribute__((packed)); static bool entry_to_passwd(const struct passwd_entry *e, struct passwd *p, char *tmp, size_t space) { @@ -139,9 +140,9 @@ static enum nss_status internal_getpw(struct search_key *key, struct passwd *res const struct header *h = f.header; key->data = h->data + h->off_data; - uint64_t off_index = (key->id != NULL) - ? h->off_id_index - : h->off_name_index; + uint64_t off_index = (key->name != NULL) + ? h->off_name_index + : h->off_id_index; uint64_t *off = search(key, h->data + off_index, h->count); if (off == NULL) { unmap_file(&f); @@ -150,7 +151,7 @@ static enum nss_status internal_getpw(struct search_key *key, struct passwd *res return NSS_STATUS_NOTFOUND; } - const char *e = h->data + h->off_data + *off; + const char *e = key->data + *off; if (!entry_to_passwd((struct passwd_entry *)e, result, buffer, buflen)) { unmap_file(&f); errno = ERANGE;