@@ -113,6 +113,17 @@ uint8_t* ReadEntireFile(const char* fn, size_t* len_out) {
113113 return buf ;
114114}
115115
116+ int cJSON_GetString (const cJSON * obj , const char * field , const char * * out ) {
117+ const cJSON * config = cJSON_GetObjectItemCaseSensitive (obj , field );
118+ if (cJSON_IsString (config )) {
119+ * out = config -> valuestring ;
120+ return 1 ;
121+ } else {
122+ fprintf (stderr , "Failed to get %s (field not present).\n" , field );
123+ return 0 ;
124+ }
125+ }
126+
116127int cJSON_GetU8 (const cJSON * obj , const char * field , u8 * out ) {
117128 const cJSON * config = cJSON_GetObjectItemCaseSensitive (obj , field );
118129 if (cJSON_IsNumber (config )) {
@@ -409,20 +420,37 @@ int CreateNpdm(const char *json, void **dst, u32 *dst_size) {
409420
410421 /* Parse capabilities. */
411422 capabilities = cJSON_GetObjectItemCaseSensitive (npdm_json , "kernel_capabilities" );
412- if (!cJSON_IsObject (capabilities )) {
413- fprintf (stderr , "Kernel Capabilities must be an object !\n" );
423+ if (!( cJSON_IsArray ( capabilities ) || cJSON_IsObject (capabilities ) )) {
424+ fprintf (stderr , "Kernel Capabilities must be an array !\n" );
414425 status = 0 ;
415426 goto NPDM_BUILD_END ;
416427 }
417-
428+
429+ int kac_obj = 0 ;
430+ if (cJSON_IsObject (capabilities )) {
431+ kac_obj = 1 ;
432+ fprintf (stderr , "Using deprecated kernel_capabilities format. Please turn it into an array.\n" );
433+ }
434+
418435 u32 * caps = (u32 * )((u8 * )aci0 + aci0 -> KacOffset );
419436 u32 cur_cap = 0 ;
420437 u32 desc ;
421438 cJSON_ArrayForEach (capability , capabilities ) {
422439 desc = 0 ;
423- const char * type_str = capability -> string ;
424-
425- const cJSON * value = capability ;
440+ const char * type_str ;
441+ const cJSON * value ;
442+
443+ if (kac_obj ) {
444+ type_str = capability -> string ;
445+ value = capability ;
446+ } else {
447+ if (!cJSON_GetString (capability , "type" , & type_str )) {
448+ status = 0 ;
449+ goto NPDM_BUILD_END ;
450+ }
451+ value = cJSON_GetObjectItemCaseSensitive (capability , "value" );
452+ }
453+
426454 if (!strcmp (type_str , "kernel_flags" )) {
427455 if (!cJSON_IsObject (value )) {
428456 fprintf (stderr , "Kernel Flags Capability value must be object!\n" );
@@ -542,7 +570,7 @@ int CreateNpdm(const char *json, void **dst, u32 *dst_size) {
542570 } else if (!strcmp (type_str , "min_kernel_version" )) {
543571 u64 kern_ver = 0 ;
544572 if (cJSON_IsNumber (value )) {
545- kern_ver = (u64 )value -> valueint ;
573+ kern_ver = (u64 )value -> valueint ;
546574 } else if (!cJSON_IsString (value ) || !cJSON_GetU64FromObjectValue (value , & kern_ver )) {
547575 fprintf (stderr , "Error: Kernel version must be integer or hex strings.\n" );
548576 status = 0 ;
0 commit comments