Skip to content

Commit c007745

Browse files
authored
Merge pull request #54 from roblabla/master
Stop using duplicate keys
2 parents a4e8ab6 + 867a91c commit c007745

File tree

1 file changed

+71
-30
lines changed

1 file changed

+71
-30
lines changed

npdm.c

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,27 @@ void npdm_save(npdm_t *npdm, hactool_ctx_t *tool_ctx) {
681681
fclose(f_json);
682682
}
683683

684+
static cJSON *kac_create_obj(const char *type, cJSON *val) {
685+
cJSON *tempobj = NULL;
686+
687+
tempobj = cJSON_CreateObject();
688+
cJSON_AddStringToObject(tempobj, "type", type);
689+
cJSON_AddItemToObject(tempobj, "value", val);
690+
return tempobj;
691+
}
692+
693+
void cJSON_AddU16ToKacArray(cJSON *obj, const char *name, uint16_t val) {
694+
char buf[0x20] = {0};
695+
snprintf(buf, sizeof(buf), "0x%04"PRIx16, val);
696+
cJSON_AddItemToArray(obj, kac_create_obj(name, cJSON_CreateString(buf)));
697+
}
698+
699+
void cJSON_AddU32ToKacArray(cJSON *obj, const char *name, uint32_t val) {
700+
char buf[0x20] = {0};
701+
snprintf(buf, sizeof(buf), "0x%08"PRIx32, val);
702+
cJSON_AddItemToArray(obj, kac_create_obj(name, cJSON_CreateString(buf)));
703+
}
704+
684705
void cJSON_AddU8ToObject(cJSON *obj, const char *name, uint8_t val) {
685706
char buf[0x20] = {0};
686707
snprintf(buf, sizeof(buf), "0x%02"PRIx8, val);
@@ -695,7 +716,7 @@ void cJSON_AddU16ToObject(cJSON *obj, const char *name, uint16_t val) {
695716

696717
void cJSON_AddU32ToObject(cJSON *obj, const char *name, uint32_t val) {
697718
char buf[0x20] = {0};
698-
snprintf(buf, sizeof(buf), "0x%08"PRIx16, val);
719+
snprintf(buf, sizeof(buf), "0x%08"PRIx32, val);
699720
cJSON_AddStringToObject(obj, name, buf);
700721
}
701722

@@ -705,28 +726,50 @@ void cJSON_AddU64ToObject(cJSON *obj, const char *name, uint64_t val) {
705726
cJSON_AddStringToObject(obj, name, buf);
706727
}
707728

708-
static cJSON *sac_get_json(char *sac, uint32_t sac_size) {
709-
cJSON *sac_json = cJSON_CreateObject();
729+
static cJSON *sac_access_get_json(char *sac, uint32_t sac_size) {
730+
cJSON *sac_json = cJSON_CreateArray();
731+
char service[9] = {0};
732+
uint32_t ofs = 0;
733+
uint32_t service_len;
734+
char ctrl;
735+
while (ofs < sac_size) {
736+
ctrl = sac[ofs++];
737+
service_len = (ctrl & 0x7) + 1;
738+
if (!(ctrl & 0x80)) {
739+
memset(service, 0, sizeof(service));
740+
memcpy(service, &sac[ofs], service_len);
741+
cJSON_AddItemToArray(sac_json, cJSON_CreateString(service));
742+
}
743+
ofs += service_len;
744+
}
745+
746+
return sac_json;
747+
}
748+
749+
static cJSON *sac_host_get_json(char *sac, uint32_t sac_size) {
750+
cJSON *sac_json = cJSON_CreateArray();
710751
char service[9] = {0};
711752
uint32_t ofs = 0;
712753
uint32_t service_len;
713754
char ctrl;
714755
while (ofs < sac_size) {
715-
memset(service, 0, sizeof(service));
716756
ctrl = sac[ofs++];
717757
service_len = (ctrl & 0x7) + 1;
718-
memcpy(service, &sac[ofs], service_len);
719-
cJSON_AddBoolToObject(sac_json, service, (ctrl & 0x80) != 0);
758+
if (ctrl & 0x80) {
759+
memset(service, 0, sizeof(service));
760+
memcpy(service, &sac[ofs], service_len);
761+
cJSON_AddItemToArray(sac_json, cJSON_CreateString(service));
762+
}
720763
ofs += service_len;
721764
}
722-
765+
723766
return sac_json;
724767
}
725768

726769
cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
727-
cJSON *kac_json = cJSON_CreateObject();
770+
cJSON *kac_json = cJSON_CreateArray();
771+
cJSON *syscall_memory = NULL;
728772
cJSON *temp = NULL;
729-
bool first_syscall = false;
730773
unsigned int syscall_base;
731774
for (uint32_t i = 0; i < num_descriptors; i++) {
732775
uint32_t desc = descriptors[i];
@@ -749,15 +792,15 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
749792
cJSON_AddNumberToObject(temp, "lowest_cpu_id", desc & 0xFF);
750793
desc >>= 8;
751794
cJSON_AddNumberToObject(temp, "highest_cpu_id", desc & 0xFF);
752-
cJSON_AddItemToObject(kac_json, "kernel_flags", temp);
795+
cJSON_AddItemToArray(kac_json, kac_create_obj("kernel_flags", temp));
753796
break;
754797
case 4: /* Syscall mask. */
755-
temp = cJSON_GetObjectItemCaseSensitive(kac_json, "syscalls");
756-
if (temp == NULL) {
757-
first_syscall = true;
798+
if (syscall_memory == NULL) {
758799
temp = cJSON_CreateObject();
759-
} else {
760-
first_syscall = false;
800+
cJSON_AddItemToArray(kac_json, kac_create_obj("syscalls", temp));
801+
syscall_memory = temp;
802+
} else {
803+
temp = syscall_memory;
761804
}
762805
syscall_base = (desc >> 24) * 0x18;
763806
for (unsigned int sc = 0; sc < 0x18 && syscall_base + sc < 0x80; sc++) {
@@ -766,13 +809,9 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
766809
}
767810
desc >>= 1;
768811
}
769-
if (first_syscall) {
770-
cJSON_AddItemToObject(kac_json, "syscalls", temp);
771-
}
772812
break;
773813
case 6: /* Map IO/Normal. */
774814
temp = cJSON_CreateObject();
775-
776815
cJSON_AddU32ToObject(temp, "address", (desc & 0xFFFFFF) << 12);
777816
cJSON_AddBoolToObject(temp, "is_ro", (desc >> 24) & 1);
778817
if (i == num_descriptors - 1) {
@@ -787,10 +826,10 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
787826
desc >>= 7;
788827
cJSON_AddU32ToObject(temp, "size", (desc & 0xFFFFFF) << 12);
789828
cJSON_AddBoolToObject(temp, "is_io", ((desc >> 24) & 1) == 0);
790-
cJSON_AddItemToObject(kac_json, "map", temp);
829+
cJSON_AddItemToArray(kac_json, kac_create_obj("map", temp));
791830
break;
792-
case 7: /* Map Normal Page. */
793-
cJSON_AddU32ToObject(kac_json, "map_page", desc << 12);
831+
case 7: /* Map Normal Page. */
832+
cJSON_AddU32ToKacArray(kac_json, "map_page", desc << 12);
794833
break;
795834
case 11: /* IRQ Pair. */
796835
temp = cJSON_CreateArray();
@@ -805,22 +844,22 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
805844
} else {
806845
cJSON_AddItemToArray(temp, cJSON_CreateNumber(desc & 0x3FF));
807846
}
808-
cJSON_AddItemToObject(kac_json, "irq_pair", temp);
847+
cJSON_AddItemToArray(kac_json, kac_create_obj("irq_pair", temp));
809848
break;
810849
case 13: /* App Type. */
811-
cJSON_AddNumberToObject(kac_json, "application_type", desc & 7);
850+
cJSON_AddItemToArray(kac_json, kac_create_obj("application_type", cJSON_CreateNumber(desc & 7)));
812851
break;
813852
case 14: /* Kernel Release Version. */
814-
cJSON_AddU16ToObject(kac_json, "min_kernel_version", desc & 0xFFFF);
853+
cJSON_AddU16ToKacArray(kac_json, "min_kernel_version", desc & 0xFFFF);
815854
break;
816855
case 15: /* Handle Table Size. */
817-
cJSON_AddNumberToObject(kac_json, "handle_table_size", desc);
856+
cJSON_AddItemToArray(kac_json, kac_create_obj("handle_table_size", cJSON_CreateNumber(desc)));
818857
break;
819858
case 16: /* Debug Flags. */
820859
temp = cJSON_CreateObject();
821860
cJSON_AddBoolToObject(temp, "allow_debug", (desc >> 0) & 1);
822861
cJSON_AddBoolToObject(temp, "force_debug", (desc >> 1) & 1);
823-
cJSON_AddItemToObject(kac_json, "debug_flags", temp);
862+
cJSON_AddItemToArray(kac_json, kac_create_obj("debug_flags", temp));
824863

825864
// kac.has_debug_flags = 1;
826865
// kac.allow_debug = desc & 1;
@@ -862,8 +901,10 @@ char *npdm_get_json(npdm_t *npdm) {
862901
cJSON_AddItemToObject(npdm_json, "filesystem_access", fac_json);
863902

864903
/* Add SAC. */
865-
cJSON *sac_json = sac_get_json((char *)aci0 + aci0->sac_offset, aci0->sac_size);
866-
cJSON_AddItemToObject(npdm_json, "service_access", sac_json);
904+
cJSON *sac_access_json = sac_access_get_json((char *)aci0 + aci0->sac_offset, aci0->sac_size);
905+
cJSON *sac_host_json = sac_host_get_json((char *)aci0 + aci0->sac_offset, aci0->sac_size);
906+
cJSON_AddItemToObject(npdm_json, "service_access", sac_access_json);
907+
cJSON_AddItemToObject(npdm_json, "service_host", sac_host_json);
867908

868909
/* Add KAC. */
869910
cJSON *kac_json = kac_get_json((uint32_t *)((char *)aci0 + aci0->kac_offset), aci0->kac_size / sizeof(uint32_t));
@@ -873,4 +914,4 @@ char *npdm_get_json(npdm_t *npdm) {
873914

874915
cJSON_Delete(npdm_json);
875916
return output_str;
876-
}
917+
}

0 commit comments

Comments
 (0)