mirror of
https://github.com/ostreedev/ostree.git
synced 2025-03-16 10:50:43 +03:00
sysroot: Sort returned boot loader configs
I haven't done a full dig through the history, but it seems quite possible right now we've been relying on inode enumeration order for generating bootloader configuration. Most of the time, newer inodes (i.e. later written files) will win. But that's obviously not reliable. Fix this by sorting the returned configuration internally.
This commit is contained in:
parent
ca0f02a54b
commit
3300ee6259
@ -361,6 +361,35 @@ _ostree_sysroot_read_current_subbootversion (OstreeSysroot *self,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gint
|
||||
compare_boot_loader_configs (OstreeBootconfigParser *a,
|
||||
OstreeBootconfigParser *b)
|
||||
{
|
||||
const char *a_version = ostree_bootconfig_parser_get (a, "version");
|
||||
const char *b_version = ostree_bootconfig_parser_get (b, "version");
|
||||
|
||||
if (a_version && b_version)
|
||||
{
|
||||
int r = strverscmp (a_version, b_version);
|
||||
/* Reverse */
|
||||
return -r;
|
||||
}
|
||||
else if (a_version)
|
||||
return -1;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
compare_loader_configs_for_sorting (gconstpointer a_pp,
|
||||
gconstpointer b_pp)
|
||||
{
|
||||
OstreeBootconfigParser *a = *((OstreeBootconfigParser**)a_pp);
|
||||
OstreeBootconfigParser *b = *((OstreeBootconfigParser**)b_pp);
|
||||
|
||||
return compare_boot_loader_configs (a, b);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
|
||||
int bootversion,
|
||||
@ -427,6 +456,9 @@ _ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
|
||||
}
|
||||
}
|
||||
|
||||
/* Callers expect us to give them a sorted array */
|
||||
g_ptr_array_sort (ret_loader_configs, compare_loader_configs_for_sorting);
|
||||
|
||||
done:
|
||||
gs_transfer_out_value (out_loader_configs, &ret_loader_configs);
|
||||
ret = TRUE;
|
||||
@ -706,19 +738,8 @@ compare_deployments_by_boot_loader_version_reversed (gconstpointer a_pp,
|
||||
OstreeDeployment *b = *((OstreeDeployment**)b_pp);
|
||||
OstreeBootconfigParser *a_bootconfig = ostree_deployment_get_bootconfig (a);
|
||||
OstreeBootconfigParser *b_bootconfig = ostree_deployment_get_bootconfig (b);
|
||||
const char *a_version = ostree_bootconfig_parser_get (a_bootconfig, "version");
|
||||
const char *b_version = ostree_bootconfig_parser_get (b_bootconfig, "version");
|
||||
|
||||
if (a_version && b_version)
|
||||
{
|
||||
int r = strverscmp (a_version, b_version);
|
||||
/* Reverse */
|
||||
return -r;
|
||||
}
|
||||
else if (a_version)
|
||||
return -1;
|
||||
else
|
||||
return 1;
|
||||
|
||||
return compare_boot_loader_configs (a_bootconfig, b_bootconfig);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user