From: Stephen Seo Date: Wed, 8 Jan 2025 06:43:32 +0000 (+0900) Subject: Impl UID/GID remap on v3 archive X-Git-Tag: 1.11^2~10 X-Git-Url: https://git.seodisparate.com/stephenseo/css/v4-font-face.min.css?a=commitdiff_plain;h=6168c39bddd3248e15958e81c74720966ad87bb9;p=SimpleArchiver Impl UID/GID remap on v3 archive TODO: Impl UID/GID remap on extract. --- diff --git a/src/archiver.c b/src/archiver.c index bfdd4af..f4170f7 100644 --- a/src/archiver.c +++ b/src/archiver.c @@ -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; diff --git a/src/parser.c b/src/parser.c index 6375dda..3223982 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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); } diff --git a/src/parser.h b/src/parser.h index 1888d9b..0e0f7e5 100644 --- a/src/parser.h +++ b/src/parser.h @@ -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 diff --git a/src/test.c b/src/test.c index 2cf2d54..8df2a69 100644 --- a/src/test.c +++ b/src/test.c @@ -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; }