]> ruderich.org/simon Gitweb - nsscash/nsscash.git/blobdiff - nss/gr.c
nss: remove pointer indirection in search_key's id member
[nsscash/nsscash.git] / nss / gr.c
index c49ef4799be15db6e4996b4c01042eb5965d8a75..544cc9d911ade8cbb85ca9b4f673ce1419f58677 100644 (file)
--- a/nss/gr.c
+++ b/nss/gr.c
@@ -25,7 +25,6 @@
 
 #include <pthread.h>
 
-#include "cash.h"
 #include "cash_nss.h"
 #include "file.h"
 #include "search.h"
 
 // NOTE: This file is very similar to pw.c, keep in sync!
 
+// TODO: adapt offsets to 32 bit to fit more than 5000 users per group (for 9
+// byte user names)
 struct group_entry {
     uint64_t gid;
 
-    //       off_name = 0
+    //       off_name = 0, not stored on disk
     uint16_t off_passwd;
     uint16_t off_mem_off;
 
@@ -52,11 +53,12 @@ struct group_entry {
      *
      * All offsets are relative to the beginning of data.
      */
-    uint16_t data_size;
-    char data[];
+    uint16_t data_size; // size of data in bytes
+    const char data[];
 } __attribute__((packed));
 
 static bool entry_to_group(const struct group_entry *e, struct group *g, char *tmp, size_t space) {
+    // Space required for the gr_mem array
     const size_t mem_size = (size_t)(e->mem_count + 1) * sizeof(char *);
 
     if (space < e->data_size + mem_size) {
@@ -89,24 +91,23 @@ static struct file static_file = {
 };
 static pthread_mutex_t static_file_lock = PTHREAD_MUTEX_INITIALIZER;
 
-enum nss_status _nss_cash_setgrent(int x) {
-    (void)x;
-
+static void internal_unmap_static_file(void) {
     pthread_mutex_lock(&static_file_lock);
-    // Unmap is necessary to detect changes when the file was replaced on
-    // disk
     unmap_file(&static_file);
-    // getgrent_r will open the file if necessary when called
     pthread_mutex_unlock(&static_file_lock);
+}
 
+enum nss_status _nss_cash_setgrent(int x) {
+    (void)x;
+
+    // Unmap is necessary to detect changes when the file was replaced on
+    // disk; getgrent_r will open the file if necessary when called
+    internal_unmap_static_file();
     return NSS_STATUS_SUCCESS;
 }
 
 enum nss_status _nss_cash_endgrent(void) {
-    pthread_mutex_lock(&static_file_lock);
-    unmap_file(&static_file);
-    pthread_mutex_unlock(&static_file_lock);
-
+    internal_unmap_static_file();
     return NSS_STATUS_SUCCESS;
 }
 
@@ -155,9 +156,9 @@ static enum nss_status internal_getgr(struct search_key *key, struct group *resu
     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);
@@ -166,7 +167,7 @@ static enum nss_status internal_getgr(struct search_key *key, struct group *resu
         return NSS_STATUS_NOTFOUND;
     }
 
-    const char *e = h->data + h->off_data + *off;
+    const char *e = key->data + *off;
     if (!entry_to_group((struct group_entry *)e, result, buffer, buflen)) {
         unmap_file(&f);
         errno = ERANGE;
@@ -179,9 +180,8 @@ static enum nss_status internal_getgr(struct search_key *key, struct group *resu
 }
 
 enum nss_status _nss_cash_getgrgid_r(gid_t gid, struct group *result, char *buffer, size_t buflen, int *errnop) {
-    uint64_t id = (uint64_t)gid;
     struct search_key key = {
-        .id = &id,
+        .id = (uint64_t)gid,
         .offset = offsetof(struct group_entry, gid),
     };
     return internal_getgr(&key, result, buffer, buflen, errnop);