X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=nss%2Fpw.c;h=e95ec38c0b07db3b787be4302f027392a7c09c38;hb=5a6b8152cf4c9fcd71b875ff5dce1ec0fad9c9d4;hp=4313ee376cfa2e008756a776c4ff0aa4802bbf41;hpb=c6363eab83ca507ee1a566b5b98eefad61fbe8b3;p=nsscash%2Fnsscash.git diff --git a/nss/pw.c b/nss/pw.c index 4313ee3..e95ec38 100644 --- a/nss/pw.c +++ b/nss/pw.c @@ -36,18 +36,18 @@ struct passwd_entry { uint64_t uid; uint64_t gid; - // off_name = 0 + // off_name = 0, not stored on disk uint16_t off_passwd; uint16_t off_gecos; uint16_t off_dir; uint16_t off_shell; - uint16_t data_size; /* * Data contains all strings (name, passwd, gecos, dir, shell) * concatenated, with their trailing NUL. The off_* variables point to * beginning of each string. */ + uint16_t data_size; // size of data in bytes const char data[]; } __attribute__((packed)); @@ -140,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); @@ -151,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;