@@ -550,17 +550,20 @@ static int read_filesystem_keydb(struct sync_context *ctx,
550550
551551static int read_keysets (struct sync_context * ctx )
552552{
553- read_firmware_keydb (ctx , & ctx -> firmware_keys -> pk );
554- read_firmware_keydb (ctx , & ctx -> firmware_keys -> kek );
555- read_firmware_keydb (ctx , & ctx -> firmware_keys -> db );
556- read_firmware_keydb (ctx , & ctx -> firmware_keys -> dbx );
553+ int ret ;
557554
558- read_filesystem_keydb ( ctx , & ctx -> filesystem_keys -> pk );
559- read_filesystem_keydb ( ctx , & ctx -> filesystem_keys -> kek );
560- read_filesystem_keydb ( ctx , & ctx -> filesystem_keys -> db );
561- read_filesystem_keydb ( ctx , & ctx -> filesystem_keys -> dbx );
555+ CKINT ( read_firmware_keydb ( ctx , & ctx -> firmware_keys -> pk ) );
556+ CKINT ( read_firmware_keydb ( ctx , & ctx -> firmware_keys -> kek ) );
557+ CKINT ( read_firmware_keydb ( ctx , & ctx -> firmware_keys -> db ) );
558+ CKINT ( read_firmware_keydb ( ctx , & ctx -> firmware_keys -> dbx ) );
562559
563- return 0 ;
560+ CKINT (read_filesystem_keydb (ctx , & ctx -> filesystem_keys -> pk ));
561+ CKINT (read_filesystem_keydb (ctx , & ctx -> filesystem_keys -> kek ));
562+ CKINT (read_filesystem_keydb (ctx , & ctx -> filesystem_keys -> db ));
563+ CKINT (read_filesystem_keydb (ctx , & ctx -> filesystem_keys -> dbx ));
564+
565+ out :
566+ return ret ;
564567}
565568
566569static int check_pk (struct sync_context * ctx )
@@ -667,9 +670,15 @@ static int update_keystore(struct fs_keystore *keystore, const char *root)
667670
668671 ke = calloc (1 , sizeof (struct fs_keystore_entry ));
669672 CKNULL (ke , - ENOMEM );
673+ LIST_ENTRY_INIT (ke -> keystore_list );
674+ LIST_ENTRY_INIT (ke -> new_list );
670675 len = strlen (name ) + 1 ;
671676 name_tmp = calloc (1 , len );
672- CKNULL (name_tmp , - ENOMEM );
677+ if (!name_tmp ) {
678+ free (ke );
679+ ret = - ENOMEM ;
680+ goto out ;
681+ }
673682 snprintf (name_tmp , len , "%s" , name );
674683 ke -> name = name_tmp ;
675684 ke -> root = root ;
@@ -955,18 +964,25 @@ static void version(void)
955964 fprintf (stderr , "%s\n" , version );
956965}
957966
958- static void add_keystore_dir (struct sync_context * ctx , const char * dir )
967+ static int add_keystore_dir (struct sync_context * ctx , const char * dir )
959968{
969+ int ret = 0 ;
970+
960971 if (!ctx -> keystore_dirs ) {
961- ctx -> keystore_dirs = calloc (1 , sizeof (uintptr_t ));
972+ ctx -> keystore_dirs = calloc (1 , sizeof (char * ));
973+ CKNULL (ctx -> keystore_dirs , - ENOMEM );
962974 ctx -> n_keystore_dirs ++ ;
963975 } else {
964976 ctx -> keystore_dirs = realloc (
965977 ctx -> keystore_dirs ,
966- ++ ctx -> n_keystore_dirs * sizeof (uintptr_t ));
978+ ++ ctx -> n_keystore_dirs * sizeof (char * ));
979+ CKNULL (ctx -> keystore_dirs , - ENOMEM );
967980 }
968981
969982 ctx -> keystore_dirs [ctx -> n_keystore_dirs - 1 ] = strdup (dir );
983+
984+ out :
985+ return ret ;
970986}
971987
972988
@@ -1015,9 +1031,10 @@ static void release_ctx(struct sync_context *ctx)
10151031
10161032 if (ctx -> filesystem_keys ) {
10171033 for (i = 0 ; i < ARRAY_SIZE (kdbs ); i ++ ) {
1018- struct key * key ;
1034+ struct key * key , * tmp_key ;
10191035
1020- list_for_each (key , & kdbs [i ].fs_kdb -> keys , list ) {
1036+ list_for_each_guarded (key , tmp_key ,
1037+ & kdbs [i ].fs_kdb -> keys , list ) {
10211038 release_key (key );
10221039 }
10231040 }
@@ -1038,6 +1055,7 @@ int main(int argc, char **argv)
10381055
10391056 use_default_keystore_dirs = true;
10401057 ctx = calloc (1 , sizeof (struct sync_context ));
1058+ CKNULL (ctx , - ENOMEM );
10411059 LIST_ENTRY_INIT (ctx -> new_keys );
10421060
10431061 for (;;) {
@@ -1054,7 +1072,7 @@ int main(int argc, char **argv)
10541072 use_default_keystore_dirs = false;
10551073 break ;
10561074 case 'k' :
1057- add_keystore_dir (ctx , optarg );
1075+ CKINT ( add_keystore_dir (ctx , optarg ) );
10581076 break ;
10591077 case 'p' :
10601078 ctx -> set_pk = true;
@@ -1076,7 +1094,8 @@ int main(int argc, char **argv)
10761094
10771095 if (argc != optind ) {
10781096 usage ();
1079- return EXIT_FAILURE ;
1097+ ret = - EINVAL ;
1098+ goto out ;
10801099 }
10811100
10821101 ctx -> filesystem_keys = init_keyset ();
@@ -1098,12 +1117,12 @@ int main(int argc, char **argv)
10981117 add_keystore_dir (ctx , default_keystore_dirs [i ]);
10991118 }
11001119
1101- read_keystore (ctx );
1120+ CKINT ( read_keystore (ctx ) );
11021121
11031122 if (ctx -> verbose )
11041123 print_keystore (ctx -> fs_keystore );
11051124
1106- read_keysets (ctx );
1125+ CKINT ( read_keysets (ctx ) );
11071126 if (ctx -> verbose ) {
11081127 print_keyset (ctx -> firmware_keys , "firmware" );
11091128 print_keyset (ctx -> filesystem_keys , "filesystem" );
@@ -1112,7 +1131,7 @@ int main(int argc, char **argv)
11121131 if (check_pk (ctx ))
11131132 fprintf (stderr , "WARNING: multiple PKs found in filesystem\n" );
11141133
1115- find_new_keys (ctx );
1134+ CKINT ( find_new_keys (ctx ) );
11161135
11171136 if (ctx -> verbose )
11181137 print_new_keys (ctx );
0 commit comments