]> git.seodisparate.com - SimpleArchiver/commitdiff
Impl UID/GID remap on v3 archive
authorStephen Seo <seo.disparate@gmail.com>
Wed, 8 Jan 2025 06:43:32 +0000 (15:43 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 8 Jan 2025 06:43:32 +0000 (15:43 +0900)
TODO: Impl UID/GID remap on extract.

src/archiver.c
src/parser.c
src/parser.h
src/test.c

index bfdd4afb6a80bb68f3602ada8cb4dd296eefda30..f4170f77de94860e357fe126a65640e7b938e82e 100644 (file)
@@ -1922,6 +1922,19 @@ int internal_write_dir_entries(void *data, void *ud) {
   uint32_t u32 = stat_buf.st_uid;
   if (state->parsed->flags & 0x400) {
     u32 = state->parsed->uid;
+  } else {
+    uint32_t mapped_uid;
+    if (simple_archiver_get_uid_mapping(state->parsed->mappings,
+                                        state->parsed->users_infos,
+                                        u32,
+                                        &mapped_uid,
+                                        NULL) == 0) {
+      //fprintf(stderr,
+      //        "NOTICE: Mapped UID %" PRIu32 " to %" PRIu32 "\n",
+      //        u32,
+      //        mapped_uid);
+      u32 = mapped_uid;
+    }
   }
 
   simple_archiver_helper_32_bit_be(&u32);
@@ -1933,6 +1946,19 @@ int internal_write_dir_entries(void *data, void *ud) {
   u32 = stat_buf.st_gid;
   if (state->parsed->flags & 0x800) {
     u32 = state->parsed->gid;
+  } else {
+    uint32_t mapped_gid;
+    if (simple_archiver_get_gid_mapping(state->parsed->mappings,
+                                        state->parsed->users_infos,
+                                        u32,
+                                        &mapped_gid,
+                                        NULL) == 0) {
+      //fprintf(stderr,
+      //        "NOTICE: Mapped GID %" PRIu32 " to %" PRIu32 "\n",
+      //        u32,
+      //        mapped_gid);
+      u32 = mapped_gid;
+    }
   }
   simple_archiver_helper_32_bit_be(&u32);
   if (fwrite(&u32, 4, 1, out_f) != 1) {
@@ -1945,9 +1971,28 @@ int internal_write_dir_entries(void *data, void *ud) {
     if (state->parsed->flags & 0x400) {
       u32 = state->parsed->uid;
     }
+    __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+    char *to_cleanup_user = NULL;
     const char *username = simple_archiver_hash_map_get(
       state->parsed->users_infos.UidToUname, &u32, sizeof(uint32_t));
     if (username) {
+      if ((state->parsed->flags & 0x400) == 0) {
+        uint32_t out_uid;
+        const char *mapped_user = NULL;
+        if (simple_archiver_get_user_mapping(state->parsed->mappings,
+                                             state->parsed->users_infos,
+                                             username,
+                                             &out_uid,
+                                             &mapped_user) == 0
+            && mapped_user) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped User %s to %s\n",
+          //        username,
+          //        mapped_user);
+          username = mapped_user;
+          to_cleanup_user = (char *)mapped_user;
+        }
+      }
       unsigned long length = strlen(username);
       if (length > 0xFFFF) {
         fprintf(stderr, "ERROR: Username is too long for dir \"%s\"!\n", dir);
@@ -1979,9 +2024,28 @@ int internal_write_dir_entries(void *data, void *ud) {
     if (state->parsed->flags & 0x800) {
       u32 = state->parsed->gid;
     }
+    __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+    char *to_cleanup_group = NULL;
     const char *groupname = simple_archiver_hash_map_get(
       state->parsed->users_infos.GidToGname, &u32, sizeof(uint32_t));
     if (groupname) {
+      if ((state->parsed->flags & 0x800) == 0) {
+        uint32_t out_gid;
+        const char *mapped_group = NULL;
+        if (simple_archiver_get_group_mapping(state->parsed->mappings,
+                                              state->parsed->users_infos,
+                                              groupname,
+                                              &out_gid,
+                                              &mapped_group) == 0
+            && mapped_group) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped Group %s to %s\n",
+          //        groupname,
+          //        mapped_group);
+          groupname = mapped_group;
+          to_cleanup_group = (char *)mapped_group;
+        }
+      }
       unsigned long length = strlen(groupname);
       if (length > 0xFFFF) {
         fprintf(stderr, "ERROR: Groupname is too long for dir \"%s\"!\n", dir);
@@ -4417,6 +4481,20 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       u32 = stat_buf.st_uid;
       if (state->parsed->flags & 0x400) {
         u32 = state->parsed->uid;
+      } else {
+        uint32_t mapped_uid;
+        if (simple_archiver_get_uid_mapping(state->parsed->mappings,
+                                            state->parsed->users_infos,
+                                            u32,
+                                            &mapped_uid,
+                                            NULL) == 0) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped UID %" PRIu32 " to %" PRIu32" for %s\n",
+          //        u32,
+          //        mapped_uid,
+          //        (const char *)node->data);
+          u32 = mapped_uid;
+        }
       }
       simple_archiver_helper_32_bit_be(&u32);
       if (fwrite(&u32, 4, 1, out_f) != 1) {
@@ -4426,6 +4504,20 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       u32 = stat_buf.st_gid;
       if (state->parsed->flags & 0x800) {
         u32 = state->parsed->gid;
+      } else {
+        uint32_t mapped_gid;
+        if (simple_archiver_get_gid_mapping(state->parsed->mappings,
+                                            state->parsed->users_infos,
+                                            u32,
+                                            &mapped_gid,
+                                            NULL) == 0) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped GID %" PRIu32 " to %" PRIu32 " for %s\n",
+          //        u32,
+          //        mapped_gid,
+          //        (const char *)node->data);
+          u32 = mapped_gid;
+        }
       }
       simple_archiver_helper_32_bit_be(&u32);
       if (fwrite(&u32, 4, 1, out_f) != 1) {
@@ -4436,11 +4528,31 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       if (state->parsed->flags & 0x400) {
         u32 = state->parsed->uid;
       }
-      char *username = simple_archiver_hash_map_get(
+      __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+      char *to_cleanup_user = NULL;
+      const char *username = simple_archiver_hash_map_get(
         state->parsed->users_infos.UidToUname,
         &u32,
         sizeof(uint32_t));
       if (username) {
+        if ((state->parsed->flags & 0x400) == 0) {
+          uint32_t out_uid;
+          const char *mapped_user = NULL;
+          if (simple_archiver_get_user_mapping(state->parsed->mappings,
+                                               state->parsed->users_infos,
+                                               username,
+                                               &out_uid,
+                                               &mapped_user) == 0
+              && mapped_user) {
+            //fprintf(stderr,
+            //        "NOTICE: Mapped User %s to %s for %s\n",
+            //        username,
+            //        mapped_user,
+            //        (const char *)node->data);
+            username = mapped_user;
+            to_cleanup_user = (char *)mapped_user;
+          }
+        }
         unsigned long name_length = strlen(username);
         if (name_length > 0xFFFF) {
           return SDAS_INTERNAL_ERROR;
@@ -4465,11 +4577,31 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       if (state->parsed->flags & 0x800) {
         u32 = state->parsed->gid;
       }
-      char *groupname = simple_archiver_hash_map_get(
+      __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+      char *to_cleanup_group = NULL;
+      const char *groupname = simple_archiver_hash_map_get(
         state->parsed->users_infos.GidToGname,
         &u32,
         sizeof(uint32_t));
       if (groupname) {
+        if ((state->parsed->flags & 0x800) == 0) {
+          uint32_t out_gid;
+          const char *mapped_group = NULL;
+          if (simple_archiver_get_group_mapping(state->parsed->mappings,
+                                                state->parsed->users_infos,
+                                                groupname,
+                                                &out_gid,
+                                                &mapped_group) == 0
+              && mapped_group) {
+            //fprintf(stderr,
+            //        "NOTICE: Mapped Group %s to %s for %s\n",
+            //        groupname,
+            //        mapped_group,
+            //        (const char *)node->data);
+            groupname = mapped_group;
+            to_cleanup_group = (char *)mapped_group;
+          }
+        }
         unsigned long group_length = strlen(groupname);
         if (group_length > 0xFFFF) {
           return SDAS_INTERNAL_ERROR;
@@ -4625,20 +4757,70 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       // Forced UID/GID is already handled by "symlinks_and_files_from_files".
 
       u32 = file_info_struct->uid;
+      if ((state->parsed->flags & 0x400) == 0) {
+        uint32_t mapped_uid;
+        if (simple_archiver_get_uid_mapping(state->parsed->mappings,
+                                            state->parsed->users_infos,
+                                            u32,
+                                            &mapped_uid,
+                                            NULL) == 0) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped UID %" PRIu32 " to %" PRIu32" for %s\n",
+          //        u32,
+          //        mapped_uid,
+          //        file_info_struct->filename);
+          u32 = mapped_uid;
+        }
+      }
       simple_archiver_helper_32_bit_be(&u32);
       if (fwrite(&u32, 4, 1, out_f) != 1) {
         return SDAS_FAILED_TO_WRITE;
       }
       u32 = file_info_struct->gid;
+      if ((state->parsed->flags & 0x800) == 0) {
+        uint32_t mapped_gid;
+        if(simple_archiver_get_gid_mapping(state->parsed->mappings,
+                                           state->parsed->users_infos,
+                                           u32,
+                                           &mapped_gid,
+                                           NULL) == 0) {
+          //fprintf(stderr,
+          //        "NOTICE: Mapped GID %" PRIu32 " to %" PRIu32" for %s\n",
+          //        u32,
+          //        mapped_gid,
+          //        file_info_struct->filename);
+          u32 = mapped_gid;
+        }
+      }
       simple_archiver_helper_32_bit_be(&u32);
       if (fwrite(&u32, 4, 1, out_f) != 1) {
         return SDAS_FAILED_TO_WRITE;
       }
 
       u32 = file_info_struct->uid;
-      char *username = simple_archiver_hash_map_get(
+      __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+      char *to_cleanup_user = NULL;
+      const char *username = simple_archiver_hash_map_get(
         state->parsed->users_infos.UidToUname, &u32, sizeof(uint32_t));
       if (username) {
+        if ((state->parsed->flags & 0x400) == 0) {
+          uint32_t out_uid;
+          const char *mapped_username = NULL;
+          if (simple_archiver_get_user_mapping(state->parsed->mappings,
+                                               state->parsed->users_infos,
+                                               username,
+                                               &out_uid,
+                                               &mapped_username) == 0
+              && mapped_username) {
+            //fprintf(stderr,
+            //        "NOTICE: Mapped User from %s to %s for %s\n",
+            //        username,
+            //        mapped_username,
+            //        file_info_struct->filename);
+            username = mapped_username;
+            to_cleanup_user = (char *)mapped_username;
+          }
+        }
         unsigned long name_length = strlen(username);
         if (name_length > 0xFFFF) {
           return SDAS_INTERNAL_ERROR;
@@ -4660,9 +4842,29 @@ int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
       }
 
       u32 = file_info_struct->gid;
-      char *groupname = simple_archiver_hash_map_get(
+      __attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
+      char *to_cleanup_group = NULL;
+      const char *groupname = simple_archiver_hash_map_get(
         state->parsed->users_infos.GidToGname, &u32, sizeof(uint32_t));
       if (groupname) {
+        if ((state->parsed->flags & 0x800) == 0) {
+          uint32_t out_gid;
+          const char *mapped_group = NULL;
+          if (simple_archiver_get_group_mapping(state->parsed->mappings,
+                                                state->parsed->users_infos,
+                                                groupname,
+                                                &out_gid,
+                                                &mapped_group) == 0
+              && mapped_group) {
+            //fprintf(stderr,
+            //        "NOTICE: Mapped Group %s to %s for %s\n",
+            //        groupname,
+            //        mapped_group,
+            //        file_info_struct->filename);
+            groupname = mapped_group;
+            to_cleanup_group = (char *)mapped_group;
+          }
+        }
         unsigned long group_length = strlen(groupname);
         if (group_length > 0xFFFF) {
           return SDAS_INTERNAL_ERROR;
index 6375dda9656d584619acc96781906fc7d386cd6a..3223982ec895c16c3eadcd6b928fba055e0c434b 100644 (file)
@@ -1257,7 +1257,7 @@ int simple_archiver_get_uid_mapping(SDA_UGMapping mappings,
                                     UsersInfos users_infos,
                                     uint32_t uid,
                                     uint32_t *out_uid,
-                                    char **out_user) {
+                                    const char **out_user) {
   uint32_t *get_uid = simple_archiver_hash_map_get(mappings.UidToUid,
                                                    &uid,
                                                    sizeof(uint32_t));
@@ -1266,7 +1266,7 @@ int simple_archiver_get_uid_mapping(SDA_UGMapping mappings,
     *out_uid = *get_uid;
     if (out_user) {
       if (*out_user) {
-        free(*out_user);
+        free((void *)*out_user);
       }
       get_user = simple_archiver_hash_map_get(users_infos.UidToUname,
                                               get_uid,
@@ -1291,7 +1291,7 @@ int simple_archiver_get_uid_mapping(SDA_UGMapping mappings,
       *out_uid = *get_uid;
       if (out_user) {
         if (*out_user) {
-          free(*out_user);
+          free((void *)*out_user);
         }
         *out_user = strdup(get_user);
       }
@@ -1306,7 +1306,7 @@ int simple_archiver_get_user_mapping(SDA_UGMapping mappings,
                                      UsersInfos users_infos,
                                      const char *user,
                                      uint32_t *out_uid,
-                                     char **out_user) {
+                                     const char **out_user) {
   uint32_t *get_uid = simple_archiver_hash_map_get(mappings.UnameToUid,
                                                    user,
                                                    strlen(user) + 1);
@@ -1315,7 +1315,7 @@ int simple_archiver_get_user_mapping(SDA_UGMapping mappings,
     *out_uid = *get_uid;
     if (out_user) {
       if (*out_user) {
-        free(*out_user);
+        free((void *)*out_user);
       }
       get_user = simple_archiver_hash_map_get(users_infos.UidToUname,
                                               get_uid,
@@ -1340,7 +1340,7 @@ int simple_archiver_get_user_mapping(SDA_UGMapping mappings,
       *out_uid = *get_uid;
       if (out_user) {
         if (*out_user) {
-          free(*out_user);
+          free((void *)*out_user);
         }
         *out_user = strdup(get_user);
       }
@@ -1355,7 +1355,7 @@ int simple_archiver_get_gid_mapping(SDA_UGMapping mappings,
                                     UsersInfos users_infos,
                                     uint32_t gid,
                                     uint32_t *out_gid,
-                                    char **out_group) {
+                                    const char **out_group) {
   uint32_t *get_gid = simple_archiver_hash_map_get(mappings.GidToGid,
                                                    &gid,
                                                    sizeof(uint32_t));
@@ -1364,7 +1364,7 @@ int simple_archiver_get_gid_mapping(SDA_UGMapping mappings,
     *out_gid = *get_gid;
     if (out_group) {
       if (*out_group) {
-        free(*out_group);
+        free((void *)*out_group);
       }
       get_group = simple_archiver_hash_map_get(users_infos.GidToGname,
                                                get_gid,
@@ -1389,7 +1389,7 @@ int simple_archiver_get_gid_mapping(SDA_UGMapping mappings,
       *out_gid = *get_gid;
       if (out_group) {
         if (*out_group) {
-          free(*out_group);
+          free((void *)*out_group);
         }
         *out_group = strdup(get_group);
       }
@@ -1404,7 +1404,7 @@ int simple_archiver_get_group_mapping(SDA_UGMapping mappings,
                                       UsersInfos users_infos,
                                       const char *group,
                                       uint32_t *out_gid,
-                                      char **out_group) {
+                                      const char **out_group) {
   uint32_t *get_gid = simple_archiver_hash_map_get(mappings.GnameToGid,
                                                    group,
                                                    strlen(group) + 1);
@@ -1413,7 +1413,7 @@ int simple_archiver_get_group_mapping(SDA_UGMapping mappings,
     *out_gid = *get_gid;
     if (out_group) {
       if (*out_group) {
-        free(*out_group);
+        free((void *)*out_group);
       }
       get_group = simple_archiver_hash_map_get(users_infos.GidToGname,
                                                get_gid,
@@ -1438,7 +1438,7 @@ int simple_archiver_get_group_mapping(SDA_UGMapping mappings,
       *out_gid = *get_gid;
       if (out_group) {
         if (*out_group) {
-          free(*out_group);
+          free((void *)*out_group);
         }
         *out_group = strdup(get_group);
       }
index 1888d9b29aae2f9aaa184c6129a97dee5c488cda..0e0f7e581a05b1f434f950425b597930e1bdfb1a 100644 (file)
@@ -141,7 +141,7 @@ int simple_archiver_get_uid_mapping(SDA_UGMapping mappings,
                                     UsersInfos users_infos,
                                     uint32_t uid,
                                     uint32_t *out_uid,
-                                    char **out_user);
+                                    const char **out_user);
 
 /// Returns 0 on success. out_user is used if not NULL. out_user may hold NULL
 /// if username is not found. On success, `*out_user` must be free'd.
@@ -149,7 +149,7 @@ int simple_archiver_get_user_mapping(SDA_UGMapping mappings,
                                      UsersInfos users_infos,
                                      const char *user,
                                      uint32_t *out_uid,
-                                     char **out_user);
+                                     const char **out_user);
 
 /// Returns 0 on success. out_group is used if not NULL. out_group may hold
 /// NULL if groupname is not found. On success `*out_group` must be free'd.
@@ -157,7 +157,7 @@ int simple_archiver_get_gid_mapping(SDA_UGMapping mappings,
                                     UsersInfos users_infos,
                                     uint32_t gid,
                                     uint32_t *out_gid,
-                                    char **out_group);
+                                    const char **out_group);
 
 /// Returns 0 on success. out_group is used if not NULL. out_group may hold
 /// NULL if groupname is not found. On success `*out_group` must be free'd.
@@ -165,5 +165,5 @@ int simple_archiver_get_group_mapping(SDA_UGMapping mappings,
                                       UsersInfos users_infos,
                                       const char *group,
                                       uint32_t *out_gid,
-                                      char **out_group);
+                                      const char **out_group);
 #endif
index 2cf2d541784a77cf911605162511b2e18c685b5d..8df2a697e72bb82a4511e881e78233c7671da058 100644 (file)
@@ -429,7 +429,7 @@ int main(void) {
 
     // Mappings checks.
     uint32_t out_id;
-    char *out_name = NULL;
+    const char *out_name = NULL;
     CHECK_TRUE(simple_archiver_get_uid_mapping(parsed.mappings,
                                                parsed.users_infos,
                                                1000,
@@ -439,7 +439,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "user1001");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -452,7 +452,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "user0");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -472,7 +472,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "user1003");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -485,7 +485,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "user3");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -684,7 +684,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "one");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -697,7 +697,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "root");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -716,7 +716,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "group200");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }
 
@@ -729,7 +729,7 @@ int main(void) {
     CHECK_TRUE(out_name);
     if (out_name) {
       CHECK_STREQ(out_name, "realtime");
-      free(out_name);
+      free((void *)out_name);
       out_name = NULL;
     }