ostree-repo: bls-append-except-default followup
authorSaqib Ali <saqali@redhat.com>
Tue, 5 Jul 2022 16:00:16 +0000 (12:00 -0400)
committerSaqib Ali <saqali@redhat.com>
Thu, 7 Jul 2022 20:06:11 +0000 (16:06 -0400)
This PR is followup from https://github.com/coreos/coreos-assembler/pull/2863
Summary of changes:
- Moved bls-append-except-default parsing logic to reload_sysroot_config()
- Made sure heap allocated memory is being freed

src/libostree/ostree-repo-private.h
src/libostree/ostree-repo.c
src/libostree/ostree-sysroot-deploy.c

index 3858a36e0da2ae3b4ecb55b47d5199ecae540c0d..0d33f7c2d05e032359900d0daafa3f8a01de8118 100644 (file)
@@ -224,6 +224,7 @@ struct OstreeRepo {
   gint fs_support_reflink; /* The underlying filesystem has support for ioctl (FICLONE..) */
   gchar **repo_finders;
   OstreeCfgSysrootBootloaderOpt bootloader; /* Configure which bootloader to use. */
+  GHashTable *bls_append_values; /* Parsed key-values from bls-append-except-default key in config. */
 
   OstreeRepo *parent_repo;
 };
index 9b29bd3f24f56d88767470874c0d66918ad6fc60..90cde65139a3039437880a3e521451b6f70d465a 100644 (file)
@@ -1238,6 +1238,7 @@ ostree_repo_finalize (GObject *object)
   g_mutex_clear (&self->txn_lock);
   g_free (self->collection_id);
   g_strfreev (self->repo_finders);
+  g_clear_pointer (&self->bls_append_values, g_hash_table_unref);
 
   g_clear_pointer (&self->remotes, g_hash_table_destroy);
   g_mutex_clear (&self->remotes_lock);
@@ -1412,6 +1413,9 @@ ostree_repo_init (OstreeRepo *self)
   self->remotes = g_hash_table_new_full (g_str_hash, g_str_equal,
                                          (GDestroyNotify) NULL,
                                          (GDestroyNotify) ostree_remote_unref);
+  self->bls_append_values = g_hash_table_new_full (g_str_hash, g_str_equal, 
+                                                   (GDestroyNotify) g_free, 
+                                                   (GDestroyNotify) g_free);
   g_mutex_init (&self->remotes_lock);
 
   self->repo_dir_fd = -1;
@@ -3510,16 +3514,42 @@ reload_sysroot_config (OstreeRepo          *self,
    * https://github.com/ostreedev/ostree/issues/1719
    * https://github.com/ostreedev/ostree/issues/1801
    */
+  gboolean valid_bootloader;
   for (int i = 0; CFG_SYSROOT_BOOTLOADER_OPTS_STR[i]; i++)
     {
       if (g_str_equal (bootloader, CFG_SYSROOT_BOOTLOADER_OPTS_STR[i]))
         {
           self->bootloader = (OstreeCfgSysrootBootloaderOpt) i;
-          return TRUE;
+          valid_bootloader = TRUE;
+        }
+    }
+  if (!valid_bootloader) 
+  {
+    return glnx_throw (error, "Invalid bootloader configuration: '%s'", bootloader);
+  }
+  /* Parse bls-append-except-default string list. */
+  g_auto(GStrv) read_values = NULL;
+  if (!ot_keyfile_get_string_list_with_default (self->config, "sysroot", "bls-append-except-default", 
+                                                ';', NULL, &read_values, error))
+      return glnx_throw(error, "Unable to parse bls-append-except-default");
+    
+  /* get all key value pairs in bls-append-except-default */
+  g_hash_table_remove_all (self->bls_append_values);
+  for (char **iter = read_values; iter && *iter; iter++)
+    {
+      const char *key_value = *iter;
+      const char *sep = strchr (key_value, '=');
+      if (sep == NULL)
+        {
+          glnx_throw (error, "bls-append-except-default key must be of the form \"key1=value1;key2=value2...\"");
+          return FALSE;
         }
+      char *key = g_strndup (key_value, sep - key_value);
+      char *value = g_strdup (sep + 1);
+      g_hash_table_replace (self->bls_append_values, key, value); 
     }
 
-  return glnx_throw (error, "Invalid bootloader configuration: '%s'", bootloader);
+  return TRUE;
 }
 
 /**
index c23453cb7245dbde94a3e0beeeaf6a272c4a36a2..456b0c041d3ed82f79a840258696ca60521490a9 100644 (file)
@@ -2083,25 +2083,6 @@ install_deployment_kernel (OstreeSysroot   *sysroot,
   g_autofree char *options_key = ostree_kernel_args_to_string (kargs);
   ostree_bootconfig_parser_set (bootconfig, "options", options_key);
 
-  g_autoptr(GError) local_error = NULL;
-  GKeyFile *config = ostree_repo_get_config (repo);
-  gchar **read_values = g_key_file_get_string_list (config, "sysroot", "bls-append-except-default", NULL, &local_error);
-  /* We can ignore not found errors */
-  if (!read_values)
-    {
-      gboolean not_found = g_error_matches (local_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND) || \
-                           g_error_matches (local_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
-      if (not_found)
-        {
-          g_clear_error (&local_error);
-        }
-      else
-        {
-          g_propagate_error (error, g_steal_pointer (&local_error));
-          return FALSE;
-        }
-    }
-
   /* Only append to this BLS config if:
    * - this is not the default deployment
    */
@@ -2111,20 +2092,8 @@ install_deployment_kernel (OstreeSysroot   *sysroot,
   if (allow_append)
     {
       /* get all key value pairs in bls-append */
-      for (char **iter = read_values; iter && *iter; iter++)
-        {
-          const char *key_value = *iter;
-          const char *sep = strchr (key_value, '=');
-          if (sep == NULL)
-            {
-              glnx_throw (error, "bls-append-except-default key must be of the form \"key1=value1;key2=value2...\"");
-              return FALSE;
-            }
-          g_autofree char *key = g_strndup (key_value, sep - key_value);
-          g_autofree char *value = g_strdup (sep + 1);
-          ostree_bootconfig_parser_set (bootconfig, key, value);
-        }
-
+      GLNX_HASH_TABLE_FOREACH_KV (repo->bls_append_values, const char *, key, const char *, value)
+        ostree_bootconfig_parser_set (bootconfig, key, value);
     }
 
   glnx_autofd int bootconf_dfd = -1;