@@ -1794,19 +1794,29 @@ static gboolean
17941794validate_commit_metadata (GVariant *commit_data,
17951795 const char *ref,
17961796 const char *required_metadata,
1797+ gsize required_metadata_size,
17971798 gboolean require_xa_metadata,
17981799 GError **error)
17991800{
18001801 g_autoptr(GVariant) commit_metadata = NULL;
1802+ g_autoptr(GVariant) xa_metadata_v = NULL;
18011803 const char *xa_metadata = NULL;
1804+ gsize xa_metadata_size = 0;
18021805
18031806 commit_metadata = g_variant_get_child_value (commit_data, 0);
18041807
18051808 if (commit_metadata != NULL)
1806- g_variant_lookup (commit_metadata, "xa.metadata", "&s", &xa_metadata);
1809+ {
1810+ xa_metadata_v = g_variant_lookup_value (commit_metadata,
1811+ "xa.metadata",
1812+ G_VARIANT_TYPE_STRING);
1813+ if (xa_metadata_v)
1814+ xa_metadata = g_variant_get_string (xa_metadata_v, &xa_metadata_size);
1815+ }
18071816
18081817 if ((xa_metadata == NULL && require_xa_metadata) ||
1809- (xa_metadata != NULL && g_strcmp0 (required_metadata, xa_metadata) != 0))
1818+ (xa_metadata != NULL && (xa_metadata_size != required_metadata_size ||
1819+ memcmp (xa_metadata, required_metadata, xa_metadata_size) != 0)))
18101820 {
18111821 g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
18121822 _("Commit metadata for %s not matching expected metadata"), ref);
@@ -3515,6 +3525,7 @@ upgrade_deploy_data (GBytes *deploy_data,
35153525 g_autoptr(GKeyFile) keyfile = NULL;
35163526 g_autoptr(GFile) metadata_file = NULL;
35173527 g_autofree char *metadata_contents = NULL;
3528+ gsize metadata_size = 0;
35183529 g_autofree char *id = flatpak_decomposed_dup_id (ref);
35193530
35203531 /* Add fields from commit metadata to deploy */
@@ -3528,9 +3539,9 @@ upgrade_deploy_data (GBytes *deploy_data,
35283539 keyfile = g_key_file_new ();
35293540 metadata_file = g_file_resolve_relative_path (deploy_dir, "metadata");
35303541 if (!g_file_load_contents (metadata_file, cancellable,
3531- &metadata_contents, NULL , NULL, error))
3542+ &metadata_contents, &metadata_size , NULL, error))
35323543 return NULL;
3533- if (!g_key_file_load_from_data (keyfile, metadata_contents, -1 , 0, error))
3544+ if (!g_key_file_load_from_data (keyfile, metadata_contents, metadata_size , 0, error))
35343545 return NULL;
35353546 add_metadata_to_deploy_data (&metadata_dict, keyfile);
35363547
@@ -5833,8 +5844,13 @@ flatpak_dir_pull (FlatpakDir *self,
58335844 {
58345845 g_autoptr(GVariant) commit_data = NULL;
58355846 if (!ostree_repo_load_commit (repo, rev, &commit_data, NULL, error) ||
5836- !validate_commit_metadata (commit_data, ref, (const char *)g_bytes_get_data (require_metadata, NULL), TRUE, error))
5837- return FALSE;
5847+ !validate_commit_metadata (commit_data,
5848+ ref,
5849+ (const char *)g_bytes_get_data (require_metadata, NULL),
5850+ g_bytes_get_size (require_metadata),
5851+ TRUE,
5852+ error))
5853+ goto out;
58385854 }
58395855
58405856 if (!flatpak_dir_pull_extra_data (self, repo,
@@ -8156,6 +8172,7 @@ flatpak_dir_deploy (FlatpakDir *self,
81568172 g_auto(GLnxLockFile) lock = { 0, };
81578173 g_autoptr(GFile) metadata_file = NULL;
81588174 g_autofree char *metadata_contents = NULL;
8175+ gsize metadata_size = 0;
81598176 gboolean is_oci;
81608177 const char *flatpak;
81618178
@@ -8366,11 +8383,12 @@ flatpak_dir_deploy (FlatpakDir *self,
83668383 keyfile = g_key_file_new ();
83678384 metadata_file = g_file_resolve_relative_path (checkoutdir, "metadata");
83688385 if (g_file_load_contents (metadata_file, NULL,
8369- &metadata_contents, NULL, NULL, NULL))
8386+ &metadata_contents,
8387+ &metadata_size, NULL, NULL))
83708388 {
83718389 if (!g_key_file_load_from_data (keyfile,
83728390 metadata_contents,
8373- -1 ,
8391+ metadata_size ,
83748392 0, error))
83758393 return FALSE;
83768394
@@ -8386,7 +8404,7 @@ flatpak_dir_deploy (FlatpakDir *self,
83868404 */
83878405 is_oci = flatpak_dir_get_remote_oci (self, origin);
83888406 if (!validate_commit_metadata (commit_data, flatpak_decomposed_get_ref (ref),
8389- metadata_contents, !is_oci, error))
8407+ metadata_contents, metadata_size, !is_oci, error))
83908408 return FALSE;
83918409
83928410 dotref = g_file_resolve_relative_path (checkoutdir, "files/.ref");
0 commit comments