Version in base suite: 2.66.8-1 Base version: glib2.0_2.66.8-1 Target version: glib2.0_2.66.8-1+deb11u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/g/glib2.0/glib2.0_2.66.8-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/g/glib2.0/glib2.0_2.66.8-1+deb11u1.dsc changelog | 89 gbp.conf | 2 patches/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch | 187 patches/Exclude-g_variant_maybe_get_child_value-from-API-document.patch | 36 patches/Explain-magic-literals-in-G_VARIANT_-_INIT.patch | 45 patches/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch | 22 patches/Update-Croatian-translation.patch | 7605 ++++++++++ patches/debian/gvariant-test-Don-t-run-at-build-time-on-mips.patch | 4 patches/gvariant-Add-internal-g_variant_maybe_get_child_value.patch | 105 patches/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch | 294 patches/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch | 149 patches/gvariant-Clarify-operator-precedence.patch | 32 patches/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch | 28 patches/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch | 126 patches/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch | 388 patches/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch | 414 patches/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch | 78 patches/gvariant-Factor-out-type-check.patch | 34 patches/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch | 22 patches/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch | 92 patches/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch | 28 patches/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch | 55 patches/gvariant-Optimise-g_variant_print-for-nested-maybes.patch | 84 patches/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch | 41 patches/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch | 41 patches/gvariant-Remove-redundant-g_variant_serialised_n_children.patch | 57 patches/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch | 37 patches/gvariant-Track-checked-and-ordered-offsets-independently.patch | 386 patches/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch | 50 patches/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch | 90 patches/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch | 95 patches/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch | 93 patches/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch | 236 patches/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch | 282 patches/gvariant-serialiser-Convert-endianness-of-offsets.patch | 62 patches/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch | 105 patches/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch | 203 patches/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch | 47 patches/gvariant-serialiser-Rework-child-size-calculation.patch | 76 patches/series | 38 patches/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch | 63 patches/tests-Disable-some-random-instance-tests-of-GVariants.patch | 72 42 files changed, 11990 insertions(+), 3 deletions(-) diff -Nru glib2.0-2.66.8/debian/changelog glib2.0-2.66.8/debian/changelog --- glib2.0-2.66.8/debian/changelog 2021-03-20 15:35:19.000000000 +0000 +++ glib2.0-2.66.8/debian/changelog 2023-09-30 13:25:23.000000000 +0000 @@ -1,3 +1,92 @@ +glib2.0 (2.66.8-1+deb11u1) bullseye; urgency=medium + + * d/patches: Update to upstream commit 2.66.8-1-g284b7eb7f + - Update Croatian translation + * d/patches: Backport GVariant denial-of-service fixes from 2.74.x + (Closes: #1028475) + - d/p/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch: + Reject excessively nested type declarations to prevent a possible + denial-of-service if applications parse an untrusted GVariant in + its text form (glib#2782, oss-fuzz#49462) + - d/p/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch: + Speed up processing of deeply nested "maybe" types when parsing a + GVariant in text form (glib#2782, oss-fuzz#20177, oss-fuzz#49462) + - d/p/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch, + d/p/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch, + d/p/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch, + d/p/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch, + d/p/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch, + d/p/gvariant-serialiser-Rework-child-size-calculation.patch, + d/p/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch, + d/p/gvariant-Track-checked-and-ordered-offsets-independently.patch, + d/p/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch, + d/p/tests-Disable-some-random-instance-tests-of-GVariants.patch, + d/p/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch, + d/p/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch, + d/p/gvariant-Add-internal-g_variant_maybe_get_child_value.patch, + d/p/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch, + d/p/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch, + d/p/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch, + d/p/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch, + d/p/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch: + Fix handling of GVariant normal forms, to avoid non-linear processing + time, which can be a denial of service if parsing an untrusted + GVariant in its binary form + (glib#2121, glib#2540, glib#2794, glib#2797; + CVE-2023-32665, CVE-2023-32611, CVE-2023-29499) + - d/p/gvariant-serialiser-Convert-endianness-of-offsets.patch: + Fix a regression causing a crash on big-endian architectures after + the above fixes (glib#2839) + - d/p/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch: + Fix a buffer overflow after the above fixes + (glib#2840, CVE-2023-32643, oss-fuzz#54302) + - d/p/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch: + Fix a non-linear processing time (denial of service) for GVariant in + its binary form after the above fixes + (glib#2841, CVE-2023-32636, oss-fuzz#54314) + - d/p/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch, + d/p/gvariant-Optimise-g_variant_print-for-nested-maybes.patch, + d/p/gvariant-Remove-redundant-g_variant_serialised_n_children.patch, + d/p/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch: + Fix slow parsing of GVariant in its text form + (glib#2862, oss-fuzz#54577) + * Backport additional GVariant fixes from 2.74.x. + This results in glib/gvariant* having the same code in Debian 11 and 12 + (when comments and inclusion of a private header for the internal + backport of g_memdup2() are disregarded), which seems less likely to + create regressions than backporting only the security fixes. + - d/p/gvariant-Clarify-operator-precedence.patch: + Reassure static analyzers that the precedence is as we intend it to be. + Originally in 2.67.2. + - d/p/Explain-magic-literals-in-G_VARIANT_-_INIT.patch: + Add comments explaining some "magic numbers" in initializers. + Originally in 2.67.2. + - d/p/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch: + Make sure an "out" parameter always gets initialized. + Originally in 2.71.3. + - d/p/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch: + Prevent unbounded recursion when validating variants (glib#2572). + Originally in 2.71.1, and possibly a denial-of-service fix. + - d/p/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch: + Avoid a memory leak after a programming error. Originally in 2.71.0. + - d/p/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch: + Make it more obvious that NULL dereferences are avoided. + Originally in 2.71.0. + - d/p/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch: + Ensure function calls with side-effects always happen, even if + checks are disabled (not relevant in Debian, we enable checks). + Originally in 2.71.3. + - d/p/gvariant-Factor-out-type-check.patch: + Help static analyzers to understand a code path. Originally in 2.73.0. + - d/p/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch: + Avoid a static analyzer false-positive. Originally in 2.73.1. + * d/p/Exclude-g_variant_maybe_get_child_value-from-API-document.patch: + Add patch to fix a failing documentation check which caused FTBFS, by + excluding an internal function from API documentation processing. + No functional change, only comments are affected. + + -- Simon McVittie Sat, 30 Sep 2023 14:25:23 +0100 + glib2.0 (2.66.8-1) unstable; urgency=medium * d/watch: Only watch for 2.66.x versions. diff -Nru glib2.0-2.66.8/debian/gbp.conf glib2.0-2.66.8/debian/gbp.conf --- glib2.0-2.66.8/debian/gbp.conf 2021-03-20 15:35:19.000000000 +0000 +++ glib2.0-2.66.8/debian/gbp.conf 2023-09-30 13:25:23.000000000 +0000 @@ -1,6 +1,6 @@ [DEFAULT] pristine-tar = True -debian-branch = debian/master +debian-branch = debian/bullseye upstream-branch = upstream/2.66.x upstream-vcs-tag = %(version)s diff -Nru glib2.0-2.66.8/debian/patches/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch glib2.0-2.66.8/debian/patches/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch --- glib2.0-2.66.8/debian/patches/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/Do-not-use-ensure_valid_-call-in-g_return_-macro.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,187 @@ +From: Alexander Klauer +Date: Fri, 4 Mar 2022 14:04:02 +0000 +Subject: Do not use ensure_valid_* call in g_return_* macro + +Replace all instances of ensure_valid_builder or ensure_valid_dict +calls used as arguments to the g_return_if_fail or +g_return_value_if_fail macros with otherwise equivalent code that +always calls these functions, thus ensuring their side effects always +apply. This commit does not change any external or private interfaces. + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2612 +Origin: upstream, 2.71.3, commit:340bc1ca799713da6d59eddf8611cfa62040c973 +--- + glib/gvariant.c | 62 +++++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 49 insertions(+), 13 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index f8c1001..917b7c6 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -3226,6 +3226,24 @@ ensure_valid_builder (GVariantBuilder *builder) + return is_valid_builder (builder); + } + ++/* return_if_invalid_builder (b) is like ++ * g_return_if_fail (ensure_valid_builder (b)), except that ++ * the side effects of ensure_valid_builder are evaluated ++ * regardless of whether G_DISABLE_CHECKS is defined or not. */ ++#define return_if_invalid_builder(b) G_STMT_START { \ ++ gboolean valid_builder G_GNUC_UNUSED = ensure_valid_builder (b); \ ++ g_return_if_fail (valid_builder); \ ++} G_STMT_END ++ ++/* return_val_if_invalid_builder (b, val) is like ++ * g_return_val_if_fail (ensure_valid_builder (b), val), except that ++ * the side effects of ensure_valid_builder are evaluated ++ * regardless of whether G_DISABLE_CHECKS is defined or not. */ ++#define return_val_if_invalid_builder(b, val) G_STMT_START { \ ++ gboolean valid_builder G_GNUC_UNUSED = ensure_valid_builder (b); \ ++ g_return_val_if_fail (valid_builder, val); \ ++} G_STMT_END ++ + /** + * g_variant_builder_new: + * @type: a container type +@@ -3338,7 +3356,7 @@ g_variant_builder_clear (GVariantBuilder *builder) + /* all-zeros or partial case */ + return; + +- g_return_if_fail (ensure_valid_builder (builder)); ++ return_if_invalid_builder (builder); + + g_variant_type_free (GVSB(builder)->type); + +@@ -3501,7 +3519,7 @@ void + g_variant_builder_add_value (GVariantBuilder *builder, + GVariant *value) + { +- g_return_if_fail (ensure_valid_builder (builder)); ++ return_if_invalid_builder (builder); + g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); + g_return_if_fail (!GVSB(builder)->expected_type || + g_variant_is_of_type (value, +@@ -3582,7 +3600,7 @@ g_variant_builder_open (GVariantBuilder *builder, + { + GVariantBuilder *parent; + +- g_return_if_fail (ensure_valid_builder (builder)); ++ return_if_invalid_builder (builder); + g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); + g_return_if_fail (!GVSB(builder)->expected_type || + g_variant_type_is_subtype_of (type, +@@ -3628,7 +3646,7 @@ g_variant_builder_close (GVariantBuilder *builder) + { + GVariantBuilder *parent; + +- g_return_if_fail (ensure_valid_builder (builder)); ++ return_if_invalid_builder (builder); + g_return_if_fail (GVSB(builder)->parent != NULL); + + parent = GVSB(builder)->parent; +@@ -3696,7 +3714,7 @@ g_variant_builder_end (GVariantBuilder *builder) + GVariantType *my_type; + GVariant *value; + +- g_return_val_if_fail (ensure_valid_builder (builder), NULL); ++ return_val_if_invalid_builder (builder, NULL); + g_return_val_if_fail (GVSB(builder)->offset >= GVSB(builder)->min_items, + NULL); + g_return_val_if_fail (!GVSB(builder)->uniform_item_types || +@@ -3884,6 +3902,24 @@ ensure_valid_dict (GVariantDict *dict) + return is_valid_dict (dict); + } + ++/* return_if_invalid_dict (d) is like ++ * g_return_if_fail (ensure_valid_dict (d)), except that ++ * the side effects of ensure_valid_dict are evaluated ++ * regardless of whether G_DISABLE_CHECKS is defined or not. */ ++#define return_if_invalid_dict(d) G_STMT_START { \ ++ gboolean valid_dict G_GNUC_UNUSED = ensure_valid_dict (d); \ ++ g_return_if_fail (valid_dict); \ ++} G_STMT_END ++ ++/* return_val_if_invalid_dict (d, val) is like ++ * g_return_val_if_fail (ensure_valid_dict (d), val), except that ++ * the side effects of ensure_valid_dict are evaluated ++ * regardless of whether G_DISABLE_CHECKS is defined or not. */ ++#define return_val_if_invalid_dict(d, val) G_STMT_START { \ ++ gboolean valid_dict G_GNUC_UNUSED = ensure_valid_dict (d); \ ++ g_return_val_if_fail (valid_dict, val); \ ++} G_STMT_END ++ + /** + * g_variant_dict_new: + * @from_asv: (nullable): the #GVariant with which to initialise the +@@ -3991,7 +4027,7 @@ g_variant_dict_lookup (GVariantDict *dict, + GVariant *value; + va_list ap; + +- g_return_val_if_fail (ensure_valid_dict (dict), FALSE); ++ return_val_if_invalid_dict (dict, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (format_string != NULL, FALSE); + +@@ -4036,7 +4072,7 @@ g_variant_dict_lookup_value (GVariantDict *dict, + { + GVariant *result; + +- g_return_val_if_fail (ensure_valid_dict (dict), NULL); ++ return_val_if_invalid_dict (dict, NULL); + g_return_val_if_fail (key != NULL, NULL); + + result = g_hash_table_lookup (GVSD(dict)->values, key); +@@ -4062,7 +4098,7 @@ gboolean + g_variant_dict_contains (GVariantDict *dict, + const gchar *key) + { +- g_return_val_if_fail (ensure_valid_dict (dict), FALSE); ++ return_val_if_invalid_dict (dict, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + return g_hash_table_contains (GVSD(dict)->values, key); +@@ -4090,7 +4126,7 @@ g_variant_dict_insert (GVariantDict *dict, + { + va_list ap; + +- g_return_if_fail (ensure_valid_dict (dict)); ++ return_if_invalid_dict (dict); + g_return_if_fail (key != NULL); + g_return_if_fail (format_string != NULL); + +@@ -4116,7 +4152,7 @@ g_variant_dict_insert_value (GVariantDict *dict, + const gchar *key, + GVariant *value) + { +- g_return_if_fail (ensure_valid_dict (dict)); ++ return_if_invalid_dict (dict); + g_return_if_fail (key != NULL); + g_return_if_fail (value != NULL); + +@@ -4138,7 +4174,7 @@ gboolean + g_variant_dict_remove (GVariantDict *dict, + const gchar *key) + { +- g_return_val_if_fail (ensure_valid_dict (dict), FALSE); ++ return_val_if_invalid_dict (dict, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + return g_hash_table_remove (GVSD(dict)->values, key); +@@ -4172,7 +4208,7 @@ g_variant_dict_clear (GVariantDict *dict) + /* all-zeros case */ + return; + +- g_return_if_fail (ensure_valid_dict (dict)); ++ return_if_invalid_dict (dict); + + g_hash_table_unref (GVSD(dict)->values); + GVSD(dict)->values = NULL; +@@ -4203,7 +4239,7 @@ g_variant_dict_end (GVariantDict *dict) + GHashTableIter iter; + gpointer key, value; + +- g_return_val_if_fail (ensure_valid_dict (dict), NULL); ++ return_val_if_invalid_dict (dict, NULL); + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + diff -Nru glib2.0-2.66.8/debian/patches/Exclude-g_variant_maybe_get_child_value-from-API-document.patch glib2.0-2.66.8/debian/patches/Exclude-g_variant_maybe_get_child_value-from-API-document.patch --- glib2.0-2.66.8/debian/patches/Exclude-g_variant_maybe_get_child_value-from-API-document.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/Exclude-g_variant_maybe_get_child_value-from-API-document.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,36 @@ +From: Simon McVittie +Date: Sat, 30 Sep 2023 11:33:08 +0100 +Subject: Exclude g_variant_maybe_get_child_value from API documentation + +This is an internal function, and not part of the public API/ABI. +GLib 2.66.x fails tests if such functions have a "Since" annotation +pointing to a future branch. + +Forwarded: not-needed, only required because this is a backport +Signed-off-by: Simon McVittie +--- + glib/gvariant-core.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 60cca1e..4d604c4 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1202,7 +1202,7 @@ g_variant_get_child_value (GVariant *value, + } + } + +-/** ++/* + * g_variant_maybe_get_child_value: + * @value: a container #GVariant + * @index_: the index of the child to fetch +@@ -1223,8 +1223,6 @@ g_variant_get_child_value (GVariant *value, + * This function is O(1). + * + * Returns: (transfer full): the child at the specified index +- * +- * Since: 2.74 + */ + GVariant * + g_variant_maybe_get_child_value (GVariant *value, diff -Nru glib2.0-2.66.8/debian/patches/Explain-magic-literals-in-G_VARIANT_-_INIT.patch glib2.0-2.66.8/debian/patches/Explain-magic-literals-in-G_VARIANT_-_INIT.patch --- glib2.0-2.66.8/debian/patches/Explain-magic-literals-in-G_VARIANT_-_INIT.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/Explain-magic-literals-in-G_VARIANT_-_INIT.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,45 @@ +From: Alexander Klauer +Date: Fri, 4 Mar 2022 11:29:58 +0000 +Subject: Explain magic literals in G_VARIANT_*_INIT + +Origin: upstream, 2.67.2, commit:bc2ca9df20818621309595a67101c504c1d10e6c +--- + glib/gvariant.h | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/glib/gvariant.h b/glib/gvariant.h +index c0587a8..5336a72 100644 +--- a/glib/gvariant.h ++++ b/glib/gvariant.h +@@ -360,7 +360,14 @@ GQuark g_variant_parse_error_quark (void); + * + * Since: 2.50 + */ +-#define G_VARIANT_BUILDER_INIT(variant_type) { { { 2942751021u, variant_type, { 0, } } } } ++#define G_VARIANT_BUILDER_INIT(variant_type) \ ++ { \ ++ { \ ++ { \ ++ 2942751021u /* == GVSB_MAGIC_PARTIAL, see gvariant.c */, variant_type, { 0, } \ ++ } \ ++ } \ ++ } + + GLIB_AVAILABLE_IN_ALL + GVariantBuilder * g_variant_builder_new (const GVariantType *type); +@@ -475,7 +482,14 @@ struct _GVariantDict { + * + * Since: 2.50 + */ +-#define G_VARIANT_DICT_INIT(asv) { { { asv, 3488698669u, { 0, } } } } ++#define G_VARIANT_DICT_INIT(asv) \ ++ { \ ++ { \ ++ { \ ++ asv, 3488698669u /* == GVSD_MAGIC_PARTIAL, see gvariant.c */, { 0, } \ ++ } \ ++ } \ ++ } + + GLIB_AVAILABLE_IN_2_40 + GVariantDict * g_variant_dict_new (GVariant *from_asv); diff -Nru glib2.0-2.66.8/debian/patches/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch glib2.0-2.66.8/debian/patches/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch --- glib2.0-2.66.8/debian/patches/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,22 @@ +From: Loic Le Page +Date: Wed, 19 Jan 2022 19:01:55 +0100 +Subject: Fix non-initialized variable in glib/gvariant-parser.c + +Origin: upstream, 2.71.3, commit:28fa4325a45d55f1cf6d03509da7a123bf2a4c72 +--- + glib/gvariant-parser.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c +index bb5238b..1b89259 100644 +--- a/glib/gvariant-parser.c ++++ b/glib/gvariant-parser.c +@@ -1564,7 +1564,7 @@ unicode_unescape (const gchar *src, + { + gchar buffer[9]; + guint64 value = 0; +- gchar *end; ++ gchar *end = NULL; + gsize n_valid_chars; + + (*src_ofs)++; diff -Nru glib2.0-2.66.8/debian/patches/Update-Croatian-translation.patch glib2.0-2.66.8/debian/patches/Update-Croatian-translation.patch --- glib2.0-2.66.8/debian/patches/Update-Croatian-translation.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/Update-Croatian-translation.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,7605 @@ +From: =?utf-8?q?Goran_Vidovi=C4=87?= +Date: Wed, 27 Oct 2021 17:16:17 +0000 +Subject: Update Croatian translation + +Origin: upstream, 2.66.9, commit:284b7eb7f202fe6fa25cae2fb56437d8abf70929 +--- + po/hr.po | 3587 ++++++++++++++++++++++++++++++++------------------------------ + 1 file changed, 1867 insertions(+), 1720 deletions(-) + +diff --git a/po/hr.po b/po/hr.po +index a5c0bfc..1a4a135 100644 +--- a/po/hr.po ++++ b/po/hr.po +@@ -5,8 +5,8 @@ msgid "" + msgstr "" + "Project-Id-Version: glib 0\n" + "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" +-"POT-Creation-Date: 2020-09-06 11:28+0000\n" +-"PO-Revision-Date: 2020-09-09 21:23+0200\n" ++"POT-Creation-Date: 2021-10-27 17:11+0000\n" ++"PO-Revision-Date: 2021-10-27 19:13+0200\n" + "Last-Translator: gogo \n" + "Language-Team: Croatian \n" + "Language: hr\n" +@@ -15,7 +15,7 @@ msgstr "" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" + "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +-"X-Launchpad-Export-Date: 2014-01-06 11:59+0000\n" ++"X-Launchpad-Export-Date: 2021-10-27 14:24+0000\n" + "X-Generator: Poedit 2.3\n" + + #: gio/gapplication.c:500 +@@ -39,11 +39,11 @@ msgid "Replace the running instance" + msgstr "Zamijeni pokrenuti primjerak" + + #: gio/gapplication-tool.c:45 gio/gapplication-tool.c:46 gio/gio-tool.c:227 +-#: gio/gresource-tool.c:493 gio/gsettings-tool.c:567 ++#: gio/gresource-tool.c:494 gio/gsettings-tool.c:572 + msgid "Print help" + msgstr "Prikaži pomoć" + +-#: gio/gapplication-tool.c:47 gio/gresource-tool.c:494 gio/gresource-tool.c:562 ++#: gio/gapplication-tool.c:47 gio/gresource-tool.c:495 gio/gresource-tool.c:563 + msgid "[COMMAND]" + msgstr "[NAREDBA]" + +@@ -51,97 +51,97 @@ msgstr "[NAREDBA]" + msgid "Print version" + msgstr "Prikaži inačicu" + +-#: gio/gapplication-tool.c:50 gio/gsettings-tool.c:573 ++#: gio/gapplication-tool.c:50 gio/gsettings-tool.c:578 + msgid "Print version information and exit" + msgstr "Prikaži informaciju inačice i izađi" + +-#: gio/gapplication-tool.c:52 ++#: gio/gapplication-tool.c:53 + msgid "List applications" + msgstr "Prikaži apliakcije" + +-#: gio/gapplication-tool.c:53 ++#: gio/gapplication-tool.c:54 + msgid "List the installed D-Bus activatable applications (by .desktop files)" + msgstr "" + "Prikaži instalirane aplikacije koje se pokreću D-Bus aktivacijom (po ." + "desktop datotekama)" + +-#: gio/gapplication-tool.c:55 ++#: gio/gapplication-tool.c:57 + msgid "Launch an application" +-msgstr "Pokreni program" ++msgstr "Pokreni aplikaciju" + +-#: gio/gapplication-tool.c:56 ++#: gio/gapplication-tool.c:58 + msgid "Launch the application (with optional files to open)" +-msgstr "Pokreni program (s neobaveznim datotekama za otvaranje)" ++msgstr "Pokreni aplikaciju (s neobaveznim datotekama za otvaranje)" + +-#: gio/gapplication-tool.c:57 ++#: gio/gapplication-tool.c:59 + msgid "APPID [FILE…]" +-msgstr "IDAPLIKACIJE [DATOTEKA…]]" ++msgstr "IDAPLIKACIJE [DATOTEKA…]" + +-#: gio/gapplication-tool.c:59 ++#: gio/gapplication-tool.c:61 + msgid "Activate an action" + msgstr "Aktiviraj radnju" + +-#: gio/gapplication-tool.c:60 ++#: gio/gapplication-tool.c:62 + msgid "Invoke an action on the application" + msgstr "Pokreni radnju na aplikaciji" + +-#: gio/gapplication-tool.c:61 ++#: gio/gapplication-tool.c:63 + msgid "APPID ACTION [PARAMETER]" + msgstr "ID APLIKACIJE RADNJE [PARAMETAR]" + +-#: gio/gapplication-tool.c:63 ++#: gio/gapplication-tool.c:65 + msgid "List available actions" + msgstr "Prikaži dostupne radnje" + +-#: gio/gapplication-tool.c:64 ++#: gio/gapplication-tool.c:66 + msgid "List static actions for an application (from .desktop file)" +-msgstr "Prikazuje nepromjenjive radnje za aplikaciju (iz .desktop datoteke)" ++msgstr "Prikaži nepromjenjive radnje za aplikaciju (iz .desktop datoteke)" + +-#: gio/gapplication-tool.c:65 gio/gapplication-tool.c:71 ++#: gio/gapplication-tool.c:67 gio/gapplication-tool.c:73 + msgid "APPID" + msgstr "ID APLIKACIJE" + +-#: gio/gapplication-tool.c:70 gio/gapplication-tool.c:133 gio/gdbus-tool.c:102 ++#: gio/gapplication-tool.c:72 gio/gapplication-tool.c:135 gio/gdbus-tool.c:106 + #: gio/gio-tool.c:224 + msgid "COMMAND" + msgstr "NAREDBA" + +-#: gio/gapplication-tool.c:70 ++#: gio/gapplication-tool.c:72 + msgid "The command to print detailed help for" + msgstr "Naredba za prikaz opširnije pomoći za" + +-#: gio/gapplication-tool.c:71 ++#: gio/gapplication-tool.c:73 + msgid "Application identifier in D-Bus format (eg: org.example.viewer)" + msgstr "Identifikator aplikacije u D-Bus formatu (npr: org.primjer.preglednik)" + +-#: gio/gapplication-tool.c:72 gio/glib-compile-resources.c:738 ++#: gio/gapplication-tool.c:74 gio/glib-compile-resources.c:738 + #: gio/glib-compile-resources.c:744 gio/glib-compile-resources.c:772 +-#: gio/gresource-tool.c:500 gio/gresource-tool.c:566 ++#: gio/gresource-tool.c:501 gio/gresource-tool.c:567 + msgid "FILE" + msgstr "DATOTEKA" + +-#: gio/gapplication-tool.c:72 ++#: gio/gapplication-tool.c:74 + msgid "Optional relative or absolute filenames, or URIs to open" + msgstr "" + "Neobavezni relativni ili apsolutni nazivi datoteka ili URI-ji za otvoriti" + +-#: gio/gapplication-tool.c:73 ++#: gio/gapplication-tool.c:75 + msgid "ACTION" + msgstr "RADNJA" + +-#: gio/gapplication-tool.c:73 ++#: gio/gapplication-tool.c:75 + msgid "The action name to invoke" + msgstr "Naziv radnje za pokrenuti" + +-#: gio/gapplication-tool.c:74 ++#: gio/gapplication-tool.c:76 + msgid "PARAMETER" + msgstr "PARAMETAR" + +-#: gio/gapplication-tool.c:74 ++#: gio/gapplication-tool.c:76 + msgid "Optional parameter to the action invocation, in GVariant format" + msgstr "Neobavezni parametri za pokretanje radnje u GVariant formatu" + +-#: gio/gapplication-tool.c:96 gio/gresource-tool.c:531 gio/gsettings-tool.c:659 ++#: gio/gapplication-tool.c:98 gio/gresource-tool.c:532 gio/gsettings-tool.c:664 + #, c-format + msgid "" + "Unknown command %s\n" +@@ -150,35 +150,35 @@ msgstr "" + "Nepoznata naredba %s\n" + "\n" + +-#: gio/gapplication-tool.c:101 ++#: gio/gapplication-tool.c:103 + msgid "Usage:\n" + msgstr "Upotreba:\n" + +-#: gio/gapplication-tool.c:114 gio/gresource-tool.c:556 +-#: gio/gsettings-tool.c:694 ++#: gio/gapplication-tool.c:116 gio/gresource-tool.c:557 ++#: gio/gsettings-tool.c:699 + msgid "Arguments:\n" + msgstr "Argumenti:\n" + +-#: gio/gapplication-tool.c:133 gio/gio-tool.c:224 ++#: gio/gapplication-tool.c:135 gio/gio-tool.c:224 + msgid "[ARGS…]" + msgstr "[ARGUMENTI…]" + +-#: gio/gapplication-tool.c:134 ++#: gio/gapplication-tool.c:136 + #, c-format + msgid "Commands:\n" + msgstr "Naredbe:\n" + + #. Translators: do not translate 'help', but please translate 'COMMAND'. +-#: gio/gapplication-tool.c:146 ++#: gio/gapplication-tool.c:148 + #, c-format + msgid "" + "Use “%s help COMMAND” to get detailed help.\n" + "\n" + msgstr "" +-"Koristite “%s NAREDBU pomoći” za opširniju pomoć.\n" ++"Koristite “%s help NAREDBU” za opširniju pomoć.\n" + "\n" + +-#: gio/gapplication-tool.c:165 ++#: gio/gapplication-tool.c:167 + #, c-format + msgid "" + "%s command requires an application id to directly follow\n" +@@ -187,13 +187,13 @@ msgstr "" + "%s naredba zahtijeva id aplikacije za izravno slijeđenje\n" + "\n" + +-#: gio/gapplication-tool.c:171 ++#: gio/gapplication-tool.c:173 + #, c-format + msgid "invalid application id: “%s”\n" + msgstr "nevaljani id aplikacije: “%s”\n" + + #. Translators: %s is replaced with a command name like 'list-actions' +-#: gio/gapplication-tool.c:182 ++#: gio/gapplication-tool.c:184 + #, c-format + msgid "" + "“%s” takes no arguments\n" +@@ -202,21 +202,21 @@ msgstr "" + "“%s” ne prihvaća argumente\n" + "\n" + +-#: gio/gapplication-tool.c:266 ++#: gio/gapplication-tool.c:268 + #, c-format + msgid "unable to connect to D-Bus: %s\n" + msgstr "nemoguće povezivanje sa D-Bus: %s\n" + +-#: gio/gapplication-tool.c:286 ++#: gio/gapplication-tool.c:288 + #, c-format + msgid "error sending %s message to application: %s\n" + msgstr "greška slanja %s poruke u aplikaciju: %s\n" + +-#: gio/gapplication-tool.c:317 ++#: gio/gapplication-tool.c:319 + msgid "action name must be given after application id\n" + msgstr "naziv radnje mora biti naveden nakon id-a aplikacije\n" + +-#: gio/gapplication-tool.c:325 ++#: gio/gapplication-tool.c:327 + #, c-format + msgid "" + "invalid action name: “%s”\n" +@@ -225,25 +225,26 @@ msgstr "" + "nevaljan naziv radnje: “%s”\n" + "naziv radnje mora sadržavati brojčano-slovne znakove, “-” i “.”\n" + +-#: gio/gapplication-tool.c:344 ++#: gio/gapplication-tool.c:346 + #, c-format + msgid "error parsing action parameter: %s\n" + msgstr "greška obrade parametara radnje: %s\n" + +-#: gio/gapplication-tool.c:356 ++#: gio/gapplication-tool.c:358 + msgid "actions accept a maximum of one parameter\n" + msgstr "radnja prihvaća najviše jedan parametar\n" + +-#: gio/gapplication-tool.c:411 ++#: gio/gapplication-tool.c:413 + msgid "list-actions command takes only the application id" + msgstr "list-actions naredba prihvaća samo id aplikacije" + +-#: gio/gapplication-tool.c:421 ++#: gio/gapplication-tool.c:423 + #, c-format + msgid "unable to find desktop file for application %s\n" +-msgstr "nemoguće pronalazak datoteke radne površine za aplikaciju %s\n" ++msgstr "" ++"nemoguće pronalazak datoteke radne površine (.desktop) za aplikaciju %s\n" + +-#: gio/gapplication-tool.c:466 ++#: gio/gapplication-tool.c:468 + #, c-format + msgid "" + "unrecognised command: %s\n" +@@ -253,8 +254,8 @@ msgstr "" + "\n" + + #: gio/gbufferedinputstream.c:420 gio/gbufferedinputstream.c:498 +-#: gio/ginputstream.c:179 gio/ginputstream.c:379 gio/ginputstream.c:617 +-#: gio/ginputstream.c:1019 gio/goutputstream.c:223 gio/goutputstream.c:1049 ++#: gio/ginputstream.c:179 gio/ginputstream.c:379 gio/ginputstream.c:648 ++#: gio/ginputstream.c:1050 gio/goutputstream.c:223 gio/goutputstream.c:1049 + #: gio/gpollableinputstream.c:205 gio/gpollableoutputstream.c:277 + #, c-format + msgid "Too large count value passed to %s" +@@ -265,11 +266,11 @@ msgstr "Prevelika brojčana vrijednost proslijeđena u %s" + msgid "Seek not supported on base stream" + msgstr "Premotavanje nije podržano na osnovnom strujanju" + +-#: gio/gbufferedinputstream.c:937 ++#: gio/gbufferedinputstream.c:938 + msgid "Cannot truncate GBufferedInputStream" + msgstr "Nemoguće skraćivanje GBufferedInputStreama" + +-#: gio/gbufferedinputstream.c:982 gio/ginputstream.c:1208 gio/giostream.c:300 ++#: gio/gbufferedinputstream.c:983 gio/ginputstream.c:1239 gio/giostream.c:300 + #: gio/goutputstream.c:2198 + msgid "Stream is already closed" + msgstr "Strujanje je već zatvoreno" +@@ -278,7 +279,7 @@ msgstr "Strujanje je već zatvoreno" + msgid "Truncate not supported on base stream" + msgstr "Skraćivanje nije podržano na osnovnom strujanju" + +-#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 ++#: gio/gcancellable.c:319 gio/gdbusconnection.c:1872 gio/gdbusprivate.c:1416 + #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 + #, c-format + msgid "Operation was cancelled" +@@ -297,33 +298,33 @@ msgid "Not enough space in destination" + msgstr "Nedovoljno prostora u odredištu" + + #: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848 +-#: gio/gdatainputstream.c:1261 glib/gconvert.c:448 glib/gconvert.c:878 +-#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461 +-#: glib/gutf8.c:875 glib/gutf8.c:1328 ++#: gio/gdatainputstream.c:1266 glib/gconvert.c:449 glib/gconvert.c:879 ++#: glib/giochannel.c:1573 glib/giochannel.c:1615 glib/giochannel.c:2470 ++#: glib/gutf8.c:875 glib/gutf8.c:1329 + msgid "Invalid byte sequence in conversion input" + msgstr "Neispravan niz bajta na ulazu pretvorbe" + +-#: gio/gcharsetconverter.c:347 glib/gconvert.c:456 glib/gconvert.c:792 +-#: glib/giochannel.c:1571 glib/giochannel.c:2473 ++#: gio/gcharsetconverter.c:347 glib/gconvert.c:457 glib/gconvert.c:793 ++#: glib/giochannel.c:1580 glib/giochannel.c:2482 + #, c-format + msgid "Error during conversion: %s" +-msgstr "Greška pri pretvorbi: %s" ++msgstr "Greška tijekom pretvorbe: %s" + +-#: gio/gcharsetconverter.c:445 gio/gsocket.c:1133 ++#: gio/gcharsetconverter.c:445 gio/gsocket.c:1143 + msgid "Cancellable initialization not supported" + msgstr "Prekidanje pokretanja nije podržano" + +-#: gio/gcharsetconverter.c:456 glib/gconvert.c:321 glib/giochannel.c:1392 ++#: gio/gcharsetconverter.c:456 glib/gconvert.c:322 glib/giochannel.c:1401 + #, c-format + msgid "Conversion from character set “%s” to “%s” is not supported" + msgstr "Pretvaranje iz znakovnog skupa “%s” u “%s” nije podržano" + +-#: gio/gcharsetconverter.c:460 glib/gconvert.c:325 ++#: gio/gcharsetconverter.c:460 glib/gconvert.c:326 + #, c-format + msgid "Could not open converter from “%s” to “%s”" + msgstr "Nemoguće je otvoriti pretvornik iz “%s” u “%s”" + +-#: gio/gcontenttype.c:452 ++#: gio/gcontenttype.c:454 + #, c-format + msgid "%s type" + msgstr "%s vrsta" +@@ -359,19 +360,19 @@ msgstr "Podvala vjerodajnica nije moguća na ovom OS-u" + + #: gio/gdatainputstream.c:304 + msgid "Unexpected early end-of-stream" +-msgstr "Neočekivani prerani kraj strujanja" ++msgstr "Neočekivani prerani završetak strujanja" + +-#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:321 ++#: gio/gdbusaddress.c:159 gio/gdbusaddress.c:233 gio/gdbusaddress.c:322 + #, c-format + msgid "Unsupported key “%s” in address entry “%s”" + msgstr "Nepodržani ključ “%s” u unosu adrese “%s”" + +-#: gio/gdbusaddress.c:171 ++#: gio/gdbusaddress.c:172 + #, c-format + msgid "Meaningless key/value pair combination in address entry “%s”" + msgstr "Besmislena kombinacija para ključa/vrijednosti u unosu adrese “%s”" + +-#: gio/gdbusaddress.c:180 ++#: gio/gdbusaddress.c:181 + #, c-format + msgid "" + "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " +@@ -380,28 +381,28 @@ msgstr "" + "Adresa “%s” je nevaljana (potrebna je točno jedna putanja, dir, privremeni " + "dir ili apstraktni ključ)" + +-#: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273 +-#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347 ++#: gio/gdbusaddress.c:248 gio/gdbusaddress.c:259 gio/gdbusaddress.c:274 ++#: gio/gdbusaddress.c:337 gio/gdbusaddress.c:348 + #, c-format + msgid "Error in address “%s” — the “%s” attribute is malformed" + msgstr "Greška u adresi “%s” — “%s” svojstvo je oštećeno" + +-#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681 ++#: gio/gdbusaddress.c:418 gio/gdbusaddress.c:682 + #, c-format + msgid "Unknown or unsupported transport “%s” for address “%s”" + msgstr "Nepoznati ili nepodržani prijenos “%s” za adresu “%s”" + +-#: gio/gdbusaddress.c:461 ++#: gio/gdbusaddress.c:462 + #, c-format + msgid "Address element “%s” does not contain a colon (:)" + msgstr "Element adrese “%s” ne sadrži dvotočku (:)" + +-#: gio/gdbusaddress.c:470 ++#: gio/gdbusaddress.c:471 + #, c-format + msgid "Transport name in address element “%s” must not be empty" + msgstr "Naziv prijenosa u elementu adrese “%s” ne može biti prazan" + +-#: gio/gdbusaddress.c:491 ++#: gio/gdbusaddress.c:492 + #, c-format + msgid "" + "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " +@@ -410,7 +411,7 @@ msgstr "" + "Par ključa/vrijednosti %d, “%s”, u elementu adrese “%s” ne sadrže znak " + "jednakosti" + +-#: gio/gdbusaddress.c:502 ++#: gio/gdbusaddress.c:503 + #, c-format + msgid "" + "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" +@@ -418,7 +419,7 @@ msgstr "" + "Par ključa/vrijednosti %d, “%s”, u elementu adrese “%s” ne mogu sadržavati " + "prazan ključ" + +-#: gio/gdbusaddress.c:516 ++#: gio/gdbusaddress.c:517 + #, c-format + msgid "" + "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " +@@ -427,88 +428,88 @@ msgstr "" + "Greška neizbjegavanja ključa ili vrijednosti u paru ključa/vrijednosti %d, " + "“%s”, u elementu adrese “%s”" + +-#: gio/gdbusaddress.c:588 ++#: gio/gdbusaddress.c:589 + #, c-format + msgid "" + "Error in address “%s” — the unix transport requires exactly one of the keys " + "“path” or “abstract” to be set" + msgstr "" + "Greška u adresi “%s” — unix prijenos zahtijeva točno postavljeno jedno " +-"ključevo “putanju” ili “apstraktan” svojstvo" ++"ključevo “path” ili “abstract” svojstvo" + +-#: gio/gdbusaddress.c:624 ++#: gio/gdbusaddress.c:625 + #, c-format + msgid "Error in address “%s” — the host attribute is missing or malformed" + msgstr "Greška u adresi “%s” — svojstvo poslužitelja nedostaje ili je oštećeno" + +-#: gio/gdbusaddress.c:638 ++#: gio/gdbusaddress.c:639 + #, c-format + msgid "Error in address “%s” — the port attribute is missing or malformed" + msgstr "Greška u adresi “%s” — svojstvo ulaza nedostaje ili je oštećeno" + +-#: gio/gdbusaddress.c:652 ++#: gio/gdbusaddress.c:653 + #, c-format + msgid "Error in address “%s” — the noncefile attribute is missing or malformed" + msgstr "" + "Greška u adresi “%s” — svojstvo jednokratne datoteke nedostaje ili je " + "oštećeno" + +-#: gio/gdbusaddress.c:673 ++#: gio/gdbusaddress.c:674 + msgid "Error auto-launching: " + msgstr "Greška automatskog pokretanja: " + +-#: gio/gdbusaddress.c:726 ++#: gio/gdbusaddress.c:727 + #, c-format + msgid "Error opening nonce file “%s”: %s" + msgstr "Greška otvaranja jednokratne datoteke “%s”: %s" + +-#: gio/gdbusaddress.c:745 ++#: gio/gdbusaddress.c:746 + #, c-format + msgid "Error reading from nonce file “%s”: %s" + msgstr "Greška čitanja iz jednokratne datoteke “%s”: %s" + +-#: gio/gdbusaddress.c:754 ++#: gio/gdbusaddress.c:755 + #, c-format + msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" + msgstr "" + "Greška čitanja iz jednokratne datoteke “%s”, očekivano je 16 bajta, dobiveno " + "je %d" + +-#: gio/gdbusaddress.c:772 ++#: gio/gdbusaddress.c:773 + #, c-format + msgid "Error writing contents of nonce file “%s” to stream:" + msgstr "Greška zapisivanja sadržaja jednokratne datoteke “%s” u strujanje:" + +-#: gio/gdbusaddress.c:981 ++#: gio/gdbusaddress.c:988 + msgid "The given address is empty" + msgstr "Navedena adresa je prazna" + +-#: gio/gdbusaddress.c:1094 ++#: gio/gdbusaddress.c:1101 + #, c-format + msgid "Cannot spawn a message bus when setuid" +-msgstr "Nemoguće pokretanje sabirnice poruke pri podešavanju uid-a" ++msgstr "Nemoguće pokretanje sabirnice poruke pri uid podešavanju" + +-#: gio/gdbusaddress.c:1101 ++#: gio/gdbusaddress.c:1108 + msgid "Cannot spawn a message bus without a machine-id: " + msgstr "Nemoguće pokretanje sabirnice poruke bez id-računala: " + +-#: gio/gdbusaddress.c:1108 ++#: gio/gdbusaddress.c:1115 + #, c-format + msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" + msgstr "Nemoguće automatsko pokretanje bez X11 $DISPLAY" + +-#: gio/gdbusaddress.c:1150 ++#: gio/gdbusaddress.c:1157 + #, c-format + msgid "Error spawning command line “%s”: " + msgstr "Greška pokretanja naredbenog redka “%s”: " + +-#: gio/gdbusaddress.c:1219 ++#: gio/gdbusaddress.c:1226 + #, c-format + msgid "Cannot determine session bus address (not implemented for this OS)" + msgstr "" + "Nemoguće otkrivanje adrese sabirnice sesije (nije implementirano za ovaj OS)" + +-#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 ++#: gio/gdbusaddress.c:1375 gio/gdbusconnection.c:7261 + #, c-format + msgid "" + "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +@@ -517,7 +518,7 @@ msgstr "" + "Nemoguće otkrivanje adrese sabirnice iz DBUS_STARTER_BUS_TYPE varijable " + "okruženja — nepoznata vrijednost “%s”" + +-#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 ++#: gio/gdbusaddress.c:1384 gio/gdbusconnection.c:7270 + msgid "" + "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " + "variable is not set" +@@ -525,7 +526,7 @@ msgstr "" + "Nemoguće otkrivanje adrese sabirnice zato jer DBUS_STARTER_BUS_TYPE " + "varijabla okruženja nije postavljena" + +-#: gio/gdbusaddress.c:1376 ++#: gio/gdbusaddress.c:1394 + #, c-format + msgid "Unknown bus type %d" + msgstr "Nepoznata vrsta sabirnice %d" +@@ -545,201 +546,221 @@ msgid "" + msgstr "" + "Iscrpljeni su svi dostupni mehanizmi ovjere (isprobano: %s) (dostupno: %s)" + +-#: gio/gdbusauth.c:1167 ++#: gio/gdbusauth.c:1171 ++msgid "User IDs must be the same for peer and server" ++msgstr "Korisnički ID mora biti isti za točku ili poslužitelj" ++ ++#: gio/gdbusauth.c:1183 + msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" + msgstr "Poništeno putem GDBusAuthObserver::authorize-authenticated-peer" + +-#: gio/gdbusauthmechanismsha1.c:265 ++#: gio/gdbusauthmechanismsha1.c:298 + #, c-format + msgid "Error when getting information for directory “%s”: %s" +-msgstr "Greška pri dobivanju informacija za direktorij “%s”: %s" ++msgstr "Greška dobivanja informacija za direktorij “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:280 ++#: gio/gdbusauthmechanismsha1.c:313 + #, c-format + msgid "" + "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" + msgstr "" +-"Dozvole na direktoriju “%s” su oštećene. Očekivano dozvole 0700, dobivene 0%o" ++"Dozvole na direktoriju “%s” su oštećene. Očekivana dozvola 0700, dobivena je " ++"0%o" + +-#: gio/gdbusauthmechanismsha1.c:310 ++#: gio/gdbusauthmechanismsha1.c:346 gio/gdbusauthmechanismsha1.c:357 + #, c-format + msgid "Error creating directory “%s”: %s" + msgstr "Greška stvaranja direktorija “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:355 ++#: gio/gdbusauthmechanismsha1.c:359 gio/gfile.c:1068 gio/gfile.c:1306 ++#: gio/gfile.c:1444 gio/gfile.c:1682 gio/gfile.c:1737 gio/gfile.c:1795 ++#: gio/gfile.c:1879 gio/gfile.c:1936 gio/gfile.c:2000 gio/gfile.c:2055 ++#: gio/gfile.c:3760 gio/gfile.c:3815 gio/gfile.c:4108 gio/gfile.c:4578 ++#: gio/gfile.c:4989 gio/gfile.c:5074 gio/gfile.c:5164 gio/gfile.c:5261 ++#: gio/gfile.c:5348 gio/gfile.c:5449 gio/gfile.c:8159 gio/gfile.c:8249 ++#: gio/gfile.c:8333 gio/win32/gwinhttpfile.c:453 ++msgid "Operation not supported" ++msgstr "Radnja nije podržana" ++ ++#: gio/gdbusauthmechanismsha1.c:402 + #, c-format + msgid "Error opening keyring “%s” for reading: " + msgstr "Greška otvaranja skupa ključeva “%s” za čitanje: " + +-#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 ++#: gio/gdbusauthmechanismsha1.c:425 gio/gdbusauthmechanismsha1.c:747 + #, c-format + msgid "Line %d of the keyring at “%s” with content “%s” is malformed" + msgstr "Redak %d skupa ključeva na “%s” sa sadržajem “%s” je oštećen" + +-#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 ++#: gio/gdbusauthmechanismsha1.c:439 gio/gdbusauthmechanismsha1.c:761 + #, c-format + msgid "" + "First token of line %d of the keyring at “%s” with content “%s” is malformed" + msgstr "" + "Prvi token redka %d skupa ključeva na “%s” sa sadržajem “%s” je oštećen" + +-#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 ++#: gio/gdbusauthmechanismsha1.c:453 gio/gdbusauthmechanismsha1.c:775 + #, c-format + msgid "" + "Second token of line %d of the keyring at “%s” with content “%s” is malformed" + msgstr "" + "Drugi token redka %d skupa ključeva na “%s” sa sadržajem “%s” je oštećen" + +-#: gio/gdbusauthmechanismsha1.c:430 ++#: gio/gdbusauthmechanismsha1.c:477 + #, c-format + msgid "Didn’t find cookie with id %d in the keyring at “%s”" +-msgstr "Nije pronađen kolačić s ID-ijem %d u skupu ključeva na “%s”" ++msgstr "Nije pronađen kolačić s ID %d u skupu ključeva na “%s”" + +-#: gio/gdbusauthmechanismsha1.c:476 ++#: gio/gdbusauthmechanismsha1.c:523 + #, c-format + msgid "Error creating lock file “%s”: %s" + msgstr "Greška stvaranja datoteke zaključavanja “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:540 ++#: gio/gdbusauthmechanismsha1.c:587 + #, c-format + msgid "Error deleting stale lock file “%s”: %s" + msgstr "Greška brisanja zaostale datoteke zaključavanja “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:579 ++#: gio/gdbusauthmechanismsha1.c:626 + #, c-format + msgid "Error closing (unlinked) lock file “%s”: %s" + msgstr "Greška zatvaranja (nepovezane) datoteke zaključavanja “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:590 ++#: gio/gdbusauthmechanismsha1.c:637 + #, c-format + msgid "Error unlinking lock file “%s”: %s" + msgstr "Greška uklanjanja poveznice datoteke zaključavanja “%s”: %s" + +-#: gio/gdbusauthmechanismsha1.c:667 ++#: gio/gdbusauthmechanismsha1.c:714 + #, c-format + msgid "Error opening keyring “%s” for writing: " + msgstr "Greška otvaranja skupa ključeva “%s” za zapisivanje: " + +-#: gio/gdbusauthmechanismsha1.c:865 ++#: gio/gdbusauthmechanismsha1.c:908 + #, c-format + msgid "(Additionally, releasing the lock for “%s” also failed: %s) " + msgstr "(Dodatno, oslobađanje zaključavanja za “%s” je isto neuspjelo: %s) " + +-#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391 ++#: gio/gdbusconnection.c:603 gio/gdbusconnection.c:2417 + msgid "The connection is closed" + msgstr "Povezivanje je zatvoreno" + +-#: gio/gdbusconnection.c:1892 ++#: gio/gdbusconnection.c:1902 + msgid "Timeout was reached" + msgstr "Vrijeme isteka dostignuto" + +-#: gio/gdbusconnection.c:2513 ++#: gio/gdbusconnection.c:2540 + msgid "" + "Unsupported flags encountered when constructing a client-side connection" + msgstr "" + "Nepodržane oznake pronađene pri izgradnje povezivanja od strane klijenta" + +-#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 ++#: gio/gdbusconnection.c:4189 gio/gdbusconnection.c:4536 + #, c-format + msgid "" + "No such interface “org.freedesktop.DBus.Properties” on object at path %s" + msgstr "" + "Nema takvog sučelja “org.freedesktop.DBus.Properties” na putanji objekta %s" + +-#: gio/gdbusconnection.c:4305 ++#: gio/gdbusconnection.c:4331 + #, c-format + msgid "No such property “%s”" + msgstr "Nema takvog svojstva “%s”" + +-#: gio/gdbusconnection.c:4317 ++#: gio/gdbusconnection.c:4343 + #, c-format + msgid "Property “%s” is not readable" + msgstr "Svojstvo “%s” nije čitljivo" + +-#: gio/gdbusconnection.c:4328 ++#: gio/gdbusconnection.c:4354 + #, c-format + msgid "Property “%s” is not writable" + msgstr "Svojstvo “%s” nije zapisivo" + +-#: gio/gdbusconnection.c:4348 ++#: gio/gdbusconnection.c:4374 + #, c-format + msgid "Error setting property “%s”: Expected type “%s” but got “%s”" + msgstr "" + "Greška postavljanja svojstva “%s”: Očekivana je vrsta “%s” ali je dobivena " + "“%s”" + +-#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +-#: gio/gdbusconnection.c:6632 ++#: gio/gdbusconnection.c:4479 gio/gdbusconnection.c:4687 ++#: gio/gdbusconnection.c:6689 + #, c-format + msgid "No such interface “%s”" + msgstr "Nema takvog sučelja “%s”" + +-#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 ++#: gio/gdbusconnection.c:4905 gio/gdbusconnection.c:7201 + #, c-format + msgid "No such interface “%s” on object at path %s" + msgstr "Nema takvog sučelja “%s” na putanji objekta %s" + +-#: gio/gdbusconnection.c:4977 ++#: gio/gdbusconnection.c:5003 + #, c-format + msgid "No such method “%s”" + msgstr "Nema takvog načina “%s”" + +-#: gio/gdbusconnection.c:5008 ++#: gio/gdbusconnection.c:5034 + #, c-format + msgid "Type of message, “%s”, does not match expected type “%s”" + msgstr "Vrsta poruke, “%s”, ne podudara se s očekivanom vrstom “%s”" + +-#: gio/gdbusconnection.c:5206 ++#: gio/gdbusconnection.c:5237 + #, c-format + msgid "An object is already exported for the interface %s at %s" + msgstr "Objekt je već izvezen za sučelje %s na %s" + +-#: gio/gdbusconnection.c:5432 ++#: gio/gdbusconnection.c:5463 + #, c-format + msgid "Unable to retrieve property %s.%s" + msgstr "Nemoguće dobivanju svojstva %s.%s" + +-#: gio/gdbusconnection.c:5488 ++#: gio/gdbusconnection.c:5519 + #, c-format + msgid "Unable to set property %s.%s" + msgstr "Nemoguće postavljanje svojstva %s.%s" + +-#: gio/gdbusconnection.c:5666 ++#: gio/gdbusconnection.c:5698 + #, c-format + msgid "Method “%s” returned type “%s”, but expected “%s”" + msgstr "Način “%s” je vratio vrstu “%s”, ali je očekivano “%s”" + +-#: gio/gdbusconnection.c:6743 ++#: gio/gdbusconnection.c:6800 + #, c-format + msgid "Method “%s” on interface “%s” with signature “%s” does not exist" + msgstr "Način “%s” na sučelju “%s” s potpisom “%s” ne posoji" + +-#: gio/gdbusconnection.c:6864 ++#: gio/gdbusconnection.c:6921 + #, c-format + msgid "A subtree is already exported for %s" + msgstr "Podstablo je već izvezeno za %s" + +-#: gio/gdbusmessage.c:1255 ++#: gio/gdbusconnection.c:7209 ++#, c-format ++msgid "Object does not exist at path “%s”" ++msgstr "Objekt ne postoji na putanji “%s”" ++ ++#: gio/gdbusmessage.c:1266 + msgid "type is INVALID" + msgstr "vrsta je NEVALJANA" + +-#: gio/gdbusmessage.c:1266 ++#: gio/gdbusmessage.c:1277 + msgid "METHOD_CALL message: PATH or MEMBER header field is missing" + msgstr "METHOD_CALL poruka: PATH ili MEMBER polja zaglavlja nedostaju" + +-#: gio/gdbusmessage.c:1277 ++#: gio/gdbusmessage.c:1288 + msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" + msgstr "METHOD_RETURN poruka: REPLY_SERIAL polja zaglavlja nedostaju" + +-#: gio/gdbusmessage.c:1289 ++#: gio/gdbusmessage.c:1300 + msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" + msgstr "ERROR poruka: REPLY_SERIAL ili ERROR_NAME polja zaglavlja nedostaju" + +-#: gio/gdbusmessage.c:1302 ++#: gio/gdbusmessage.c:1313 + msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" + msgstr "SIGNAL poruka: PATH, INTERFACE ili MEMBER polja zaglavlja nedostaju" + +-#: gio/gdbusmessage.c:1310 ++#: gio/gdbusmessage.c:1321 + msgid "" + "SIGNAL message: The PATH header field is using the reserved value /org/" + "freedesktop/DBus/Local" +@@ -747,7 +768,7 @@ msgstr "" + "SIGNAL poruka: PATH polje zaglavlja koristi rezerviranu vrijednost /org/" + "freedesktop/DBus/Local" + +-#: gio/gdbusmessage.c:1318 ++#: gio/gdbusmessage.c:1329 + msgid "" + "SIGNAL message: The INTERFACE header field is using the reserved value org." + "freedesktop.DBus.Local" +@@ -755,7 +776,7 @@ msgstr "" + "SIGNAL poruka: INTERFACE polje zaglavlja koristi rezerviranu vrijednost org." + "freedesktop.DBus.Local" + +-#: gio/gdbusmessage.c:1366 gio/gdbusmessage.c:1426 ++#: gio/gdbusmessage.c:1377 gio/gdbusmessage.c:1437 + #, c-format + msgid "Wanted to read %lu byte but only got %lu" + msgid_plural "Wanted to read %lu bytes but only got %lu" +@@ -763,12 +784,12 @@ msgstr[0] "Pokušaj čitanja %lu bajta, ali je dobiven samo %lu" + msgstr[1] "Pokušaj čitanja %lu bajta, ali je dobiven samo %lu" + msgstr[2] "Pokušaj čitanja %lu bajta, ali je dobiven samo %lu" + +-#: gio/gdbusmessage.c:1380 ++#: gio/gdbusmessage.c:1391 + #, c-format + msgid "Expected NUL byte after the string “%s” but found byte %d" + msgstr "Očekivan je nula bajt nakon izraza “%s”, ali je pronađen bajt %d" + +-#: gio/gdbusmessage.c:1399 ++#: gio/gdbusmessage.c:1410 + #, c-format + msgid "" + "Expected valid UTF-8 string but found invalid bytes at byte offset %d " +@@ -777,21 +798,21 @@ msgstr "" + "Očekivan je valjani UTF-8 niz ali su pronađeni nevaljani bajti u pomaku " + "bajta %d (duljina niza je %d). Valjani UTF-8 niz do te točke je bio “%s”" + +-#: gio/gdbusmessage.c:1463 gio/gdbusmessage.c:1711 gio/gdbusmessage.c:1900 ++#: gio/gdbusmessage.c:1474 gio/gdbusmessage.c:1722 gio/gdbusmessage.c:1911 + msgid "Value nested too deeply" + msgstr "Vrijednost je ugniježđena preduboko" + +-#: gio/gdbusmessage.c:1609 ++#: gio/gdbusmessage.c:1620 + #, c-format + msgid "Parsed value “%s” is not a valid D-Bus object path" + msgstr "Obrađena vrijednost “%s” nije valjana D-Bus putanja objekta" + +-#: gio/gdbusmessage.c:1631 ++#: gio/gdbusmessage.c:1642 + #, c-format + msgid "Parsed value “%s” is not a valid D-Bus signature" + msgstr "Obrađena vrijednost “%s” nije valjani D-Bus potpis" + +-#: gio/gdbusmessage.c:1678 ++#: gio/gdbusmessage.c:1689 + #, c-format + msgid "" + "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +@@ -804,7 +825,7 @@ msgstr[1] "" + msgstr[2] "" + "Pronađen je niz duljine %u bajta. Najveća duljina je is 2<<26 bajta (64 MiB)." + +-#: gio/gdbusmessage.c:1698 ++#: gio/gdbusmessage.c:1709 + #, c-format + msgid "" + "Encountered array of type “a%c”, expected to have a length a multiple of %u " +@@ -813,12 +834,12 @@ msgstr "" + "Pronađen je niz vrste “a%c”, očekivano je da ima duljinu umnoška od %u " + "bajta, ali je pronađeno da je duljina %u bajta" + +-#: gio/gdbusmessage.c:1884 ++#: gio/gdbusmessage.c:1895 + #, c-format + msgid "Parsed value “%s” for variant is not a valid D-Bus signature" + msgstr "Obrađena vrijednost “%s” za varijantu nije valjan D-Bus potpis" + +-#: gio/gdbusmessage.c:1925 ++#: gio/gdbusmessage.c:1936 + #, c-format + msgid "" + "Error deserializing GVariant with type string “%s” from the D-Bus wire format" +@@ -826,7 +847,7 @@ msgstr "" + "Greška pri deserijalizaciji GVariante s nizom vrste \"% s\" iz D-Bus formata " + "provodnika" + +-#: gio/gdbusmessage.c:2110 ++#: gio/gdbusmessage.c:2121 + #, c-format + msgid "" + "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " +@@ -835,28 +856,28 @@ msgstr "" + "Nevaljana endian vrijednost. Očekivana je 0x6c (“l”) ili 0x42 (“B”) ali je " + "pronađena vrijednost 0x%02x" + +-#: gio/gdbusmessage.c:2123 ++#: gio/gdbusmessage.c:2134 + #, c-format + msgid "Invalid major protocol version. Expected 1 but found %d" + msgstr "" + "Nevaljana inačica glavnog protokola. Očekivana je 1 ali je pronađena %d" + +-#: gio/gdbusmessage.c:2177 gio/gdbusmessage.c:2773 ++#: gio/gdbusmessage.c:2188 gio/gdbusmessage.c:2784 + msgid "Signature header found but is not of type signature" + msgstr "Zaglavlje potpisa je pronađeno ali nije prikladna vrsta potpisa" + +-#: gio/gdbusmessage.c:2189 ++#: gio/gdbusmessage.c:2200 + #, c-format + msgid "Signature header with signature “%s” found but message body is empty" + msgstr "" + "Zaglavlje potpisa s potpisom “%s” je pronađeno ali tijelo poruke je prazno" + +-#: gio/gdbusmessage.c:2204 ++#: gio/gdbusmessage.c:2215 + #, c-format + msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" + msgstr "Obrađena vrijednost “%s” nije valjan D-Bus potpis (za tijelo)" + +-#: gio/gdbusmessage.c:2236 ++#: gio/gdbusmessage.c:2247 + #, c-format + msgid "No signature header in message but the message body is %u byte" + msgid_plural "No signature header in message but the message body is %u bytes" +@@ -864,34 +885,34 @@ msgstr[0] "Nema zaglavlja potpisa u poruci ali tijelo poruke je %u bajt" + msgstr[1] "Nema zaglavlja potpisa u poruci ali tijelo poruke je %u bajta" + msgstr[2] "Nema zaglavlja potpisa u poruci ali tijelo poruke je %u bajta" + +-#: gio/gdbusmessage.c:2246 ++#: gio/gdbusmessage.c:2257 + msgid "Cannot deserialize message: " + msgstr "Nemoguća deserijalizacija poruke: " + +-#: gio/gdbusmessage.c:2590 ++#: gio/gdbusmessage.c:2601 + #, c-format + msgid "" + "Error serializing GVariant with type string “%s” to the D-Bus wire format" + msgstr "" + "Greška serijalizacije GVariante s nizom vrste “%s” u D-Bus formata provodnika" + +-#: gio/gdbusmessage.c:2727 ++#: gio/gdbusmessage.c:2738 + #, c-format + msgid "" + "Number of file descriptors in message (%d) differs from header field (%d)" + msgstr "" + "Broj opisnika datoteke u poruci (%d) razlikuje se od polja zaglavlja (%d)" + +-#: gio/gdbusmessage.c:2735 ++#: gio/gdbusmessage.c:2746 + msgid "Cannot serialize message: " + msgstr "Nemoguća serijalizacija poruke: " + +-#: gio/gdbusmessage.c:2788 ++#: gio/gdbusmessage.c:2799 + #, c-format + msgid "Message body has signature “%s” but there is no signature header" + msgstr "Tijelo poruke ima potpis “%s”, ali ne sadrži zaglavlje potpisa" + +-#: gio/gdbusmessage.c:2798 ++#: gio/gdbusmessage.c:2809 + #, c-format + msgid "" + "Message body has type signature “%s” but signature in the header field is " +@@ -899,50 +920,52 @@ msgid "" + msgstr "" + "Tijelo poruke ima vrstu potpisa “%s”, ali potpis u polju zaglavlja je “%s”" + +-#: gio/gdbusmessage.c:2814 ++#: gio/gdbusmessage.c:2825 + #, c-format + msgid "Message body is empty but signature in the header field is “(%s)”" + msgstr "Tijelo poruke je prazno, ali potpis u polju zaglavlja je “(%s)”" + +-#: gio/gdbusmessage.c:3367 ++#: gio/gdbusmessage.c:3380 + #, c-format + msgid "Error return with body of type “%s”" + msgstr "Vraćena je greška s tijelom vrste “%s”" + +-#: gio/gdbusmessage.c:3375 ++#: gio/gdbusmessage.c:3388 + msgid "Error return with empty body" + msgstr "Vraćena je greška s praznim tijelom" + +-#: gio/gdbusprivate.c:2244 ++#: gio/gdbusprivate.c:2246 + #, c-format + msgid "(Type any character to close this window)\n" + msgstr "(Upišite bilo kakav znak za zatvaranje ovog prozora)\n" + +-#: gio/gdbusprivate.c:2418 ++#: gio/gdbusprivate.c:2420 + #, c-format + msgid "Session dbus not running, and autolaunch failed" + msgstr "Dbus sesije nije pokrenut, automatsko pokretanje neuspjelo" + +-#: gio/gdbusprivate.c:2441 ++#: gio/gdbusprivate.c:2443 + #, c-format + msgid "Unable to get Hardware profile: %s" + msgstr "Neuspjelo dobivanje profila hardvera: %s" + +-#: gio/gdbusprivate.c:2486 +-msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +-msgstr "Nemoguće učitavanje /var/lib/dbus/machine-id ili /etc/machine-id: " ++#. Translators: Both placeholders are file paths ++#: gio/gdbusprivate.c:2494 ++#, c-format ++msgid "Unable to load %s or %s: " ++msgstr "Nemoguće učitavanje %s ili %s: " + +-#: gio/gdbusproxy.c:1562 ++#: gio/gdbusproxy.c:1569 + #, c-format + msgid "Error calling StartServiceByName for %s: " + msgstr "Greška poziva StartServiceByName za %s: " + +-#: gio/gdbusproxy.c:1585 ++#: gio/gdbusproxy.c:1592 + #, c-format + msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" + msgstr "Neočekivan odgovor %d od StartServiceByName(\"%s\") načina" + +-#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 ++#: gio/gdbusproxy.c:2699 gio/gdbusproxy.c:2834 + #, c-format + msgid "" + "Cannot invoke method; proxy is for the well-known name %s without an owner, " +@@ -951,30 +974,30 @@ msgstr "" + "Nemoguć poziv načina; proxy je za dobro poznati naziv %s bez vlasnika, a " + "proxy je konstruiran sa G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START oznakom" + +-#: gio/gdbusserver.c:755 ++#: gio/gdbusserver.c:767 + msgid "Abstract namespace not supported" + msgstr "Apstraktan prostor naziva nije podržan" + +-#: gio/gdbusserver.c:848 ++#: gio/gdbusserver.c:860 + msgid "Cannot specify nonce file when creating a server" + msgstr "Nemoguće određivanje jednokratne datoteke pri stvaranju poslužitelja" + +-#: gio/gdbusserver.c:930 ++#: gio/gdbusserver.c:942 + #, c-format + msgid "Error writing nonce file at “%s”: %s" + msgstr "Greška zapisivanja jednokratne datoteke na “%s”: %s" + +-#: gio/gdbusserver.c:1103 ++#: gio/gdbusserver.c:1117 + #, c-format + msgid "The string “%s” is not a valid D-Bus GUID" + msgstr "Izraz “%s” nije valjan D-Bus GUID" + +-#: gio/gdbusserver.c:1143 ++#: gio/gdbusserver.c:1157 + #, c-format + msgid "Cannot listen on unsupported transport “%s”" + msgstr "Nemoguće osluškivanje nepodržanog prijenosa “%s”" + +-#: gio/gdbus-tool.c:107 ++#: gio/gdbus-tool.c:111 + #, c-format + msgid "" + "Commands:\n" +@@ -997,60 +1020,66 @@ msgstr "" + "\n" + "Koristite “%s NAREDBA --help” za dobivanje pomoći pojedine naredbe.\n" + +-#: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336 +-#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187 +-#: gio/gdbus-tool.c:1672 ++#: gio/gdbus-tool.c:201 gio/gdbus-tool.c:273 gio/gdbus-tool.c:345 ++#: gio/gdbus-tool.c:369 gio/gdbus-tool.c:859 gio/gdbus-tool.c:1236 ++#: gio/gdbus-tool.c:1724 + #, c-format + msgid "Error: %s\n" + msgstr "Greška: %s\n" + +-#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688 ++#: gio/gdbus-tool.c:212 gio/gdbus-tool.c:286 gio/gdbus-tool.c:1740 + #, c-format + msgid "Error parsing introspection XML: %s\n" + msgstr "Greška preispitivanja XML-a: %s\n" + +-#: gio/gdbus-tool.c:246 ++#: gio/gdbus-tool.c:250 + #, c-format + msgid "Error: %s is not a valid name\n" + msgstr "Greška: %s nije valjani naziv\n" + +-#: gio/gdbus-tool.c:394 ++#: gio/gdbus-tool.c:255 gio/gdbus-tool.c:745 gio/gdbus-tool.c:1060 ++#: gio/gdbus-tool.c:1890 gio/gdbus-tool.c:2130 ++#, c-format ++msgid "Error: %s is not a valid object path\n" ++msgstr "Greška: %s nije valjana putanja objekta\n" ++ ++#: gio/gdbus-tool.c:403 + msgid "Connect to the system bus" + msgstr "Povezivanje sa sabirnicom sustava" + +-#: gio/gdbus-tool.c:395 ++#: gio/gdbus-tool.c:404 + msgid "Connect to the session bus" + msgstr "Povezivanje sa sabirnicom sesije" + +-#: gio/gdbus-tool.c:396 ++#: gio/gdbus-tool.c:405 + msgid "Connect to given D-Bus address" + msgstr "Povezivanje sa zadanom D-Bus adresom" + +-#: gio/gdbus-tool.c:406 ++#: gio/gdbus-tool.c:415 + msgid "Connection Endpoint Options:" + msgstr "Mogućnosti krajnje točke povezivanja:" + +-#: gio/gdbus-tool.c:407 ++#: gio/gdbus-tool.c:416 + msgid "Options specifying the connection endpoint" + msgstr "Mogućnosti koje određuju krajnje točke povezivanja" + +-#: gio/gdbus-tool.c:430 ++#: gio/gdbus-tool.c:439 + #, c-format + msgid "No connection endpoint specified" + msgstr "Krajnja točka povezivanja nije određena" + +-#: gio/gdbus-tool.c:440 ++#: gio/gdbus-tool.c:449 + #, c-format + msgid "Multiple connection endpoints specified" + msgstr "Više krajnjih točka povezivanja je određeno" + +-#: gio/gdbus-tool.c:513 ++#: gio/gdbus-tool.c:522 + #, c-format + msgid "" + "Warning: According to introspection data, interface “%s” does not exist\n" + msgstr "Upozorenje: Prema podacima preispitivanja, sučelje “%s” ne postoji\n" + +-#: gio/gdbus-tool.c:522 ++#: gio/gdbus-tool.c:531 + #, c-format + msgid "" + "Warning: According to introspection data, method “%s” does not exist on " +@@ -1059,162 +1088,161 @@ msgstr "" + "Upozorenje: Prema podacima preispitivanja, način “%s” ne postoji na sučelju " + "“%s”\n" + +-#: gio/gdbus-tool.c:584 ++#: gio/gdbus-tool.c:593 + msgid "Optional destination for signal (unique name)" + msgstr "Dodatno odredište za signal (jedinstveni naziv)" + +-#: gio/gdbus-tool.c:585 ++#: gio/gdbus-tool.c:594 + msgid "Object path to emit signal on" + msgstr "Putanja objekta na koje se emitira signal" + +-#: gio/gdbus-tool.c:586 ++#: gio/gdbus-tool.c:595 + msgid "Signal and interface name" + msgstr "Naziv signala i sučelja" + +-#: gio/gdbus-tool.c:619 ++#: gio/gdbus-tool.c:628 + msgid "Emit a signal." + msgstr "Emitiraj signal." + +-#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775 +-#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227 ++#: gio/gdbus-tool.c:683 gio/gdbus-tool.c:997 gio/gdbus-tool.c:1827 ++#: gio/gdbus-tool.c:2059 gio/gdbus-tool.c:2279 + #, c-format + msgid "Error connecting: %s\n" + msgstr "Greška povezivanja: %s\n" + +-#: gio/gdbus-tool.c:694 ++#: gio/gdbus-tool.c:703 + #, c-format + msgid "Error: %s is not a valid unique bus name.\n" + msgstr "Greška: %s nije valjan jedinstven naziv sabirnice.\n" + +-#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818 ++#: gio/gdbus-tool.c:722 gio/gdbus-tool.c:1040 gio/gdbus-tool.c:1870 + msgid "Error: Object path is not specified\n" + msgstr "Greška: Putanja objekta nije navedena\n" + +-#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838 +-#: gio/gdbus-tool.c:2078 +-#, c-format +-msgid "Error: %s is not a valid object path\n" +-msgstr "Greška: %s nije valjana putanja objekta\n" +- +-#: gio/gdbus-tool.c:756 ++#: gio/gdbus-tool.c:765 + msgid "Error: Signal name is not specified\n" + msgstr "Greška: Naziv signala nije naveden\n" + +-#: gio/gdbus-tool.c:770 ++#: gio/gdbus-tool.c:779 + #, c-format + msgid "Error: Signal name “%s” is invalid\n" + msgstr "Greška: Naziv signala “%s” nije valjan\n" + +-#: gio/gdbus-tool.c:782 ++#: gio/gdbus-tool.c:791 + #, c-format + msgid "Error: %s is not a valid interface name\n" + msgstr "Greška: %s nije valjani naziv sučelja\n" + +-#: gio/gdbus-tool.c:788 ++#: gio/gdbus-tool.c:797 + #, c-format + msgid "Error: %s is not a valid member name\n" + msgstr "Greška: %s nije valjani naziv člana\n" + + #. Use the original non-"parse-me-harder" error +-#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156 ++#: gio/gdbus-tool.c:834 gio/gdbus-tool.c:1172 + #, c-format + msgid "Error parsing parameter %d: %s\n" + msgstr "Greška obrade parametra %d: %s\n" + +-#: gio/gdbus-tool.c:857 ++#: gio/gdbus-tool.c:866 + #, c-format + msgid "Error flushing connection: %s\n" + msgstr "Greška pražnjenja povezivanja: %s\n" + +-#: gio/gdbus-tool.c:884 ++#: gio/gdbus-tool.c:893 + msgid "Destination name to invoke method on" + msgstr "Naziv odredišta za poziv načina" + +-#: gio/gdbus-tool.c:885 ++#: gio/gdbus-tool.c:894 + msgid "Object path to invoke method on" + msgstr "Putanja objekta za poziv načina" + +-#: gio/gdbus-tool.c:886 ++#: gio/gdbus-tool.c:895 + msgid "Method and interface name" + msgstr "Naziv načina i sučelja" + +-#: gio/gdbus-tool.c:887 ++#: gio/gdbus-tool.c:896 + msgid "Timeout in seconds" + msgstr "Vrijeme čekanja u sekundama" + +-#: gio/gdbus-tool.c:926 ++#: gio/gdbus-tool.c:942 + msgid "Invoke a method on a remote object." + msgstr "Pozovi način na udaljenom objektu." + +-#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032 ++#: gio/gdbus-tool.c:1014 gio/gdbus-tool.c:1844 gio/gdbus-tool.c:2084 + msgid "Error: Destination is not specified\n" + msgstr "Greška: Odredište nije navedeno\n" + +-#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 ++#: gio/gdbus-tool.c:1025 gio/gdbus-tool.c:1861 gio/gdbus-tool.c:2095 + #, c-format + msgid "Error: %s is not a valid bus name\n" + msgstr "Greška: %s nije valjan naziv sabirnice\n" + +-#: gio/gdbus-tool.c:1059 ++#: gio/gdbus-tool.c:1075 + msgid "Error: Method name is not specified\n" + msgstr "Greška: Naziv načina nije naveden\n" + +-#: gio/gdbus-tool.c:1070 ++#: gio/gdbus-tool.c:1086 + #, c-format + msgid "Error: Method name “%s” is invalid\n" + msgstr "Greška: Naziv načina “%s” je nevaljan\n" + +-#: gio/gdbus-tool.c:1148 ++#: gio/gdbus-tool.c:1164 + #, c-format + msgid "Error parsing parameter %d of type “%s”: %s\n" + msgstr "Greška obrade parametra %d vrste “%s”: %s\n" + +-#: gio/gdbus-tool.c:1634 ++#: gio/gdbus-tool.c:1190 ++#, c-format ++msgid "Error adding handle %d: %s\n" ++msgstr "Greška dodavanja rukovanja %d: %s\n" ++ ++#: gio/gdbus-tool.c:1686 + msgid "Destination name to introspect" + msgstr "Naziv odredišta za preispitivanje" + +-#: gio/gdbus-tool.c:1635 ++#: gio/gdbus-tool.c:1687 + msgid "Object path to introspect" + msgstr "Putanja objekta za preispitivanje" + +-#: gio/gdbus-tool.c:1636 ++#: gio/gdbus-tool.c:1688 + msgid "Print XML" + msgstr "Prikaži XML" + +-#: gio/gdbus-tool.c:1637 ++#: gio/gdbus-tool.c:1689 + msgid "Introspect children" + msgstr "Preispitivanje podsadržaja" + +-#: gio/gdbus-tool.c:1638 ++#: gio/gdbus-tool.c:1690 + msgid "Only print properties" + msgstr "Samo prikaži svojstva" + +-#: gio/gdbus-tool.c:1727 ++#: gio/gdbus-tool.c:1779 + msgid "Introspect a remote object." + msgstr "Preispitivanje udaljenog objekta." + +-#: gio/gdbus-tool.c:1933 ++#: gio/gdbus-tool.c:1985 + msgid "Destination name to monitor" + msgstr "Naziv odredišta za nadgledanje" + +-#: gio/gdbus-tool.c:1934 ++#: gio/gdbus-tool.c:1986 + msgid "Object path to monitor" + msgstr "Putanja objekta za nadgledanje" + +-#: gio/gdbus-tool.c:1959 ++#: gio/gdbus-tool.c:2011 + msgid "Monitor a remote object." + msgstr "Nadgledaj udaljeni objekt." + +-#: gio/gdbus-tool.c:2017 ++#: gio/gdbus-tool.c:2069 + msgid "Error: can’t monitor a non-message-bus connection\n" + msgstr "" + "Greška: nemoguće nadgledanje povezivanja sabirnice koja nije za poruke\n" + +-#: gio/gdbus-tool.c:2141 ++#: gio/gdbus-tool.c:2193 + msgid "Service to activate before waiting for the other one (well-known name)" + msgstr "Usluga za aktiviranje prije čekanja druge usluge (dobro poznat naziv)" + +-#: gio/gdbus-tool.c:2144 ++#: gio/gdbus-tool.c:2196 + msgid "" + "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " + "(default)" +@@ -1222,239 +1250,230 @@ msgstr "" + "Vrijeme čekanja prije zatvaranja s greškom (sekunde), O za vrijeme čekanja " + "(zadano)" + +-#: gio/gdbus-tool.c:2192 ++#: gio/gdbus-tool.c:2244 + msgid "[OPTION…] BUS-NAME" + msgstr "[MOGUĆNOST...] NAZIV-SABIRNICE" + +-#: gio/gdbus-tool.c:2193 ++#: gio/gdbus-tool.c:2245 + msgid "Wait for a bus name to appear." +-msgstr "Čekaj da se pojavi naziv sabirnice." ++msgstr "Čekaj pojavljivanje naziva sabirnice." + +-#: gio/gdbus-tool.c:2269 ++#: gio/gdbus-tool.c:2321 + msgid "Error: A service to activate for must be specified.\n" + msgstr "Greška: Usluga za aktiviranje mora biti navedena.\n" + +-#: gio/gdbus-tool.c:2274 ++#: gio/gdbus-tool.c:2326 + msgid "Error: A service to wait for must be specified.\n" + msgstr "Greška: Usluga koja se čeka mora biti navedena.\n" + +-#: gio/gdbus-tool.c:2279 ++#: gio/gdbus-tool.c:2331 + msgid "Error: Too many arguments.\n" + msgstr "Greška: previše argumenata.\n" + +-#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 ++#: gio/gdbus-tool.c:2339 gio/gdbus-tool.c:2346 + #, c-format + msgid "Error: %s is not a valid well-known bus name.\n" + msgstr "Greška: %s nije valjan dobro poznat naziv sabirnice\n" + +-#: gio/gdesktopappinfo.c:2073 gio/gdesktopappinfo.c:4893 ++#: gio/gdesktopappinfo.c:2106 gio/gdesktopappinfo.c:5031 + msgid "Unnamed" + msgstr "Neimenovano" + +-#: gio/gdesktopappinfo.c:2483 ++#: gio/gdesktopappinfo.c:2516 + msgid "Desktop file didn’t specify Exec field" +-msgstr "Datoteka radne površine nema navedeno Exec polje" ++msgstr "Datoteka radne površine (.desktop) nema navedeno Exec polje" + +-#: gio/gdesktopappinfo.c:2763 ++#: gio/gdesktopappinfo.c:2824 + msgid "Unable to find terminal required for application" + msgstr "Nemoguć pronalazak potrebnog terminala za aplikaciju" + +-#: gio/gdesktopappinfo.c:3414 ++#: gio/gdesktopappinfo.c:3551 + #, c-format + msgid "Can’t create user application configuration folder %s: %s" + msgstr "Nemoguće stvaranje mape podešavanja aplikacije korisnika %s: %s" + +-#: gio/gdesktopappinfo.c:3418 ++#: gio/gdesktopappinfo.c:3555 + #, c-format + msgid "Can’t create user MIME configuration folder %s: %s" + msgstr "Nemoguće stvaranje mape MIME podešavanja korisnika %s: %s" + +-#: gio/gdesktopappinfo.c:3660 gio/gdesktopappinfo.c:3684 ++#: gio/gdesktopappinfo.c:3797 gio/gdesktopappinfo.c:3821 + msgid "Application information lacks an identifier" + msgstr "Informacijama aplikacije nedostaje identifikator" + +-#: gio/gdesktopappinfo.c:3920 ++#: gio/gdesktopappinfo.c:4057 + #, c-format + msgid "Can’t create user desktop file %s" +-msgstr "Nemoguće stvaranje datoteke radne površine korisnika %s" ++msgstr "Nemoguće stvaranje datoteke radne površine (.desktop) korisnika %s" + +-#: gio/gdesktopappinfo.c:4056 ++#: gio/gdesktopappinfo.c:4193 + #, c-format + msgid "Custom definition for %s" + msgstr "Prilagođena definicija za %s" + + #: gio/gdrive.c:417 + msgid "drive doesn’t implement eject" +-msgstr "" ++msgstr "uređaj nema implementirano izbacivanje" + + #. Translators: This is an error + #. * message for drive objects that + #. * don't implement any of eject or eject_with_operation. + #: gio/gdrive.c:495 + msgid "drive doesn’t implement eject or eject_with_operation" +-msgstr "" ++msgstr "uređaj nema implementirano izbacivanje ili izbacivanje_s_radnjom" + + #: gio/gdrive.c:571 + msgid "drive doesn’t implement polling for media" +-msgstr "" ++msgstr "uređaj nema implementirano bilježenje medija" + + #: gio/gdrive.c:778 + msgid "drive doesn’t implement start" +-msgstr "" ++msgstr "uređaj nema implementirano pokretanje" + + #: gio/gdrive.c:880 + msgid "drive doesn’t implement stop" +-msgstr "" ++msgstr "uređaj nema implementirano zaustavljanje" + +-#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 ++#: gio/gdtlsconnection.c:1153 gio/gtlsconnection.c:920 + msgid "TLS backend does not implement TLS binding retrieval" +-msgstr "" ++msgstr "TLS pozadinski program nema implementirano primanje TLS povezivanja" + + #: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 + #: gio/gdummytlsbackend.c:513 + msgid "TLS support is not available" +-msgstr "" ++msgstr "TLS podrška nije dostupna" + + #: gio/gdummytlsbackend.c:423 + msgid "DTLS support is not available" +-msgstr "" ++msgstr "DTLS podrška nije dostupna" + + #: gio/gemblem.c:323 + #, c-format + msgid "Can’t handle version %d of GEmblem encoding" +-msgstr "" ++msgstr "Nemoguće rukovanje %d inačicom GEmblem kôdiranja" + + #: gio/gemblem.c:333 + #, c-format + msgid "Malformed number of tokens (%d) in GEmblem encoding" +-msgstr "" ++msgstr "Oštećeni broj tokena (%d) u GEmblem kôdiranju" + + #: gio/gemblemedicon.c:362 + #, c-format + msgid "Can’t handle version %d of GEmblemedIcon encoding" +-msgstr "" ++msgstr "Nemoguće rukovanje %d inačicom GEmblemedIcon kôdiranja" + + #: gio/gemblemedicon.c:372 + #, c-format + msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +-msgstr "" ++msgstr "Oštećeni broj tokena (%d) u GEmblemedIcon kôdiranju" + + #: gio/gemblemedicon.c:395 + msgid "Expected a GEmblem for GEmblemedIcon" +-msgstr "" +- +-#: gio/gfile.c:1044 gio/gfile.c:1282 gio/gfile.c:1420 gio/gfile.c:1658 +-#: gio/gfile.c:1713 gio/gfile.c:1771 gio/gfile.c:1855 gio/gfile.c:1912 +-#: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 +-#: gio/gfile.c:4070 gio/gfile.c:4540 gio/gfile.c:4951 gio/gfile.c:5036 +-#: gio/gfile.c:5126 gio/gfile.c:5223 gio/gfile.c:5310 gio/gfile.c:5411 +-#: gio/gfile.c:8121 gio/gfile.c:8211 gio/gfile.c:8295 +-#: gio/win32/gwinhttpfile.c:437 +-msgid "Operation not supported" +-msgstr "Radnja nije podržana" ++msgstr "Očekivani GEmblem za GEmblemedIcon" + + #. Translators: This is an error message when + #. * trying to find the enclosing (user visible) + #. * mount of a file, but none exists. + #. +-#: gio/gfile.c:1543 ++#: gio/gfile.c:1567 + msgid "Containing mount does not exist" +-msgstr "" ++msgstr "Sadržano montiranje ne postoji" + +-#: gio/gfile.c:2590 gio/glocalfile.c:2430 ++#: gio/gfile.c:2614 gio/glocalfile.c:2486 + msgid "Can’t copy over directory" +-msgstr "" ++msgstr "Nemoguće kopiranje preko direktorija" + +-#: gio/gfile.c:2650 ++#: gio/gfile.c:2674 + msgid "Can’t copy directory over directory" +-msgstr "Nemoguće je kopiranje direktorija preko direktorija" ++msgstr "Nemoguće kopiranje direktorija preko direktorija" + +-#: gio/gfile.c:2658 ++#: gio/gfile.c:2682 + msgid "Target file exists" + msgstr "Odredišna datoteka već postoji" + +-#: gio/gfile.c:2677 +-#, fuzzy ++#: gio/gfile.c:2701 + msgid "Can’t recursively copy directory" +-msgstr "Nije moguće kopirati strukturu stabla direktorija" ++msgstr "Nemoguće rekruzivno kopiranje direktorija" + +-#: gio/gfile.c:2952 ++#: gio/gfile.c:3002 + msgid "Splice not supported" +-msgstr "" ++msgstr "Spajanje nije podržano" + +-#: gio/gfile.c:2956 gio/gfile.c:3001 ++#: gio/gfile.c:3006 + #, c-format + msgid "Error splicing file: %s" +-msgstr "" ++msgstr "Greška spajanja datoteke: %s" + +-#: gio/gfile.c:3117 ++#: gio/gfile.c:3158 + msgid "Copy (reflink/clone) between mounts is not supported" + msgstr "" ++"Kopiranje (referentne poveznice/kloniranje) između montiranja nije podržano" + +-#: gio/gfile.c:3121 ++#: gio/gfile.c:3162 + msgid "Copy (reflink/clone) is not supported or invalid" + msgstr "" ++"Kopiranje (referentne poveznice/kloniranje) nije podržano ili je nevaljano" + +-#: gio/gfile.c:3126 ++#: gio/gfile.c:3167 + msgid "Copy (reflink/clone) is not supported or didn’t work" +-msgstr "" ++msgstr "Kopiranje (referentne poveznice/kloniranje) nije podržano ili ne radi" + +-#: gio/gfile.c:3190 ++#: gio/gfile.c:3232 + msgid "Can’t copy special file" +-msgstr "" ++msgstr "Nemoguće kopiranje posebne datoteke" + +-#: gio/gfile.c:4003 ++#: gio/gfile.c:4041 + msgid "Invalid symlink value given" +-msgstr "" ++msgstr "Zadana je nevaljana vrijednost simboličke poveznice" + +-#: gio/gfile.c:4013 glib/gfileutils.c:2349 ++#: gio/gfile.c:4051 glib/gfileutils.c:2355 + msgid "Symbolic links not supported" +-msgstr "Nisu podržane simboličke veze" ++msgstr "Simboličke poveznice nisu podržane" + +-#: gio/gfile.c:4181 ++#: gio/gfile.c:4219 + msgid "Trash not supported" +-msgstr "" ++msgstr "Smeće nije podržano" + +-#: gio/gfile.c:4293 ++#: gio/gfile.c:4331 + #, c-format + msgid "File names cannot contain “%c”" +-msgstr "" ++msgstr "Nazivi datoteka ne mogu sadržavati “%c”" + +-#: gio/gfile.c:6774 gio/gvolume.c:364 ++#: gio/gfile.c:6812 gio/gvolume.c:364 + msgid "volume doesn’t implement mount" +-msgstr "" ++msgstr "uređaj nema implementirano montiranje" + +-#: gio/gfile.c:6888 gio/gfile.c:6936 ++#: gio/gfile.c:6926 gio/gfile.c:6974 + msgid "No application is registered as handling this file" +-msgstr "" ++msgstr "Nema registriranih aplikacija za rukovanje ovom datotekom" + + #: gio/gfileenumerator.c:212 + msgid "Enumerator is closed" +-msgstr "" ++msgstr "Popisivač je zatvoren" + + #: gio/gfileenumerator.c:219 gio/gfileenumerator.c:278 + #: gio/gfileenumerator.c:377 gio/gfileenumerator.c:476 + msgid "File enumerator has outstanding operation" +-msgstr "" ++msgstr "Popisivač datoteka ima izvanrednu radnju" + + #: gio/gfileenumerator.c:368 gio/gfileenumerator.c:467 + msgid "File enumerator is already closed" +-msgstr "" ++msgstr "Popisivač datoteka je već zatvoren" + +-#: gio/gfileicon.c:236 ++#: gio/gfileicon.c:250 + #, c-format + msgid "Can’t handle version %d of GFileIcon encoding" +-msgstr "" ++msgstr "Nemoguće rukovanje %d inačicom GFileIcon kôdiranja" + +-#: gio/gfileicon.c:246 ++#: gio/gfileicon.c:260 + msgid "Malformed input data for GFileIcon" +-msgstr "" ++msgstr "Oštećeni su ulazni podaci za GFileIcon" + + #: gio/gfileinputstream.c:149 gio/gfileinputstream.c:394 + #: gio/gfileiostream.c:167 gio/gfileoutputstream.c:164 + #: gio/gfileoutputstream.c:497 + msgid "Stream doesn’t support query_info" +-msgstr "" ++msgstr "Strujanje ne podaržava informacije_upita" + + #: gio/gfileinputstream.c:325 gio/gfileiostream.c:379 + #: gio/gfileoutputstream.c:371 +@@ -1463,106 +1482,110 @@ msgstr "Premotavanje nije podržano na strujanju" + + #: gio/gfileinputstream.c:369 + msgid "Truncate not allowed on input stream" +-msgstr "" ++msgstr "Skračivanje nije dopušteno na ulaznom strujanju" + + #: gio/gfileiostream.c:455 gio/gfileoutputstream.c:447 + msgid "Truncate not supported on stream" + msgstr "Skračivanje nije podržano na strujanju" + + #: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 +-#: glib/gconvert.c:1778 ++#: glib/gconvert.c:1825 + msgid "Invalid hostname" + msgstr "Neispravan naziv računala" + + #: gio/ghttpproxy.c:143 + msgid "Bad HTTP proxy reply" +-msgstr "" ++msgstr "Neispravan HTTP proxy odgovor" + + #: gio/ghttpproxy.c:159 + msgid "HTTP proxy connection not allowed" +-msgstr "" ++msgstr "HTTP proxy povezivanje nije dopušteno" + + #: gio/ghttpproxy.c:164 + msgid "HTTP proxy authentication failed" +-msgstr "" ++msgstr "HTTP proxy ovjera je neuspjela" + + #: gio/ghttpproxy.c:167 + msgid "HTTP proxy authentication required" +-msgstr "" ++msgstr "HTTP proxy ovjera je potrebna" + + #: gio/ghttpproxy.c:171 + #, c-format + msgid "HTTP proxy connection failed: %i" +-msgstr "" ++msgstr "HTTP proxy povezivanje je neuspjelo: %i" ++ ++#: gio/ghttpproxy.c:266 ++msgid "HTTP proxy response too big" ++msgstr "HTTP proxy odgovor je prevelik" + +-#: gio/ghttpproxy.c:269 ++#: gio/ghttpproxy.c:283 + msgid "HTTP proxy server closed connection unexpectedly." +-msgstr "" ++msgstr "HTTP proxy poslužitelj je neočekivano prekinuo povezivanje." + + #: gio/gicon.c:298 + #, c-format + msgid "Wrong number of tokens (%d)" +-msgstr "" ++msgstr "Pogrešan broj tokena (%d)" + + #: gio/gicon.c:318 + #, c-format + msgid "No type for class name %s" +-msgstr "" ++msgstr "Nema vrste za naziv klase %s" + + #: gio/gicon.c:328 + #, c-format + msgid "Type %s does not implement the GIcon interface" +-msgstr "" ++msgstr "Vrsta %s ne implementira GIcon sučelje" + + #: gio/gicon.c:339 + #, c-format + msgid "Type %s is not classed" +-msgstr "" ++msgstr "Vrsta %s nije klasificirana" + + #: gio/gicon.c:353 + #, c-format + msgid "Malformed version number: %s" +-msgstr "" ++msgstr "Oštećen broj inačice: %s" + + #: gio/gicon.c:367 + #, c-format + msgid "Type %s does not implement from_tokens() on the GIcon interface" +-msgstr "" ++msgstr "Vrsta %s ne implementira from_tokens() na GIcon sučelju" + + #: gio/gicon.c:469 + msgid "Can’t handle the supplied version of the icon encoding" +-msgstr "" ++msgstr "Nemoguće rukovanje pružanom inačicom kôdiranja ikona" + + #: gio/ginetaddressmask.c:182 + msgid "No address specified" +-msgstr "" ++msgstr "Adresa nije navedena" + + #: gio/ginetaddressmask.c:190 + #, c-format + msgid "Length %u is too long for address" +-msgstr "" ++msgstr "Duljina %u je predugačka za adresu" + + #: gio/ginetaddressmask.c:223 + msgid "Address has bits set beyond prefix length" +-msgstr "" ++msgstr "Adresa ima postavljene bitove izvan duljine prefiksa" + + #: gio/ginetaddressmask.c:300 + #, c-format + msgid "Could not parse “%s” as IP address mask" +-msgstr "" ++msgstr "Nemoguća obrada “%s” kao IP adresne maske" + + #: gio/ginetsocketaddress.c:203 gio/ginetsocketaddress.c:220 +-#: gio/gnativesocketaddress.c:109 gio/gunixsocketaddress.c:220 ++#: gio/gnativesocketaddress.c:109 gio/gunixsocketaddress.c:221 + msgid "Not enough space for socket address" +-msgstr "" ++msgstr "Nedovoljno prostora za priključnicu adrese" + + #: gio/ginetsocketaddress.c:235 + msgid "Unsupported socket address" +-msgstr "" ++msgstr "Nepodržana priključnica adrese" + + #: gio/ginputstream.c:188 + msgid "Input stream doesn’t implement read" +-msgstr "" ++msgstr "Ulazno strujanje nema implementirano čitanje" + + #. Translators: This is an error you get if there is already an + #. * operation running against this stream when you try to start +@@ -1570,21 +1593,21 @@ msgstr "" + #. Translators: This is an error you get if there is + #. * already an operation running against this stream when + #. * you try to start one +-#: gio/ginputstream.c:1218 gio/giostream.c:310 gio/goutputstream.c:2208 ++#: gio/ginputstream.c:1249 gio/giostream.c:310 gio/goutputstream.c:2208 + msgid "Stream has outstanding operation" +-msgstr "" ++msgstr "Strujanje ima izvanrednu radnju" + + #: gio/gio-tool.c:160 + msgid "Copy with file" +-msgstr "" ++msgstr "Kopiraj s datotekom" + + #: gio/gio-tool.c:164 + msgid "Keep with file when moved" +-msgstr "" ++msgstr "Zadrži s datotekom kada je premještena" + + #: gio/gio-tool.c:205 + msgid "“version” takes no arguments" +-msgstr "“version” ne sadrži argumente" ++msgstr "“version” ne prihvaća argumente" + + #: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 + msgid "Usage:" +@@ -1600,90 +1623,94 @@ msgstr "Naredbe:" + + #: gio/gio-tool.c:229 + msgid "Concatenate files to standard output" +-msgstr "" ++msgstr "Spoji datoteke na standardan izlaz" + + #: gio/gio-tool.c:230 + msgid "Copy one or more files" +-msgstr "" ++msgstr "Kopiraj jednu ili više datoteka" + + #: gio/gio-tool.c:231 + msgid "Show information about locations" +-msgstr "" ++msgstr "Prikaži informacije o lokacijama" + + #: gio/gio-tool.c:232 +-msgid "List the contents of locations" +-msgstr "" ++msgid "Launch an application from a desktop file" ++msgstr "Pokreni aplikaciju s datotekom radne površine (.desktop)" + + #: gio/gio-tool.c:233 +-msgid "Get or set the handler for a mimetype" +-msgstr "" ++msgid "List the contents of locations" ++msgstr "Prikaži sadržaj lokacija" + + #: gio/gio-tool.c:234 +-msgid "Create directories" +-msgstr "" ++msgid "Get or set the handler for a mimetype" ++msgstr "Nabavi ili postavi rukovatelja za mimevrste" + + #: gio/gio-tool.c:235 +-msgid "Monitor files and directories for changes" +-msgstr "" ++msgid "Create directories" ++msgstr "Stvori direktorije" + + #: gio/gio-tool.c:236 +-msgid "Mount or unmount the locations" +-msgstr "" ++msgid "Monitor files and directories for changes" ++msgstr "Nadgledaj promjene za datoteke i direktorije" + + #: gio/gio-tool.c:237 +-msgid "Move one or more files" +-msgstr "" ++msgid "Mount or unmount the locations" ++msgstr "Montiraj ili odmontiraj lokacije" + + #: gio/gio-tool.c:238 +-msgid "Open files with the default application" +-msgstr "" ++msgid "Move one or more files" ++msgstr "Premjesti jednu ili više datoteka" + + #: gio/gio-tool.c:239 +-msgid "Rename a file" +-msgstr "" ++msgid "Open files with the default application" ++msgstr "Otvori datoteke sa zadanom aplikacijom" + + #: gio/gio-tool.c:240 +-msgid "Delete one or more files" +-msgstr "" ++msgid "Rename a file" ++msgstr "Preimenuj datoteku" + + #: gio/gio-tool.c:241 +-msgid "Read from standard input and save" +-msgstr "" ++msgid "Delete one or more files" ++msgstr "Obriši jednu ili više datoteka" + + #: gio/gio-tool.c:242 +-msgid "Set a file attribute" +-msgstr "" ++msgid "Read from standard input and save" ++msgstr "Čitaj sa standardnog ulaza i spremi" + + #: gio/gio-tool.c:243 +-msgid "Move files or directories to the trash" +-msgstr "" ++msgid "Set a file attribute" ++msgstr "Postavi svojstvo datoteke" + + #: gio/gio-tool.c:244 ++msgid "Move files or directories to the trash" ++msgstr "Premjesti datoteke ili direktorije u smeće" ++ ++#: gio/gio-tool.c:245 + msgid "Lists the contents of locations in a tree" +-msgstr "" ++msgstr "Prikaži sadržaj lokacije u stablu" + +-#: gio/gio-tool.c:246 ++#: gio/gio-tool.c:247 + #, c-format + msgid "Use %s to get detailed help.\n" +-msgstr "" ++msgstr "Koristi %s za dobivanje opširnije pomoći.\n" + + #: gio/gio-tool-cat.c:87 + msgid "Error writing to stdout" +-msgstr "Greška zapisivanja i stdout" ++msgstr "Greška zapisivanja u stdout" + + #. Translators: commandline placeholder +-#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:333 gio/gio-tool-list.c:172 ++#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:340 gio/gio-tool-list.c:172 + #: gio/gio-tool-mkdir.c:48 gio/gio-tool-monitor.c:37 gio/gio-tool-monitor.c:39 + #: gio/gio-tool-monitor.c:41 gio/gio-tool-monitor.c:43 +-#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 ++#: gio/gio-tool-monitor.c:204 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 + #: gio/gio-tool-remove.c:48 gio/gio-tool-rename.c:45 gio/gio-tool-set.c:89 +-#: gio/gio-tool-trash.c:81 gio/gio-tool-tree.c:239 ++#: gio/gio-tool-trash.c:220 gio/gio-tool-tree.c:239 + msgid "LOCATION" + msgstr "LOKACIJA" + + #: gio/gio-tool-cat.c:138 + msgid "Concatenate files and print to standard output." +-msgstr "" ++msgstr "Spoji datoteke i ispiši na standardan izlaz." + + #: gio/gio-tool-cat.c:140 + msgid "" +@@ -1691,45 +1718,48 @@ msgid "" + "locations instead of local files: for example, you can use something\n" + "like smb://server/resource/file.txt as location." + msgstr "" ++"gio cat radi poput tradicionalnog cat pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju." + +-#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:364 gio/gio-tool-mkdir.c:76 +-#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96 +-#: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:136 ++#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:371 gio/gio-tool-mkdir.c:76 ++#: gio/gio-tool-monitor.c:229 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96 ++#: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:303 + msgid "No locations given" +-msgstr "" ++msgstr "Lokacija nije zadana" + + #: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:38 + msgid "No target directory" +-msgstr "" ++msgstr "Nema odredišnog direktorija" + + #: gio/gio-tool-copy.c:44 gio/gio-tool-move.c:39 + msgid "Show progress" +-msgstr "" ++msgstr "Prikaži napredak" + + #: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 + msgid "Prompt before overwrite" +-msgstr "" ++msgstr "Upitaj prije prebrisivanja" + + #: gio/gio-tool-copy.c:46 + msgid "Preserve all attributes" +-msgstr "" ++msgstr "Očuvaj sva svojstva" + + #: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 + msgid "Backup existing destination files" +-msgstr "" ++msgstr "Sigurnosno kopiraj postojeće odredišne datoteke" + + #: gio/gio-tool-copy.c:48 + msgid "Never follow symbolic links" +-msgstr "" ++msgstr "Nikada ne slijedi simboličke poveznice" + + #: gio/gio-tool-copy.c:49 + msgid "Use default permissions for the destination" +-msgstr "" ++msgstr "Koristi zadane dozvole za odredište" + + #: gio/gio-tool-copy.c:74 gio/gio-tool-move.c:67 + #, c-format + msgid "Transferred %s out of %s (%s/s)" +-msgstr "" ++msgstr "Preneseno %s od %s (%s/s)" + + #. Translators: commandline placeholder + #: gio/gio-tool-copy.c:100 gio/gio-tool-move.c:94 +@@ -1751,28 +1781,31 @@ msgid "" + "locations instead of local files: for example, you can use something\n" + "like smb://server/resource/file.txt as location." + msgstr "" ++"gio copy radi poput tradicionalnog cp pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju." + + #: gio/gio-tool-copy.c:149 + #, c-format + msgid "Destination %s is not a directory" +-msgstr "" ++msgstr "Odredište nije %s direktorij" + + #: gio/gio-tool-copy.c:196 gio/gio-tool-move.c:186 + #, c-format + msgid "%s: overwrite “%s”? " +-msgstr "" ++msgstr "%s: prebriši “%s”? " + + #: gio/gio-tool-info.c:37 + msgid "List writable attributes" +-msgstr "" ++msgstr "Prikaži zapisiva svojstva" + + #: gio/gio-tool-info.c:38 + msgid "Get file system info" +-msgstr "" ++msgstr "Dobivanje informacija datoteke sustava" + + #: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 + msgid "The attributes to get" +-msgstr "" ++msgstr "Svojstva koja treba dobiti" + + #: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 + msgid "ATTRIBUTES" +@@ -1780,70 +1813,70 @@ msgstr "SVOJSTVA" + + #: gio/gio-tool-info.c:40 gio/gio-tool-list.c:39 gio/gio-tool-set.c:34 + msgid "Don’t follow symbolic links" +-msgstr "" ++msgstr "Ne slijedi simboličke poveznice" + + #: gio/gio-tool-info.c:78 + msgid "attributes:\n" +-msgstr "" ++msgstr "svojstva:\n" + + #. Translators: This is a noun and represents and attribute of a file + #: gio/gio-tool-info.c:134 + #, c-format + msgid "display name: %s\n" +-msgstr "" ++msgstr "prikaži naziv: %s\n" + + #. Translators: This is a noun and represents and attribute of a file + #: gio/gio-tool-info.c:139 + #, c-format + msgid "edit name: %s\n" +-msgstr "" ++msgstr "uredi naziv: %s\n" + + #: gio/gio-tool-info.c:145 + #, c-format + msgid "name: %s\n" +-msgstr "" ++msgstr "naziv: %s\n" + + #: gio/gio-tool-info.c:152 + #, c-format + msgid "type: %s\n" +-msgstr "" ++msgstr "vrsta: %s\n" + + #: gio/gio-tool-info.c:158 + msgid "size: " +-msgstr "" ++msgstr "veličina: " + + #: gio/gio-tool-info.c:163 + msgid "hidden\n" +-msgstr "" ++msgstr "skriveno\n" + + #: gio/gio-tool-info.c:166 + #, c-format + msgid "uri: %s\n" +-msgstr "" ++msgstr "uri: %s\n" + + #: gio/gio-tool-info.c:172 + #, c-format + msgid "local path: %s\n" +-msgstr "" ++msgstr "lokalna putanja: %s\n" + +-#: gio/gio-tool-info.c:199 ++#: gio/gio-tool-info.c:205 + #, c-format + msgid "unix mount: %s%s %s %s %s\n" +-msgstr "" ++msgstr "unix montiranje: %s%s %s %s %s\n" + +-#: gio/gio-tool-info.c:279 ++#: gio/gio-tool-info.c:286 + msgid "Settable attributes:\n" +-msgstr "" ++msgstr "Postavljiva svojstva:\n" + +-#: gio/gio-tool-info.c:303 ++#: gio/gio-tool-info.c:310 + msgid "Writable attribute namespaces:\n" +-msgstr "" ++msgstr "Zapisiva svojstva naziva prostora:\n" + +-#: gio/gio-tool-info.c:338 ++#: gio/gio-tool-info.c:345 + msgid "Show information about locations." +-msgstr "" ++msgstr "Prikaži informacije o lokacijama." + +-#: gio/gio-tool-info.c:340 ++#: gio/gio-tool-info.c:347 + msgid "" + "gio info is similar to the traditional ls utility, but using GIO\n" + "locations instead of local files: for example, you can use something\n" +@@ -1851,26 +1884,68 @@ msgid "" + "be specified with their GIO name, e.g. standard::icon, or just by\n" + "namespace, e.g. unix, or by “*”, which matches all attributes" + msgstr "" ++"gio info radi poput tradicionalnog ls pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju.\n" ++"Svojstva datoteka mogu biti navedena s njihovim GIO nazivima,\n" ++"npr. standard::icon, ili jednostavno samo s nazivom prostora,\n" ++"npr. unix, ili sa “*”, što odgovara svim svojstvima" ++ ++#. Translators: commandline placeholder ++#: gio/gio-tool-launch.c:54 ++msgid "DESKTOP-FILE [FILE-ARG …]" ++msgstr "DESKTOP-DATOTEKA [DATOTEKA-ARGUMENT…]" ++ ++#: gio/gio-tool-launch.c:57 ++msgid "" ++"Launch an application from a desktop file, passing optional filename " ++"arguments to it." ++msgstr "" ++"Pokreni aplikaciju s datotekom radne površine (.desktop), prosljeđujući joj " ++"neobavezni naziv datoteke." ++ ++#: gio/gio-tool-launch.c:77 ++msgid "No desktop file given" ++msgstr "Nema zadane datoteke radne površine (.desktop)" ++ ++#: gio/gio-tool-launch.c:85 ++msgid "The launch command is not currently supported on this platform" ++msgstr "Naredba pokretanja trenutno nije podržana na ovoj platformi" ++ ++#: gio/gio-tool-launch.c:98 ++#, c-format ++msgid "Unable to load ‘%s‘: %s" ++msgstr "Nemoguće učitavanje ‘%s‘: %s" ++ ++#: gio/gio-tool-launch.c:107 ++#, c-format ++msgid "Unable to load application information for ‘%s‘" ++msgstr "Nemoguće učitavanje informacija aplikacije za ‘%s‘" ++ ++#: gio/gio-tool-launch.c:119 ++#, c-format ++msgid "Unable to launch application ‘%s’: %s" ++msgstr "Nemoguće pokretanje aplikacije ‘%s’: %s" + + #: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32 + msgid "Show hidden files" +-msgstr "" ++msgstr "Prikaži skrivene datoteke" + + #: gio/gio-tool-list.c:38 + msgid "Use a long listing format" +-msgstr "" ++msgstr "Koristi format duljeg prikaza" + + #: gio/gio-tool-list.c:40 + msgid "Print display names" +-msgstr "" ++msgstr "Prikaži nazive prikaza" + + #: gio/gio-tool-list.c:41 + msgid "Print full URIs" +-msgstr "" ++msgstr "Prikaži potpune URI-je" + + #: gio/gio-tool-list.c:177 + msgid "List the contents of the locations." +-msgstr "" ++msgstr "Prikaži sadržaje lokacija." + + #: gio/gio-tool-list.c:179 + msgid "" +@@ -1879,19 +1954,24 @@ msgid "" + "like smb://server/resource/file.txt as location. File attributes can\n" + "be specified with their GIO name, e.g. standard::icon" + msgstr "" ++"gio list radi poput tradicionalnog ls pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju.\n" ++"Svojstva datoteka mogu biti navedena s njihovim GIO nazivima,\n" ++"npr. standard::icon" + + #. Translators: commandline placeholder + #: gio/gio-tool-mime.c:71 + msgid "MIMETYPE" +-msgstr "" ++msgstr "MIMEVRSTA" + + #: gio/gio-tool-mime.c:71 + msgid "HANDLER" +-msgstr "" ++msgstr "RUKOVATELJ" + + #: gio/gio-tool-mime.c:76 + msgid "Get or set the handler for a mimetype." +-msgstr "" ++msgstr "Nabavi ili postavi rukovatelj za mimevrste." + + #: gio/gio-tool-mime.c:78 + msgid "" +@@ -1899,47 +1979,49 @@ msgid "" + "for the mimetype. If a handler is given, it is set as the default\n" + "handler for the mimetype." + msgstr "" ++"Ako rukovatelj nije zadan, prikaži registrirane i preporučene aplikacije\n" ++"za mimevrste. Ako je rukovatelj zadan, postavljen je kao zadan\n" ++"rukovatelj za mimevrstu." + + #: gio/gio-tool-mime.c:100 + msgid "Must specify a single mimetype, and maybe a handler" +-msgstr "" ++msgstr "Mora biti navedena jedna mimevrsta i možda rukovatelj" + + #: gio/gio-tool-mime.c:116 + #, c-format + msgid "No default applications for “%s”\n" +-msgstr "" ++msgstr "Nema zadane aplikacije za “%s”\n" + + #: gio/gio-tool-mime.c:122 + #, c-format + msgid "Default application for “%s”: %s\n" +-msgstr "" ++msgstr "Zadana aplikacija za “%s”: %s\n" + + #: gio/gio-tool-mime.c:127 + msgid "Registered applications:\n" +-msgstr "" ++msgstr "Registrirane aplikacije:\n" + + #: gio/gio-tool-mime.c:129 + msgid "No registered applications\n" +-msgstr "" ++msgstr "Nema registriranih aplikacija\n" + + #: gio/gio-tool-mime.c:140 + msgid "Recommended applications:\n" +-msgstr "" ++msgstr "Preporučene aplikacije:\n" + + #: gio/gio-tool-mime.c:142 + msgid "No recommended applications\n" +-msgstr "" ++msgstr "Nema preporučenih aplikacija\n" + + #: gio/gio-tool-mime.c:162 +-#, fuzzy, c-format +-#| msgid "Failed to read from file '%s': %s" ++#, c-format + msgid "Failed to load info for handler “%s”" +-msgstr "Greška pri čitanju iz datoteke '%s': %s" ++msgstr "Neuspjelo učitavanje informacija za rukovatelja “%s”" + + #: gio/gio-tool-mime.c:168 + #, c-format + msgid "Failed to set “%s” as the default handler for “%s”: %s\n" +-msgstr "" ++msgstr "Neuspjelo postavljanje “%s” kao zadanog rukovatelja za “%s”: %s\n" + + #: gio/gio-tool-mkdir.c:31 + msgid "Create parent directories" +@@ -1955,32 +2037,39 @@ msgid "" + "locations instead of local files: for example, you can use something\n" + "like smb://server/resource/mydir as location." + msgstr "" ++"gio mkdir radi poput tradicionalnog mkdir pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju." + + #: gio/gio-tool-monitor.c:37 + msgid "Monitor a directory (default: depends on type)" +-msgstr "" ++msgstr "Nadgledaj direktorij (zadano: ovisi o vrsti)" + + #: gio/gio-tool-monitor.c:39 + msgid "Monitor a file (default: depends on type)" +-msgstr "" ++msgstr "Nadgledaj datoteku (zadano: ovisi o vrsti)" + + #: gio/gio-tool-monitor.c:41 + msgid "Monitor a file directly (notices changes made via hardlinks)" + msgstr "" ++"Nadgledaj datoteku izravno (bilježi promjene načinjene putem čvrstih " ++"poveznica)" + + #: gio/gio-tool-monitor.c:43 + msgid "Monitors a file directly, but doesn’t report changes" +-msgstr "" ++msgstr "Nadgleda datoteke izravno, ali ne prijavljuje promjene" + + #: gio/gio-tool-monitor.c:45 + msgid "Report moves and renames as simple deleted/created events" + msgstr "" ++"Prijavi premještanja i preimenovanja kao jednostavne obrisane/stvorene " ++"događaje" + + #: gio/gio-tool-monitor.c:47 + msgid "Watch for mount events" + msgstr "Nadgledaj događaje montiranja" + +-#: gio/gio-tool-monitor.c:208 ++#: gio/gio-tool-monitor.c:209 + msgid "Monitor files or directories for changes." + msgstr "Nadgledaj promjene datoteka ili direktorija." + +@@ -2022,11 +2111,11 @@ msgstr "SCHEMA" + + #: gio/gio-tool-mount.c:69 + msgid "Ignore outstanding file operations when unmounting or ejecting" +-msgstr "" ++msgstr "Zanemari izvanredne radnje datoteke pri odmontiravanju ili izbacivanju" + + #: gio/gio-tool-mount.c:70 + msgid "Use an anonymous user when authenticating" +-msgstr "" ++msgstr "Koristi anonimnog korisnika pri ovjeri" + + #. Translator: List here is a verb as in 'List all mounts' + #: gio/gio-tool-mount.c:72 +@@ -2035,7 +2124,7 @@ msgstr "Popis" + + #: gio/gio-tool-mount.c:73 + msgid "Monitor events" +-msgstr "" ++msgstr "Nadgledaj događaje" + + #: gio/gio-tool-mount.c:74 + msgid "Show extra information" +@@ -2043,43 +2132,43 @@ msgstr "Prikaži dodatne informacije" + + #: gio/gio-tool-mount.c:75 + msgid "The numeric PIM when unlocking a VeraCrypt volume" +-msgstr "" ++msgstr "Brojčani PIM pri otključavanju VeraCrypt uređaja" + + #: gio/gio-tool-mount.c:75 + msgid "PIM" +-msgstr "" ++msgstr "PIM" + + #: gio/gio-tool-mount.c:76 + msgid "Mount a TCRYPT hidden volume" +-msgstr "" ++msgstr "Montiraj TCRYPT skriven uređaj" + + #: gio/gio-tool-mount.c:77 + msgid "Mount a TCRYPT system volume" +-msgstr "" ++msgstr "Montiraj TCRYPT uređaj sustava" + + #: gio/gio-tool-mount.c:265 gio/gio-tool-mount.c:297 + msgid "Anonymous access denied" +-msgstr "" ++msgstr "Anoniman pristup nije dopušten" + + #: gio/gio-tool-mount.c:522 + msgid "No drive for device file" +-msgstr "" ++msgstr "Nema uređaja za datoteku uređaja" + + #: gio/gio-tool-mount.c:1014 + msgid "No volume for given ID" +-msgstr "" ++msgstr "Nema uređaja za zadan ID" + + #: gio/gio-tool-mount.c:1203 + msgid "Mount or unmount the locations." +-msgstr "" ++msgstr "Montiraj ili odmontiraj lokacije." + + #: gio/gio-tool-move.c:42 + msgid "Don’t use copy and delete fallback" +-msgstr "" ++msgstr "Ne koristi pričuvno kopiranje ili brisanje" + + #: gio/gio-tool-move.c:99 + msgid "Move one or more files from SOURCE to DEST." +-msgstr "" ++msgstr "Premjesti jednu ili više datoteka iz IZVORA u ODREDIŠTE." + + #: gio/gio-tool-move.c:101 + msgid "" +@@ -2087,25 +2176,30 @@ msgid "" + "locations instead of local files: for example, you can use something\n" + "like smb://server/resource/file.txt as location" + msgstr "" ++"gio move radi poput tradicionalnog mv pomagala, ali korisit GIO\n" ++"lokacije umjesto lokalnih datoteka: na primjer, možete koristiti\n" ++"nešto poput smb://poslužitelj/resurs/datoteka.txt kao lokaciju" + + #: gio/gio-tool-move.c:143 + #, c-format + msgid "Target %s is not a directory" +-msgstr "" ++msgstr "Odredište %s nije direktorij" + + #: gio/gio-tool-open.c:75 + msgid "" + "Open files with the default application that\n" + "is registered to handle files of this type." + msgstr "" ++"Otvori datoteke sa zadanom aplikacijom koja je\n" ++"registrirana za rukovanje s datotekama ove vrste." + +-#: gio/gio-tool-remove.c:31 gio/gio-tool-trash.c:31 ++#: gio/gio-tool-remove.c:31 gio/gio-tool-trash.c:33 + msgid "Ignore nonexistent files, never prompt" +-msgstr "" ++msgstr "Zanemari nepostojeće datoteke, nikada ne upitaj" + + #: gio/gio-tool-remove.c:52 + msgid "Delete the given files." +-msgstr "" ++msgstr "Obriši zadane datoteke." + + #: gio/gio-tool-rename.c:45 + msgid "NAME" +@@ -2126,37 +2220,37 @@ msgstr "Previše argumenata" + #: gio/gio-tool-rename.c:95 + #, c-format + msgid "Rename successful. New uri: %s\n" +-msgstr "" ++msgstr "Preimenovanje uspješno. Novi uri: %s\n" + + #: gio/gio-tool-save.c:50 + msgid "Only create if not existing" +-msgstr "" ++msgstr "Stvori samo ako ne postoji" + + #: gio/gio-tool-save.c:51 + msgid "Append to end of file" +-msgstr "" ++msgstr "Dodaj na kraj datoteke" + + #: gio/gio-tool-save.c:52 + msgid "When creating, restrict access to the current user" +-msgstr "" ++msgstr "Pri stvaranju, ograniči pristup trenutnom korisniku" + + #: gio/gio-tool-save.c:53 + msgid "When replacing, replace as if the destination did not exist" +-msgstr "" ++msgstr "Pri zamjeni, zamijeni kao da odredište ne postoji" + + #. Translators: The "etag" is a token allowing to verify whether a file has been modified + #: gio/gio-tool-save.c:55 + msgid "Print new etag at end" +-msgstr "" ++msgstr "Prikaži novi etag na završetku" + + #. Translators: The "etag" is a token allowing to verify whether a file has been modified + #: gio/gio-tool-save.c:57 + msgid "The etag of the file being overwritten" +-msgstr "" ++msgstr "Etag datoteke je prebrisan" + + #: gio/gio-tool-save.c:57 + msgid "ETAG" +-msgstr "" ++msgstr "ETAG" + + #: gio/gio-tool-save.c:113 + msgid "Error reading from standard input" +@@ -2165,11 +2259,11 @@ msgstr "Greška pri čitanju iz standardnog ulaza" + #. Translators: The "etag" is a token allowing to verify whether a file has been modified + #: gio/gio-tool-save.c:139 + msgid "Etag not available\n" +-msgstr "" ++msgstr "Etag nije dostupan\n" + + #: gio/gio-tool-save.c:163 + msgid "Read from standard input and save to DEST." +-msgstr "" ++msgstr "Čitaj iz standardnog izlaza i spremi u ODREDIŠTE." + + #: gio/gio-tool-save.c:183 + msgid "No destination given" +@@ -2177,7 +2271,7 @@ msgstr "Odredište nije zadano" + + #: gio/gio-tool-set.c:33 + msgid "Type of the attribute" +-msgstr "" ++msgstr "Vrsta svojstva" + + #: gio/gio-tool-set.c:33 + msgid "TYPE" +@@ -2193,40 +2287,77 @@ msgstr "VRIJEDNOST" + + #: gio/gio-tool-set.c:93 + msgid "Set a file attribute of LOCATION." +-msgstr "Postavi datoteku svojstva LOKACIJE." ++msgstr "Postavi svojstvo datoteke LOKACIJE." + + #: gio/gio-tool-set.c:113 + msgid "Location not specified" +-msgstr "" ++msgstr "Lokacija nije navedena" + + #: gio/gio-tool-set.c:120 + msgid "Attribute not specified" +-msgstr "" ++msgstr "Svojstvo nije navedeno" + + #: gio/gio-tool-set.c:130 + msgid "Value not specified" +-msgstr "" ++msgstr "Vrijednost nije navedena" + + #: gio/gio-tool-set.c:180 + #, c-format + msgid "Invalid attribute type “%s”" +-msgstr "" ++msgstr "Nevaljana vrsta svojstva “%s”" + +-#: gio/gio-tool-trash.c:32 ++#: gio/gio-tool-trash.c:34 + msgid "Empty the trash" ++msgstr "Isprazni smeće" ++ ++#: gio/gio-tool-trash.c:35 ++msgid "List files in the trash with their original locations" ++msgstr "Prikaži datoteke u smeću s njihovim izvornim lokacijama" ++ ++#: gio/gio-tool-trash.c:36 ++msgid "" ++"Restore a file from trash to its original location (possibly recreating the " ++"directory)" + msgstr "" ++"Vrati datoteku iz smeća na njegovu izvornu lokaciju (moguće ponovno " ++"stvaranje direktorija)" ++ ++#: gio/gio-tool-trash.c:106 ++msgid "Unable to find original path" ++msgstr "Nemoguće pronalazak izvorne putanje" ++ ++#: gio/gio-tool-trash.c:123 ++msgid "Unable to recreate original location: " ++msgstr "Nemoguće ponovno stvaranje izvorne lokacije: " ++ ++#: gio/gio-tool-trash.c:136 ++msgid "Unable to move file to its original location: " ++msgstr "Nemoguće premještanje datoteke na njegovu izvornu lokaciju: " + +-#: gio/gio-tool-trash.c:86 +-msgid "Move files or directories to the trash." ++#: gio/gio-tool-trash.c:225 ++msgid "Move/Restore files or directories to the trash." ++msgstr "Premjesti/Vrati datoteke ili direktorije u smeće." ++ ++#: gio/gio-tool-trash.c:227 ++msgid "" ++"Note: for --restore switch, if the original location of the trashed file \n" ++"already exists, it will not be overwritten unless --force is set." + msgstr "" ++"Napomena: za --restore preklopnik, ako izvorna lokacija ili datoteka iz " ++"smeća \n" ++"već postoje, neće biti prebrisani osim ako nije --force postavljen." ++ ++#: gio/gio-tool-trash.c:258 ++msgid "Location given doesn't start with trash:///" ++msgstr "Zadana lokacija ne započinje sa trash:///" + + #: gio/gio-tool-tree.c:33 + msgid "Follow symbolic links, mounts and shortcuts" +-msgstr "" ++msgstr "Slijedi simboličke poveznice, montiranja i prečace" + + #: gio/gio-tool-tree.c:244 + msgid "List contents of directories in a tree-like format." +-msgstr "" ++msgstr "Prikaži sadržaj direktorija u obliku stabla." + + #: gio/glib-compile-resources.c:140 gio/glib-compile-schemas.c:1514 + #, c-format +@@ -2241,17 +2372,17 @@ msgstr "Element <%s> nije dopušten na najvišoj razini" + #: gio/glib-compile-resources.c:234 + #, c-format + msgid "File %s appears multiple times in the resource" +-msgstr "" ++msgstr "Datoteka %s se pojavljuje više puta u resursu" + + #: gio/glib-compile-resources.c:245 + #, c-format + msgid "Failed to locate “%s” in any source directory" +-msgstr "" ++msgstr "Nemoguće je locirati “%s” u bilo kojem izvornom direktoriju" + + #: gio/glib-compile-resources.c:256 + #, c-format + msgid "Failed to locate “%s” in current directory" +-msgstr "" ++msgstr "Nemoguće je locirati “%s” u trenutnom direktoriju" + + #: gio/glib-compile-resources.c:290 + #, c-format +@@ -2266,36 +2397,38 @@ msgstr "Nepoznata mogućnost obrade “%s”" + #: gio/glib-compile-resources.c:424 + #, c-format + msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" +-msgstr "" ++msgstr "%s zahtijeva predobradu, ali %s nije postavljena, a %s nije PUTANJA" + + #: gio/glib-compile-resources.c:457 + #, c-format + msgid "Error reading file %s: %s" +-msgstr "" ++msgstr "Greška čitanja datoteke %s: %s" + + #: gio/glib-compile-resources.c:477 + #, c-format + msgid "Error compressing file %s" +-msgstr "" ++msgstr "Greška sažimanja datoteke %s" + + #: gio/glib-compile-resources.c:541 + #, c-format + msgid "text may not appear inside <%s>" +-msgstr "" ++msgstr "tekst se možda neće pojaviti unutar <%s>" + + #: gio/glib-compile-resources.c:737 gio/glib-compile-schemas.c:2172 + msgid "Show program version and exit" +-msgstr "" ++msgstr "Prikaži inačicu programa i izađi" + + #: gio/glib-compile-resources.c:738 + msgid "Name of the output file" +-msgstr "" ++msgstr "Naziv izlazne datoteke" + + #: gio/glib-compile-resources.c:739 + msgid "" + "The directories to load files referenced in FILE from (default: current " + "directory)" + msgstr "" ++"Direktoriji za učitavanje datoteka navedenih u DATOTECI (zadano: trenutni " ++"direktorij)" + + #: gio/glib-compile-resources.c:739 gio/glib-compile-schemas.c:2173 + #: gio/glib-compile-schemas.c:2202 +@@ -2306,44 +2439,48 @@ msgstr "DIREKTORIJ" + msgid "" + "Generate output in the format selected for by the target filename extension" + msgstr "" ++"Stvori izlaz u formatu odabranom od strane proširenja odredišta naziva " ++"datoteke" + + #: gio/glib-compile-resources.c:741 + msgid "Generate source header" +-msgstr "" ++msgstr "Stvori zaglavlje izvora" + + #: gio/glib-compile-resources.c:742 + msgid "Generate source code used to link in the resource file into your code" +-msgstr "" ++msgstr "Stvori izvorni kôd korišten za povezivanje datoteke resursa u vaš kôd" + + #: gio/glib-compile-resources.c:743 + msgid "Generate dependency list" +-msgstr "" ++msgstr "Stvori popis zavisnosti" + + #: gio/glib-compile-resources.c:744 + msgid "Name of the dependency file to generate" +-msgstr "" ++msgstr "Naziv datoteke zavisnosti za stvaranje" + + #: gio/glib-compile-resources.c:745 + msgid "Include phony targets in the generated dependency file" +-msgstr "" ++msgstr "Uključi lažna odredišta u stvorenu datoteku zavisnosti" + + #: gio/glib-compile-resources.c:746 + msgid "Don’t automatically create and register resource" +-msgstr "" ++msgstr "Nemoj automatski stvoriti i registrirati resurs" + + #: gio/glib-compile-resources.c:747 + msgid "Don’t export functions; declare them G_GNUC_INTERNAL" +-msgstr "" ++msgstr "Ne izvažaj funkcije; proglasi ih G_GNUC_INTERNAL" + + #: gio/glib-compile-resources.c:748 + msgid "" + "Don’t embed resource data in the C file; assume it's linked externally " + "instead" + msgstr "" ++"Ne ugrađuj podatak resursa u C datoteku; pretpostavi da je umjesto povezana " ++"izvana" + + #: gio/glib-compile-resources.c:749 + msgid "C identifier name used for the generated source code" +-msgstr "" ++msgstr "Naziv C identifikatora korišten za stvoreni izvorni kôd" + + #: gio/glib-compile-resources.c:775 + msgid "" +@@ -2351,167 +2488,174 @@ msgid "" + "Resource specification files have the extension .gresource.xml,\n" + "and the resource file have the extension called .gresource." + msgstr "" ++"Kompiliraj specifikacije resursa u datoteku resursa.\n" ++"Datoteka specifikacije resursa ima nastavak vrste\n" ++"datoteke .gresource.xml, i datoteka resursa ima\n" ++"nastavak vrste datoteke .gresource." + + #: gio/glib-compile-resources.c:797 + msgid "You should give exactly one file name\n" +-msgstr "" ++msgstr "Trebali bi zadati najmanje jedan naziv datoteke\n" + + #: gio/glib-compile-schemas.c:92 + #, c-format + msgid "nick must be a minimum of 2 characters" +-msgstr "" ++msgstr "nadimak mora sadržavati najmanje 2 znaka" + + #: gio/glib-compile-schemas.c:103 + #, c-format + msgid "Invalid numeric value" +-msgstr "" ++msgstr "Nevaljana brojčana vrijednost" + + #: gio/glib-compile-schemas.c:111 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već naveden" + + #: gio/glib-compile-schemas.c:119 + #, c-format + msgid "value='%s' already specified" +-msgstr "" ++msgstr "value='%s' je već naveden" + + #: gio/glib-compile-schemas.c:133 + #, c-format + msgid "flags values must have at most 1 bit set" +-msgstr "" ++msgstr "vrijednosti oznaka moraju imati najviše postavljen 1 bit" + + #: gio/glib-compile-schemas.c:158 + #, c-format + msgid "<%s> must contain at least one " +-msgstr "" ++msgstr "<%s> mora sadržavati najmanje jedan " + + #: gio/glib-compile-schemas.c:314 + #, c-format + msgid "<%s> is not contained in the specified range" +-msgstr "" ++msgstr "<%s> nije sadržan u navedenom rasponu" + + #: gio/glib-compile-schemas.c:326 + #, c-format + msgid "<%s> is not a valid member of the specified enumerated type" +-msgstr "" ++msgstr "<%s> nije valjan član navedene popisane vrste" + + #: gio/glib-compile-schemas.c:332 + #, c-format + msgid "<%s> contains string not in the specified flags type" +-msgstr "" ++msgstr "<%s> sadrži niz koji nije u navedenoj vrsti oznake" + + #: gio/glib-compile-schemas.c:338 + #, c-format + msgid "<%s> contains a string not in " +-msgstr "" ++msgstr "<%s> sadrži niz koji nije u " + + #: gio/glib-compile-schemas.c:372 + msgid " already specified for this key" +-msgstr "" ++msgstr " je već određen za ovaj ključ" + + #: gio/glib-compile-schemas.c:390 + #, c-format + msgid " not allowed for keys of type “%s”" +-msgstr "" ++msgstr " nije dopušten za ključeve ove vrste “%s”" + + #: gio/glib-compile-schemas.c:407 + #, c-format + msgid " specified minimum is greater than maximum" +-msgstr "" ++msgstr " određeni minimum je veći od maksimuma" + + #: gio/glib-compile-schemas.c:432 + #, c-format + msgid "unsupported l10n category: %s" +-msgstr "" ++msgstr "nepodržana l10n kategorija: %s" + + #: gio/glib-compile-schemas.c:440 + msgid "l10n requested, but no gettext domain given" +-msgstr "" ++msgstr "l10n je potreban, ali nema zadane gettext domene" + + #: gio/glib-compile-schemas.c:452 + msgid "translation context given for value without l10n enabled" +-msgstr "" ++msgstr "sadržaj prijevoda zadan za vrijednosti bez l10n je omogućen" + + #: gio/glib-compile-schemas.c:474 + #, c-format + msgid "Failed to parse value of type “%s”: " +-msgstr "" ++msgstr "Nemoguća obrada vrijednosti vrste “%s”: " + + #: gio/glib-compile-schemas.c:491 + msgid "" + " cannot be specified for keys tagged as having an enumerated type" + msgstr "" ++" ne može biti određen za ključeve označene da imaju popisanu vrstu" + + #: gio/glib-compile-schemas.c:500 + msgid " already specified for this key" +-msgstr "" ++msgstr " je već određen za ovaj ključ" + + #: gio/glib-compile-schemas.c:512 + #, c-format + msgid " not allowed for keys of type “%s”" +-msgstr "" ++msgstr " nije dopušten za ključ vrste “%s”" + + #: gio/glib-compile-schemas.c:528 + #, c-format + msgid " already given" +-msgstr "" ++msgstr " je već zadan" + + #: gio/glib-compile-schemas.c:543 + #, c-format + msgid " must contain at least one " +-msgstr "" ++msgstr " mora sadržavati najmanje jedan " + + #: gio/glib-compile-schemas.c:557 + msgid " already specified for this key" +-msgstr "" ++msgstr " je već određen za ovaj ključ" + + #: gio/glib-compile-schemas.c:561 + msgid "" + " can only be specified for keys with enumerated or flags types or " + "after " + msgstr "" ++" može biti određen za ključeve s popisanim ili označenim vrstama " ++"ili nakon " + + #: gio/glib-compile-schemas.c:580 + #, c-format + msgid "" + " given when “%s” is already a member of the enumerated " + "type" +-msgstr "" ++msgstr " je zadan kada je “%s” već član popisane vrste" + + #: gio/glib-compile-schemas.c:586 + #, c-format + msgid " given when was already given" +-msgstr "" ++msgstr " je zadan kada je već zadan" + + #: gio/glib-compile-schemas.c:594 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već određen" + + #: gio/glib-compile-schemas.c:604 + #, c-format + msgid "alias target “%s” is not in enumerated type" +-msgstr "" ++msgstr "alias odredište “%s” nije popisana vrste" + + #: gio/glib-compile-schemas.c:605 + #, c-format + msgid "alias target “%s” is not in " +-msgstr "" ++msgstr "alias odredište “%s” nije " + + #: gio/glib-compile-schemas.c:620 + #, c-format + msgid " must contain at least one " +-msgstr "" ++msgstr " mora sadržavati najmanje jedan " + + #: gio/glib-compile-schemas.c:797 + msgid "Empty names are not permitted" +-msgstr "" ++msgstr "Prazni nazivi nisu dopušteni" + + #: gio/glib-compile-schemas.c:807 + #, c-format + msgid "Invalid name “%s”: names must begin with a lowercase letter" +-msgstr "" ++msgstr "Nevaljani naziv “%s”: nazivi moraju započeti s malim slovom" + + #: gio/glib-compile-schemas.c:819 + #, c-format +@@ -2519,35 +2663,37 @@ msgid "" + "Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers " + "and hyphen (“-”) are permitted" + msgstr "" ++"Nevaljani naziv “%s”: nevaljani znak “%c”; samo mala slova, brojevi i " ++"spojnica (“-”) su dopušteni" + + #: gio/glib-compile-schemas.c:828 + #, c-format + msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" +-msgstr "" ++msgstr "Nevaljani naziv “%s”: dvije uzastopne spojnice (“--”) nisu dopuštene" + + #: gio/glib-compile-schemas.c:837 + #, c-format + msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)" +-msgstr "" ++msgstr "Nevaljani naziv “%s”: posljednji znak ne može biti spojnica (“-”)" + + #: gio/glib-compile-schemas.c:845 + #, c-format + msgid "Invalid name “%s”: maximum length is 1024" +-msgstr "" ++msgstr "Nevaljani naziv “%s”: najveća duljina je 1024" + + #: gio/glib-compile-schemas.c:917 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već određen" + + #: gio/glib-compile-schemas.c:943 + msgid "Cannot add keys to a “list-of” schema" +-msgstr "" ++msgstr "Nemoguće dodavanje ključeva u “list-off” shemu" + + #: gio/glib-compile-schemas.c:954 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već određen" + + #: gio/glib-compile-schemas.c:972 + #, c-format +@@ -2555,6 +2701,8 @@ msgid "" + " shadows in ; use " + "to modify value" + msgstr "" ++" shadows u ; koristi " ++" za promjenu vrijednosti" + + #: gio/glib-compile-schemas.c:983 + #, c-format +@@ -2562,61 +2710,63 @@ msgid "" + "Exactly one of “type”, “enum” or “flags” must be specified as an attribute " + "to " + msgstr "" ++"Točno jedan od “type”, “enum” ili “flags” mora biti određen kao svojstvo " ++"" + + #: gio/glib-compile-schemas.c:1002 + #, c-format + msgid "<%s id='%s'> not (yet) defined." +-msgstr "" ++msgstr "<%s id='%s'> nije (još) određen." + + #: gio/glib-compile-schemas.c:1017 + #, c-format + msgid "Invalid GVariant type string “%s”" +-msgstr "" ++msgstr "Nevaljana GVariant vrsta niza “%s”" + + #: gio/glib-compile-schemas.c:1047 + msgid " given but schema isn’t extending anything" +-msgstr "" ++msgstr " je zadan ali shema ništa ne proširuje" + + #: gio/glib-compile-schemas.c:1060 + #, c-format + msgid "No to override" +-msgstr "" ++msgstr "Nema za zaobilaženje" + + #: gio/glib-compile-schemas.c:1068 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već određen" + + #: gio/glib-compile-schemas.c:1141 + #, c-format + msgid " already specified" +-msgstr "" ++msgstr " je već određen" + + #: gio/glib-compile-schemas.c:1153 + #, c-format + msgid " extends not yet existing schema “%s”" +-msgstr "" ++msgstr " još ne proširuje postojeću shemu “%s”" + + #: gio/glib-compile-schemas.c:1169 + #, c-format + msgid " is list of not yet existing schema “%s”" +-msgstr "" ++msgstr " je popis još nepostojeće sheme “%s”" + + #: gio/glib-compile-schemas.c:1177 + #, c-format + msgid "Cannot be a list of a schema with a path" +-msgstr "" ++msgstr "Ne može biti popis sheme s putanjom" + + #: gio/glib-compile-schemas.c:1187 + #, c-format + msgid "Cannot extend a schema with a path" +-msgstr "" ++msgstr "Ne može proširiti shemu s putanjom" + + #: gio/glib-compile-schemas.c:1197 + #, c-format + msgid "" + " is a list, extending which is not a list" +-msgstr "" ++msgstr " je popis, proširuje koji nije popis" + + #: gio/glib-compile-schemas.c:1207 + #, c-format +@@ -2624,16 +2774,18 @@ msgid "" + " extends but “%s” " + "does not extend “%s”" + msgstr "" ++" proširuje ali " ++"“%s” ne proširuje “%s”" + + #: gio/glib-compile-schemas.c:1224 + #, c-format + msgid "A path, if given, must begin and end with a slash" +-msgstr "" ++msgstr "Putanja, ako je zadana, mora započeti i završiti kosom crtom" + + #: gio/glib-compile-schemas.c:1231 + #, c-format + msgid "The path of a list must end with “:/”" +-msgstr "" ++msgstr "Putanja popisa mora završiti sa “:/”" + + #: gio/glib-compile-schemas.c:1240 + #, c-format +@@ -2641,25 +2793,27 @@ msgid "" + "Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/" + "desktop/” or “/system/” are deprecated." + msgstr "" ++"Upozorenje: Shema “%s” ima putanju “%s”. Putanje koje započinje sa “/" ++"apps/”, “/desktop/” ili “/system/” su zastarjele." + + #: gio/glib-compile-schemas.c:1270 + #, c-format + msgid "<%s id='%s'> already specified" +-msgstr "" ++msgstr "<%s id='%s'> je već određen" + + #: gio/glib-compile-schemas.c:1420 gio/glib-compile-schemas.c:1436 + #, c-format + msgid "Only one <%s> element allowed inside <%s>" +-msgstr "" ++msgstr "Samo jedan <%s> element je dopušten unutar <%s>" + + #: gio/glib-compile-schemas.c:1518 + #, c-format + msgid "Element <%s> not allowed at the top level" +-msgstr "" ++msgstr "Element <%s> nije dopušten na najvišoj razini" + + #: gio/glib-compile-schemas.c:1536 + msgid "Element is required in " +-msgstr "" ++msgstr "Element je potreban u " + + #: gio/glib-compile-schemas.c:1626 + #, c-format +@@ -2669,20 +2823,20 @@ msgstr "Tekst se možda neće pojaviti unutar <%s>" + #: gio/glib-compile-schemas.c:1694 + #, c-format + msgid "Warning: undefined reference to " +-msgstr "" ++msgstr "Upozorenje: neodređena napomena u " + + #. Translators: Do not translate "--strict". + #: gio/glib-compile-schemas.c:1833 gio/glib-compile-schemas.c:1912 + msgid "--strict was specified; exiting." +-msgstr "" ++msgstr "--strict je naveden; izlazim." + + #: gio/glib-compile-schemas.c:1845 + msgid "This entire file has been ignored." +-msgstr "" ++msgstr "Ova cijela datoteka je zanemarena." + + #: gio/glib-compile-schemas.c:1908 + msgid "Ignoring this file." +-msgstr "" ++msgstr "Zanemarivanje ove datoteke." + + #: gio/glib-compile-schemas.c:1963 + #, c-format +@@ -2690,6 +2844,8 @@ msgid "" + "No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " + "override for this key." + msgstr "" ++"Nema takvog ključa “%s” u shemi “%s” kao što je navedeno u datoteci " ++"zaobilaženja “%s”; zanemarujem zaobilaženje ovog ključa." + + #: gio/glib-compile-schemas.c:1971 + #, c-format +@@ -2697,6 +2853,8 @@ msgid "" + "No such key “%s” in schema “%s” as specified in override file “%s” and --" + "strict was specified; exiting." + msgstr "" ++"Nema takvog ključa “%s” u shemi “%s” kao što je navedeno u datoteci " ++"zaobilaženja “%s” i --strict je naveden; izlazim." + + #: gio/glib-compile-schemas.c:1993 + #, c-format +@@ -2704,6 +2862,9 @@ msgid "" + "Cannot provide per-desktop overrides for localized key “%s” in schema " + "“%s” (override file “%s”); ignoring override for this key." + msgstr "" ++"Nemoguće je pružiti zaobilaženje po radnoj površini za lokalizirani ključ " ++"“%s” u shemi “%s” (datoteka zaobilaženja “%s”); zanemarujem zaobilaženje za " ++"ovaj ključ." + + #: gio/glib-compile-schemas.c:2002 + #, c-format +@@ -2711,6 +2872,9 @@ msgid "" + "Cannot provide per-desktop overrides for localized key “%s” in schema " + "“%s” (override file “%s”) and --strict was specified; exiting." + msgstr "" ++"Nemoguće je pružiti zaobilaženje po radnoj površini za lokalizirani ključ " ++"“%s” u shemi “%s” (datoteka zaobilaženja “%s”) i --strict su navedni; " ++"izlazim." + + #: gio/glib-compile-schemas.c:2026 + #, c-format +@@ -2718,6 +2882,8 @@ msgid "" + "Error parsing key “%s” in schema “%s” as specified in override file “%s”: " + "%s. Ignoring override for this key." + msgstr "" ++"Greška obrade ključa “%s” u shemi “%s” kao što je navedeno u datoteci " ++"zaobilaženja “%s”: %s. Zanemarujem zaobilaženje za ovaj ključ." + + #: gio/glib-compile-schemas.c:2038 + #, c-format +@@ -2725,6 +2891,8 @@ msgid "" + "Error parsing key “%s” in schema “%s” as specified in override file “%s”: " + "%s. --strict was specified; exiting." + msgstr "" ++"Greška obrade ključa “%s” u shemi “%s” kao što je navedeno u datoteci " ++"zaobilaženja “%s”: %s. --strict je naveden; izlazim." + + #: gio/glib-compile-schemas.c:2065 + #, c-format +@@ -2732,6 +2900,8 @@ msgid "" + "Override for key “%s” in schema “%s” in override file “%s” is outside the " + "range given in the schema; ignoring override for this key." + msgstr "" ++"Zaobilaženje za ključ “%s” u shemi “%s” u datoteci zaobilaženja “%s” je " ++"izvan raspona zadanom u shemi; zanemarujem zaobilaženje za ovaj ključ." + + #: gio/glib-compile-schemas.c:2075 + #, c-format +@@ -2739,6 +2909,8 @@ msgid "" + "Override for key “%s” in schema “%s” in override file “%s” is outside the " + "range given in the schema and --strict was specified; exiting." + msgstr "" ++"Zaobilaženje za ključ “%s” u shemi “%s” u datoteci zaobilaženja “%s” je " ++"izvan raspona zadanom u shemi i --strict je naveden; izlazim." + + #: gio/glib-compile-schemas.c:2101 + #, c-format +@@ -2746,6 +2918,8 @@ msgid "" + "Override for key “%s” in schema “%s” in override file “%s” is not in the " + "list of valid choices; ignoring override for this key." + msgstr "" ++"Zaobilaženje za ključ “%s” u shemi “%s” u datoteci zaobilaženja “%s” nije na " ++"popisu valjanih odabira; zanemarujem zaobilaženje za ovaj ključ." + + #: gio/glib-compile-schemas.c:2111 + #, c-format +@@ -2753,22 +2927,24 @@ msgid "" + "Override for key “%s” in schema “%s” in override file “%s” is not in the " + "list of valid choices and --strict was specified; exiting." + msgstr "" ++"Zaobilaženje za ključ “%s” u shemi “%s” u datoteci zaobilaženja “%s” nije na " ++"popisu valjanih odabira --strict je naveden; izlazim." + + #: gio/glib-compile-schemas.c:2173 + msgid "Where to store the gschemas.compiled file" +-msgstr "" ++msgstr "Gdje treba spremiti gschemas.compiled datoteku" + + #: gio/glib-compile-schemas.c:2174 + msgid "Abort on any errors in schemas" +-msgstr "" ++msgstr "Prekini na svim greškama u shemama" + + #: gio/glib-compile-schemas.c:2175 + msgid "Do not write the gschema.compiled file" +-msgstr "" ++msgstr "Ne zapisuj gschema.compiled datoteku" + + #: gio/glib-compile-schemas.c:2176 + msgid "Do not enforce key name restrictions" +-msgstr "" ++msgstr "Ne primijenjuj ograničenja naziva ključeva" + + #: gio/glib-compile-schemas.c:2205 + msgid "" +@@ -2776,25 +2952,28 @@ msgid "" + "Schema files are required to have the extension .gschema.xml,\n" + "and the cache file is called gschemas.compiled." + msgstr "" ++"Kompiliraj sve GSettings shema datoteke u predmemoriju sheme.\n" ++"Datoteke shemes su potrebne za nastavak vrste datoteke .gschema.xml,\n" ++"a datoteka predmemorije se naziva gschemas.compiled." + + #: gio/glib-compile-schemas.c:2226 + msgid "You should give exactly one directory name" +-msgstr "" ++msgstr "Treba li bi navesti najmanje jedan naziv direktorija" + + #: gio/glib-compile-schemas.c:2269 + msgid "No schema files found: doing nothing." +-msgstr "" ++msgstr "Nema pronađene datoteke sheme: ništa za učiniti." + + #: gio/glib-compile-schemas.c:2271 + msgid "No schema files found: removed existing output file." +-msgstr "" ++msgstr "Nema pronađene datoteke sheme: uklanjanje postojeće datoteke izlaza." + +-#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 ++#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:436 + #, c-format + msgid "Invalid filename %s" + msgstr "Neispravan naziv datoteke %s" + +-#: gio/glocalfile.c:980 ++#: gio/glocalfile.c:982 + #, c-format + msgid "Error getting filesystem info for %s: %s" + msgstr "Greška dobivanja informacija datotečnog sustava za %s: %s" +@@ -2803,469 +2982,467 @@ msgstr "Greška dobivanja informacija datotečnog sustava za %s: %s" + #. * the enclosing (user visible) mount of a file, but none + #. * exists. + #. +-#: gio/glocalfile.c:1121 ++#: gio/glocalfile.c:1123 + #, c-format + msgid "Containing mount for file %s not found" + msgstr "Sadržano montiranje za datoteku %s nije pronađeno" + +-#: gio/glocalfile.c:1144 ++#: gio/glocalfile.c:1146 + msgid "Can’t rename root directory" + msgstr "Nemoguće preimenovanje korijenskog direktorija" + +-#: gio/glocalfile.c:1162 gio/glocalfile.c:1185 ++#: gio/glocalfile.c:1164 gio/glocalfile.c:1187 + #, c-format + msgid "Error renaming file %s: %s" + msgstr "Greška peimenovanja datoteke %s: %s" + +-#: gio/glocalfile.c:1169 ++#: gio/glocalfile.c:1171 + msgid "Can’t rename file, filename already exists" + msgstr "Nemoguće preimenovanje datoteke, naziv datoteke već postoji" + +-#: gio/glocalfile.c:1182 gio/glocalfile.c:2324 gio/glocalfile.c:2352 +-#: gio/glocalfile.c:2491 gio/glocalfileoutputstream.c:650 ++#: gio/glocalfile.c:1184 gio/glocalfile.c:2380 gio/glocalfile.c:2408 ++#: gio/glocalfile.c:2547 gio/glocalfileoutputstream.c:656 + msgid "Invalid filename" + msgstr "Neispravni naziv datoteke" + +-#: gio/glocalfile.c:1350 gio/glocalfile.c:1361 ++#: gio/glocalfile.c:1352 gio/glocalfile.c:1363 + #, c-format + msgid "Error opening file %s: %s" + msgstr "Greška otvaranja datoteke %s: %s" + +-#: gio/glocalfile.c:1486 ++#: gio/glocalfile.c:1488 + #, c-format + msgid "Error removing file %s: %s" + msgstr "Greška uklanjanja datoteke %s: %s" + +-#: gio/glocalfile.c:1969 ++#: gio/glocalfile.c:1982 gio/glocalfile.c:1993 gio/glocalfile.c:2020 + #, c-format + msgid "Error trashing file %s: %s" + msgstr "Greška premještanja datoteke u smeće %s: %s" + +-#: gio/glocalfile.c:2010 ++#: gio/glocalfile.c:2040 + #, c-format +-msgid "Unable to create trash dir %s: %s" ++msgid "Unable to create trash directory %s: %s" + msgstr "Nemoguće stvaranje direktorija smeća %s: %s" + +-#: gio/glocalfile.c:2030 +-#, fuzzy, c-format +-#| msgid "Failed to change to directory '%s' (%s)" ++#: gio/glocalfile.c:2061 ++#, c-format + msgid "Unable to find toplevel directory to trash %s" +-msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)" ++msgstr "Nemogući pronalazak direktorija najviše razine u smeću %s" + +-#: gio/glocalfile.c:2038 ++#: gio/glocalfile.c:2069 + #, c-format + msgid "Trashing on system internal mounts is not supported" +-msgstr "" ++msgstr "Premještanje u smeće na unutrašnjim montiranjima sustava nije podržano" + +-#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +-#, fuzzy, c-format +-#| msgid "Failed to change to directory '%s' (%s)" +-msgid "Unable to find or create trash directory for %s" +-msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)" ++#: gio/glocalfile.c:2155 gio/glocalfile.c:2183 ++#, c-format ++msgid "Unable to find or create trash directory %s to trash %s" ++msgstr "Nemoguć pronalazak ili stvaranje direktorija smeća %s u smeću %s" + +-#: gio/glocalfile.c:2173 +-#, fuzzy, c-format +-#| msgid "Failed to create file '%s': %s" ++#: gio/glocalfile.c:2229 ++#, c-format + msgid "Unable to create trashing info file for %s: %s" +-msgstr "Greška pri stvaranju datoteke '%s': %s" ++msgstr "Nemoguće stvaranje datoteke informacija premještanja u smeće za %s: %s" + +-#: gio/glocalfile.c:2235 ++#: gio/glocalfile.c:2291 + #, c-format + msgid "Unable to trash file %s across filesystem boundaries" + msgstr "" ++"Nemoguće premještanje datoteke %s u smeće izvan granica datotečnog sustava" + +-#: gio/glocalfile.c:2239 gio/glocalfile.c:2295 +-#, fuzzy, c-format +-#| msgid "Failed to create file '%s': %s" ++#: gio/glocalfile.c:2295 gio/glocalfile.c:2351 ++#, c-format + msgid "Unable to trash file %s: %s" +-msgstr "Greška pri stvaranju datoteke '%s': %s" ++msgstr "Nemoguće premještanje datoteke %s: %s u smeće" + +-#: gio/glocalfile.c:2301 +-#, fuzzy, c-format +-#| msgid "Failed to create file '%s': %s" ++#: gio/glocalfile.c:2357 ++#, c-format + msgid "Unable to trash file %s" +-msgstr "Greška pri stvaranju datoteke '%s': %s" ++msgstr "Nemoguće premještanje datoteke %s u smeće" + +-#: gio/glocalfile.c:2327 +-#, fuzzy, c-format +-#| msgid "Error opening directory '%s': %s" ++#: gio/glocalfile.c:2383 ++#, c-format + msgid "Error creating directory %s: %s" +-msgstr "Greška pri otvaranju mape '%s': %s" ++msgstr "Greška stvaranja direktorija %s: %s" + +-#: gio/glocalfile.c:2356 ++#: gio/glocalfile.c:2412 + #, c-format + msgid "Filesystem does not support symbolic links" +-msgstr "" ++msgstr "Datotečni sustav ne podržava simboličke poveznice" + +-#: gio/glocalfile.c:2359 +-#, fuzzy, c-format +-#| msgid "Error reading file '%s': %s" ++#: gio/glocalfile.c:2415 ++#, c-format + msgid "Error making symbolic link %s: %s" +-msgstr "Greška pri čitanju datoteke '%s': %s" ++msgstr "Greška stvaranja simboličke poveznice %s: %s" + +-#: gio/glocalfile.c:2402 gio/glocalfile.c:2437 gio/glocalfile.c:2494 +-#, fuzzy, c-format +-#| msgid "Error reading file '%s': %s" ++#: gio/glocalfile.c:2458 gio/glocalfile.c:2493 gio/glocalfile.c:2550 ++#, c-format + msgid "Error moving file %s: %s" +-msgstr "Greška pri čitanju datoteke '%s': %s" ++msgstr "Greška premještanja datoteke %s: %s" + +-#: gio/glocalfile.c:2425 ++#: gio/glocalfile.c:2481 + msgid "Can’t move directory over directory" + msgstr "Nemoguće je premještanje direktorija preko direktorija" + +-#: gio/glocalfile.c:2451 gio/glocalfileoutputstream.c:1039 +-#: gio/glocalfileoutputstream.c:1053 gio/glocalfileoutputstream.c:1068 +-#: gio/glocalfileoutputstream.c:1085 gio/glocalfileoutputstream.c:1099 ++#: gio/glocalfile.c:2507 gio/glocalfileoutputstream.c:1108 ++#: gio/glocalfileoutputstream.c:1122 gio/glocalfileoutputstream.c:1137 ++#: gio/glocalfileoutputstream.c:1154 gio/glocalfileoutputstream.c:1168 + msgid "Backup file creation failed" +-msgstr "Neuspjelo stvaranje sigurnosne kopije" ++msgstr "Neuspjelo stvaranje datoteke sigurnosne kopije" + +-#: gio/glocalfile.c:2470 ++#: gio/glocalfile.c:2526 + #, c-format + msgid "Error removing target file: %s" +-msgstr "Greška uklanjanja ciljane datoteke: %s" ++msgstr "Greška uklanjanja odredišne datoteke: %s" + +-#: gio/glocalfile.c:2484 ++#: gio/glocalfile.c:2540 + msgid "Move between mounts not supported" +-msgstr "" ++msgstr "Premještanje između montiranja nije podržano" + +-#: gio/glocalfile.c:2658 +-#, fuzzy, c-format +-#| msgid "Could not open converter from '%s' to '%s': %s" ++#: gio/glocalfile.c:2714 ++#, c-format + msgid "Could not determine the disk usage of %s: %s" +-msgstr "Ne mogu otvoriti pretvornik iz '%s' u '%s': %s" ++msgstr "Nemoguće određivanje upotrebe diska za %s: %s" + + #: gio/glocalfileinfo.c:767 + msgid "Attribute value must be non-NULL" +-msgstr "" ++msgstr "Vrijednost svojstva ne smije biti nula" + + #: gio/glocalfileinfo.c:774 + msgid "Invalid attribute type (string expected)" +-msgstr "" ++msgstr "Nevaljana vrsta svojstva (očekivan je izraz)" + + #: gio/glocalfileinfo.c:781 + msgid "Invalid extended attribute name" +-msgstr "" ++msgstr "Nevaljani naziv proširenog svojstva" + + #: gio/glocalfileinfo.c:821 + #, c-format + msgid "Error setting extended attribute “%s”: %s" +-msgstr "" ++msgstr "Greška postavljanja proširenog svojstva “%s”: %s" + +-#: gio/glocalfileinfo.c:1666 ++#: gio/glocalfileinfo.c:1709 gio/win32/gwinhttpfile.c:191 + msgid " (invalid encoding)" + msgstr " (neispravno kôdiranje)" + +-#: gio/glocalfileinfo.c:1825 gio/glocalfileoutputstream.c:915 ++#: gio/glocalfileinfo.c:1868 gio/glocalfileoutputstream.c:943 ++#: gio/glocalfileoutputstream.c:995 + #, c-format + msgid "Error when getting information for file “%s”: %s" +-msgstr "" ++msgstr "Greška dobivanja informacija za datoteku “%s”: %s" + +-#: gio/glocalfileinfo.c:2091 ++#: gio/glocalfileinfo.c:2134 + #, c-format + msgid "Error when getting information for file descriptor: %s" +-msgstr "" ++msgstr "Greška dobivanja informacija za opisnik datoteke: %s" + +-#: gio/glocalfileinfo.c:2136 ++#: gio/glocalfileinfo.c:2179 + msgid "Invalid attribute type (uint32 expected)" + msgstr "Neispravna vrsta svojstva (uint32 je očekivano)" + +-#: gio/glocalfileinfo.c:2154 ++#: gio/glocalfileinfo.c:2197 + msgid "Invalid attribute type (uint64 expected)" + msgstr "Neispravna vrsta svojstva (uint64 je očekivano)" + +-#: gio/glocalfileinfo.c:2173 gio/glocalfileinfo.c:2192 ++#: gio/glocalfileinfo.c:2216 gio/glocalfileinfo.c:2235 + msgid "Invalid attribute type (byte string expected)" +-msgstr "" ++msgstr "Neispravna vrsta svojstva (izraz u bajtima je očekivan)" + +-#: gio/glocalfileinfo.c:2239 ++#: gio/glocalfileinfo.c:2282 + msgid "Cannot set permissions on symlinks" +-msgstr "" ++msgstr "Nemoguće postavljanje dozvole za simboličke poveznice" + +-#: gio/glocalfileinfo.c:2255 ++#: gio/glocalfileinfo.c:2298 + #, c-format + msgid "Error setting permissions: %s" +-msgstr "" ++msgstr "Greška postavljanja dozvola: %s" + +-#: gio/glocalfileinfo.c:2306 ++#: gio/glocalfileinfo.c:2349 + #, c-format + msgid "Error setting owner: %s" +-msgstr "" ++msgstr "Greška postavljanja vlasnika: %s" + +-#: gio/glocalfileinfo.c:2329 ++#: gio/glocalfileinfo.c:2372 + msgid "symlink must be non-NULL" +-msgstr "" ++msgstr "simbolička poveznice ne može biti nula" + +-#: gio/glocalfileinfo.c:2339 gio/glocalfileinfo.c:2358 +-#: gio/glocalfileinfo.c:2369 ++#: gio/glocalfileinfo.c:2382 gio/glocalfileinfo.c:2401 ++#: gio/glocalfileinfo.c:2412 + #, c-format + msgid "Error setting symlink: %s" +-msgstr "" ++msgstr "Greška postavljanja simboličke poveznice: %s" + +-#: gio/glocalfileinfo.c:2348 ++#: gio/glocalfileinfo.c:2391 + msgid "Error setting symlink: file is not a symlink" + msgstr "" ++"Greška postavljanja simboličke poveznice: datoteka nije simbolička poveznica" + +-#: gio/glocalfileinfo.c:2420 ++#: gio/glocalfileinfo.c:2463 + #, c-format + msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" +-msgstr "" ++msgstr "Dodatne nanosekunde %d za UNIX vremensku oznaku %lld su negativne" + +-#: gio/glocalfileinfo.c:2429 ++#: gio/glocalfileinfo.c:2472 + #, c-format + msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" + msgstr "" ++"Dodatne nanosekunde %d za UNIX vremensku oznaku %lld su dosegle 1 sekundu" + +-#: gio/glocalfileinfo.c:2439 ++#: gio/glocalfileinfo.c:2482 + #, c-format + msgid "UNIX timestamp %lld does not fit into 64 bits" +-msgstr "" ++msgstr "UNIX vremenska oznaka %lld ne pristaje u 64 bita" + +-#: gio/glocalfileinfo.c:2450 ++#: gio/glocalfileinfo.c:2493 + #, c-format + msgid "UNIX timestamp %lld is outside of the range supported by Windows" + msgstr "" ++"UNIX vremenska oznaka %lld je izvan raspona podržanim od strane Windowsa" + +-#: gio/glocalfileinfo.c:2514 ++#: gio/glocalfileinfo.c:2570 + #, c-format + msgid "File name “%s” cannot be converted to UTF-16" +-msgstr "" ++msgstr "Naziv datoteke “%s” ne može biti pretvoren u UTF-16" + +-#: gio/glocalfileinfo.c:2533 ++#: gio/glocalfileinfo.c:2589 + #, c-format + msgid "File “%s” cannot be opened: Windows Error %lu" +-msgstr "" ++msgstr "Datoteka “%s” se ne može otvoriti: Windows greška %lu" + +-#: gio/glocalfileinfo.c:2546 ++#: gio/glocalfileinfo.c:2602 + #, c-format + msgid "Error setting modification or access time for file “%s”: %lu" + msgstr "" ++"Greška postavljanja promjene ili vremena pristupa za datoteku “%s”: %lu" + +-#: gio/glocalfileinfo.c:2647 ++#: gio/glocalfileinfo.c:2703 + #, c-format + msgid "Error setting modification or access time: %s" +-msgstr "" ++msgstr "Greška postavljanja promjene ili vremena pristupa: %s" + +-#: gio/glocalfileinfo.c:2670 ++#: gio/glocalfileinfo.c:2726 + msgid "SELinux context must be non-NULL" +-msgstr "" ++msgstr "SELinux sadržaj ne smije biti nula" + +-#: gio/glocalfileinfo.c:2685 ++#: gio/glocalfileinfo.c:2733 ++msgid "SELinux is not enabled on this system" ++msgstr "SELinux nije omogućen na ovom sustavu" ++ ++#: gio/glocalfileinfo.c:2743 + #, c-format + msgid "Error setting SELinux context: %s" +-msgstr "" +- +-#: gio/glocalfileinfo.c:2692 +-msgid "SELinux is not enabled on this system" +-msgstr "" ++msgstr "Greška postavljanja SELinux sadržaja: %s" + +-#: gio/glocalfileinfo.c:2784 ++#: gio/glocalfileinfo.c:2836 + #, c-format + msgid "Setting attribute %s not supported" +-msgstr "" ++msgstr "Postavljanje svojstva %s nije podržano" + +-#: gio/glocalfileinputstream.c:168 gio/glocalfileoutputstream.c:795 ++#: gio/glocalfileinputstream.c:163 gio/glocalfileoutputstream.c:801 + #, c-format + msgid "Error reading from file: %s" +-msgstr "" ++msgstr "Greška čitanja iz datoteke:%s" + +-#: gio/glocalfileinputstream.c:199 gio/glocalfileinputstream.c:211 +-#: gio/glocalfileinputstream.c:225 gio/glocalfileinputstream.c:333 +-#: gio/glocalfileoutputstream.c:557 gio/glocalfileoutputstream.c:1117 ++#: gio/glocalfileinputstream.c:194 gio/glocalfileoutputstream.c:353 ++#: gio/glocalfileoutputstream.c:447 + #, c-format +-msgid "Error seeking in file: %s" +-msgstr "" ++msgid "Error closing file: %s" ++msgstr "Greška zatvaranja datoteke: %s" + +-#: gio/glocalfileinputstream.c:255 gio/glocalfileoutputstream.c:347 +-#: gio/glocalfileoutputstream.c:441 ++#: gio/glocalfileinputstream.c:272 gio/glocalfileoutputstream.c:563 ++#: gio/glocalfileoutputstream.c:1186 + #, c-format +-msgid "Error closing file: %s" +-msgstr "" ++msgid "Error seeking in file: %s" ++msgstr "Greška premotavanja u datoteci: %s" + +-#: gio/glocalfilemonitor.c:865 ++#: gio/glocalfilemonitor.c:866 + msgid "Unable to find default local file monitor type" +-msgstr "" ++msgstr "Nemoguć pronalazak zadane lokalne datoteke vrste monitora" + +-#: gio/glocalfileoutputstream.c:214 gio/glocalfileoutputstream.c:292 +-#: gio/glocalfileoutputstream.c:328 gio/glocalfileoutputstream.c:816 ++#: gio/glocalfileoutputstream.c:220 gio/glocalfileoutputstream.c:298 ++#: gio/glocalfileoutputstream.c:334 gio/glocalfileoutputstream.c:822 + #, c-format + msgid "Error writing to file: %s" +-msgstr "" ++msgstr "Greška zapisivanja datoteke: %s" + +-#: gio/glocalfileoutputstream.c:374 ++#: gio/glocalfileoutputstream.c:380 + #, c-format + msgid "Error removing old backup link: %s" +-msgstr "" ++msgstr "Greška uklanjanja poveznice stare sigurnosne kopije: %s" + +-#: gio/glocalfileoutputstream.c:388 gio/glocalfileoutputstream.c:401 ++#: gio/glocalfileoutputstream.c:394 gio/glocalfileoutputstream.c:407 + #, c-format + msgid "Error creating backup copy: %s" +-msgstr "" ++msgstr "Greška stvaranja kopije sigurnosnog kopiranja: %s" + +-#: gio/glocalfileoutputstream.c:419 ++#: gio/glocalfileoutputstream.c:425 + #, c-format + msgid "Error renaming temporary file: %s" +-msgstr "" ++msgstr "Greška preimenovanja privremene datoteke: %s" + +-#: gio/glocalfileoutputstream.c:603 gio/glocalfileoutputstream.c:1168 ++#: gio/glocalfileoutputstream.c:609 gio/glocalfileoutputstream.c:1237 + #, c-format + msgid "Error truncating file: %s" +-msgstr "" ++msgstr "Greška skraćivanja datoteke: %s" + +-#: gio/glocalfileoutputstream.c:656 gio/glocalfileoutputstream.c:894 +-#: gio/glocalfileoutputstream.c:1149 gio/gsubprocess.c:380 ++#: gio/glocalfileoutputstream.c:662 gio/glocalfileoutputstream.c:907 ++#: gio/glocalfileoutputstream.c:1218 gio/gsubprocess.c:226 + #, c-format + msgid "Error opening file “%s”: %s" + msgstr "Greška otvaranja datoteke “%s”: %s" + +-#: gio/glocalfileoutputstream.c:928 ++#: gio/glocalfileoutputstream.c:957 + msgid "Target file is a directory" +-msgstr "Ciljana datoteka je direktorij" ++msgstr "Odredišna datoteka je direktorij" + +-#: gio/glocalfileoutputstream.c:933 ++#: gio/glocalfileoutputstream.c:971 + msgid "Target file is not a regular file" +-msgstr "Ciljana datoteka nije obična datoteka" ++msgstr "Odredišna datoteka nije obična datoteka" + +-#: gio/glocalfileoutputstream.c:945 ++#: gio/glocalfileoutputstream.c:1013 + msgid "The file was externally modified" + msgstr "Datoteka je promijenjena izvana" + +-#: gio/glocalfileoutputstream.c:1133 ++#: gio/glocalfileoutputstream.c:1202 + #, c-format + msgid "Error removing old file: %s" + msgstr "Greška uklanjanja stare datoteke: %s" + + #: gio/gmemoryinputstream.c:474 gio/gmemoryoutputstream.c:772 + msgid "Invalid GSeekType supplied" +-msgstr "" ++msgstr "Nevaljana GSeekType je pružana" + + #: gio/gmemoryinputstream.c:484 + msgid "Invalid seek request" +-msgstr "Neispravan zahtjev pretraživanja" ++msgstr "Neispravan zahtjev premotavanja" + + #: gio/gmemoryinputstream.c:508 + msgid "Cannot truncate GMemoryInputStream" +-msgstr "" ++msgstr "Nemoguće je skratiti GMemoryInputStream" + + #: gio/gmemoryoutputstream.c:567 + msgid "Memory output stream not resizable" +-msgstr "" ++msgstr "Memoriji izlaznog strujanja ne može se mijenjati veličina" + + #: gio/gmemoryoutputstream.c:583 + msgid "Failed to resize memory output stream" +-msgstr "" ++msgstr "Nemoguća promjena veličine memorije izlaznog strujanja" + + #: gio/gmemoryoutputstream.c:673 + msgid "" + "Amount of memory required to process the write is larger than available " + "address space" + msgstr "" ++"Količina memorije potrebna za obradu zapisa većeg od dostupnog adresiranog " ++"prostora" + + #: gio/gmemoryoutputstream.c:782 + msgid "Requested seek before the beginning of the stream" +-msgstr "" ++msgstr "Zatraženo premotavanje prije početka strujanja" + + #: gio/gmemoryoutputstream.c:797 + msgid "Requested seek beyond the end of the stream" +-msgstr "" ++msgstr "Zatraženo premotavanje izvan završetka strujanja" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement unmount. + #: gio/gmount.c:399 + msgid "mount doesn’t implement “unmount”" +-msgstr "" ++msgstr "montiranje nema implementirano “unmount”" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement eject. + #: gio/gmount.c:475 + msgid "mount doesn’t implement “eject”" +-msgstr "" ++msgstr "montiranje nema implementirano “eject”" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement any of unmount or unmount_with_operation. + #: gio/gmount.c:553 + msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" +-msgstr "" ++msgstr "montiranje nema implementirano “unmount” ili “unmount_with_operation”" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement any of eject or eject_with_operation. + #: gio/gmount.c:638 + msgid "mount doesn’t implement “eject” or “eject_with_operation”" +-msgstr "" ++msgstr "montiranje nema implementirano “eject” ili “eject_with_operation”" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement remount. + #: gio/gmount.c:726 + msgid "mount doesn’t implement “remount”" +-msgstr "" ++msgstr "montiranje nema implementirano “remount”" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement content type guessing. + #: gio/gmount.c:808 + msgid "mount doesn’t implement content type guessing" +-msgstr "" ++msgstr "montiranje nema implementirano pogađanje vrste sadržaja" + + #. Translators: This is an error + #. * message for mount objects that + #. * don't implement content type guessing. + #: gio/gmount.c:895 + msgid "mount doesn’t implement synchronous content type guessing" +-msgstr "" ++msgstr "montiranje nema implementirano sinkrono pogađanje vrste sadržaja" + + #: gio/gnetworkaddress.c:415 + #, c-format + msgid "Hostname “%s” contains “[” but not “]”" +-msgstr "" ++msgstr "Naziv računala “%s” sadrži “[” ali ne i “]”" + + #: gio/gnetworkmonitorbase.c:219 gio/gnetworkmonitorbase.c:323 + msgid "Network unreachable" +-msgstr "" ++msgstr "Mreža je nedostupna" + + #: gio/gnetworkmonitorbase.c:257 gio/gnetworkmonitorbase.c:287 + msgid "Host unreachable" +-msgstr "" ++msgstr "Poslužitelj je nedostupan" + + #: gio/gnetworkmonitornetlink.c:99 gio/gnetworkmonitornetlink.c:111 + #: gio/gnetworkmonitornetlink.c:130 + #, c-format + msgid "Could not create network monitor: %s" +-msgstr "" ++msgstr "Nemoguće stvaranje nadgledanja mreže: %s" + + #: gio/gnetworkmonitornetlink.c:120 + msgid "Could not create network monitor: " +-msgstr "" ++msgstr "Nemoguće stvaranje nadgledanja mreže: " + + #: gio/gnetworkmonitornetlink.c:183 + msgid "Could not get network status: " +-msgstr "" ++msgstr "Nemoguće dobivanje stanja mreže: " + +-#: gio/gnetworkmonitornm.c:348 ++#: gio/gnetworkmonitornm.c:311 + #, c-format + msgid "NetworkManager not running" +-msgstr "" ++msgstr "Mrežni upravitelj nije pokrenut" + +-#: gio/gnetworkmonitornm.c:359 ++#: gio/gnetworkmonitornm.c:322 + #, c-format + msgid "NetworkManager version too old" +-msgstr "" ++msgstr "Inačica Mrežnog upravitelja je prestara" + + #: gio/goutputstream.c:232 gio/goutputstream.c:775 + msgid "Output stream doesn’t implement write" +-msgstr "" ++msgstr "Izlazno strujanje nema implementirano zapisivanje" + + #: gio/goutputstream.c:472 gio/goutputstream.c:1533 + #, c-format + msgid "Sum of vectors passed to %s too large" +-msgstr "" ++msgstr "Zbroj vektora proslijeđenih u %s je prevelik" + + #: gio/goutputstream.c:736 gio/goutputstream.c:1761 + msgid "Source stream is already closed" +-msgstr "" ++msgstr "Izvor strujanja je već zatvoren" + + #: gio/gresolver.c:386 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:168 + #, c-format +@@ -3276,70 +3453,77 @@ msgstr "Greška razrješavanja “%s”: %s" + #: gio/gresolver.c:455 gio/gresolver.c:615 + #, c-format + msgid "%s not implemented" +-msgstr "%s nije impelmentirano" ++msgstr "%s nije impelmentiran" + + #: gio/gresolver.c:984 gio/gresolver.c:1036 + msgid "Invalid domain" + msgstr "Neispravna domena" + +-#: gio/gresource.c:672 gio/gresource.c:931 gio/gresource.c:970 +-#: gio/gresource.c:1094 gio/gresource.c:1166 gio/gresource.c:1239 +-#: gio/gresource.c:1320 gio/gresourcefile.c:476 gio/gresourcefile.c:599 ++#: gio/gresource.c:681 gio/gresource.c:943 gio/gresource.c:983 ++#: gio/gresource.c:1107 gio/gresource.c:1179 gio/gresource.c:1253 ++#: gio/gresource.c:1334 gio/gresourcefile.c:476 gio/gresourcefile.c:599 + #: gio/gresourcefile.c:736 + #, c-format + msgid "The resource at “%s” does not exist" +-msgstr "" ++msgstr "Resurs na “%s” ne postoji" + +-#: gio/gresource.c:837 ++#: gio/gresource.c:848 + #, c-format + msgid "The resource at “%s” failed to decompress" +-msgstr "" ++msgstr "Resurs na “%s” se nije uspio raspakirati" + + #: gio/gresourcefile.c:732 + #, c-format + msgid "The resource at “%s” is not a directory" +-msgstr "" ++msgstr "Resurs na “%s” nije direktorij" + + #: gio/gresourcefile.c:940 + msgid "Input stream doesn’t implement seek" +-msgstr "" ++msgstr "Ulazno strujanje nema implementirano premotavanje" + +-#: gio/gresource-tool.c:499 ++#: gio/gresource-tool.c:500 + msgid "List sections containing resources in an elf FILE" +-msgstr "" ++msgstr "Prikaži odjeljke koji sadrže resurse u elf DATOTECI" + +-#: gio/gresource-tool.c:505 ++#: gio/gresource-tool.c:506 + msgid "" + "List resources\n" + "If SECTION is given, only list resources in this section\n" + "If PATH is given, only list matching resources" + msgstr "" ++"Prikaži resurse\n" ++"Ako je ODJELJAK zadan, samo prikaži resurse u ovom odjeljku\n" ++"Ako je PUTANJA zadana, samo prikaži podudarajuće resurse" + +-#: gio/gresource-tool.c:508 gio/gresource-tool.c:518 ++#: gio/gresource-tool.c:509 gio/gresource-tool.c:519 + msgid "FILE [PATH]" + msgstr "DATOTEKA [PUTANJA]" + +-#: gio/gresource-tool.c:509 gio/gresource-tool.c:519 gio/gresource-tool.c:526 ++#: gio/gresource-tool.c:510 gio/gresource-tool.c:520 gio/gresource-tool.c:527 + msgid "SECTION" + msgstr "ODJELJAK" + +-#: gio/gresource-tool.c:514 ++#: gio/gresource-tool.c:515 + msgid "" + "List resources with details\n" + "If SECTION is given, only list resources in this section\n" + "If PATH is given, only list matching resources\n" + "Details include the section, size and compression" + msgstr "" ++"Prikaži resurse s pojedinostima\n" ++"Ako je ODJELJAK zadan, samo prikaži resurse u ovom odjeljku\n" ++"Ako je PUTANJA zadana, samo prikaži podudarajuće resurse\n" ++"Pojedinosti uključuju odjeljak, veličinu i sažimanje" + +-#: gio/gresource-tool.c:524 ++#: gio/gresource-tool.c:525 + msgid "Extract a resource file to stdout" +-msgstr "" ++msgstr "Raspakiraj datoteku resursa u stdout" + +-#: gio/gresource-tool.c:525 ++#: gio/gresource-tool.c:526 + msgid "FILE PATH" + msgstr "PUTANJA DATOTEKE" + +-#: gio/gresource-tool.c:539 ++#: gio/gresource-tool.c:540 + msgid "" + "Usage:\n" + " gresource [--section SECTION] COMMAND [ARGS…]\n" +@@ -3354,8 +3538,20 @@ msgid "" + "Use “gresource help COMMAND” to get detailed help.\n" + "\n" + msgstr "" ++"Upotreba:\n" ++" gresource [--section ODJELJAK] NAREDBA [ARGUMENTI…]\n" ++"\n" ++"Commands:\n" ++" help Prikaži ove informacije\n" ++" sections Prikaži odjeljke resursa\n" ++" list Prikaži resurse\n" ++" details Prikaži resurse s pojedinostima\n" ++" extract Raspakiraj resurs\n" ++"\n" ++"Koristite “gresource help NAREDBU” za dobivanje opširnije pomoći.\n" ++"\n" + +-#: gio/gresource-tool.c:553 ++#: gio/gresource-tool.c:554 + #, c-format + msgid "" + "Usage:\n" +@@ -3364,159 +3560,171 @@ msgid "" + "%s\n" + "\n" + msgstr "" ++"Upotreba:\n" ++" gresource %s%s%s %s\n" ++"\n" ++"%s\n" ++"\n" + +-#: gio/gresource-tool.c:560 ++#: gio/gresource-tool.c:561 + msgid " SECTION An (optional) elf section name\n" +-msgstr "" ++msgstr " ODJELJAK (Neobavezni) elf naziv odjeljka\n" + +-#: gio/gresource-tool.c:564 gio/gsettings-tool.c:701 ++#: gio/gresource-tool.c:565 gio/gsettings-tool.c:706 + msgid " COMMAND The (optional) command to explain\n" +-msgstr "" ++msgstr " Naredba (Neobavezna) naredba objašnjenja\n" + +-#: gio/gresource-tool.c:570 ++#: gio/gresource-tool.c:571 + msgid " FILE An elf file (a binary or a shared library)\n" +-msgstr "" ++msgstr " DATOTEKA elf datoteka (binarna ili dijeljena biblioteka)\n" + +-#: gio/gresource-tool.c:573 ++#: gio/gresource-tool.c:574 + msgid "" + " FILE An elf file (a binary or a shared library)\n" + " or a compiled resource file\n" + msgstr "" ++" DATOTEKA elf datoteka (binarna ili dijeljena biblioteka)\n" ++" ili kompilirana datoteka resursa\n" + +-#: gio/gresource-tool.c:577 ++#: gio/gresource-tool.c:578 + msgid "[PATH]" + msgstr "[PUTANJA]" + +-#: gio/gresource-tool.c:579 ++#: gio/gresource-tool.c:580 + msgid " PATH An (optional) resource path (may be partial)\n" +-msgstr "" ++msgstr " PUTANJA (Neobavezna) putanja resursa (može biti djelomična)\n" + +-#: gio/gresource-tool.c:580 ++#: gio/gresource-tool.c:581 + msgid "PATH" + msgstr "PUTANJA" + +-#: gio/gresource-tool.c:582 ++#: gio/gresource-tool.c:583 + msgid " PATH A resource path\n" +-msgstr "" ++msgstr " PUTANJA Putanja resursa\n" + +-#: gio/gsettings-tool.c:49 gio/gsettings-tool.c:70 gio/gsettings-tool.c:906 ++#: gio/gsettings-tool.c:49 gio/gsettings-tool.c:70 gio/gsettings-tool.c:911 + #, c-format + msgid "No such schema “%s”\n" +-msgstr "" ++msgstr "Nema takve sheme “%s”\n" + + #: gio/gsettings-tool.c:55 + #, c-format + msgid "Schema “%s” is not relocatable (path must not be specified)\n" +-msgstr "" ++msgstr "Shema “%s” se ne može premještati (putanja ne smije biti navedena)\n" + + #: gio/gsettings-tool.c:76 + #, c-format + msgid "Schema “%s” is relocatable (path must be specified)\n" +-msgstr "" ++msgstr "Shema “%s” se može premještati (putanja mora biti navedena)\n" + + #: gio/gsettings-tool.c:90 + msgid "Empty path given.\n" +-msgstr "" ++msgstr "Navedena je prazna putanja.\n" + + #: gio/gsettings-tool.c:96 + msgid "Path must begin with a slash (/)\n" +-msgstr "" ++msgstr "Putanja mora započet s kosom crtom (/)\n" + + #: gio/gsettings-tool.c:102 + msgid "Path must end with a slash (/)\n" +-msgstr "" ++msgstr "Putanja mora završavati s kosom crtom (/)\n" + + #: gio/gsettings-tool.c:108 + msgid "Path must not contain two adjacent slashes (//)\n" +-msgstr "" ++msgstr "Putanja ne smije sadržavati dvije uzastopne kose crte (//)\n" + +-#: gio/gsettings-tool.c:536 ++#: gio/gsettings-tool.c:541 + msgid "The provided value is outside of the valid range\n" +-msgstr "" ++msgstr "Navedene vrijednosti su izvan valjanog raspona\n" + +-#: gio/gsettings-tool.c:543 ++#: gio/gsettings-tool.c:548 + msgid "The key is not writable\n" +-msgstr "" ++msgstr "Ključ nije zapisiv\n" + +-#: gio/gsettings-tool.c:579 ++#: gio/gsettings-tool.c:584 + msgid "List the installed (non-relocatable) schemas" +-msgstr "" ++msgstr "Prikaži instalirane (nepremjestive) sheme" + +-#: gio/gsettings-tool.c:585 ++#: gio/gsettings-tool.c:590 + msgid "List the installed relocatable schemas" +-msgstr "" ++msgstr "Prikaži instalirane premjestive sheme" + +-#: gio/gsettings-tool.c:591 ++#: gio/gsettings-tool.c:596 + msgid "List the keys in SCHEMA" +-msgstr "" ++msgstr "Prikaži ključeve U SHEMI" + +-#: gio/gsettings-tool.c:592 gio/gsettings-tool.c:598 gio/gsettings-tool.c:641 ++#: gio/gsettings-tool.c:597 gio/gsettings-tool.c:603 gio/gsettings-tool.c:646 + msgid "SCHEMA[:PATH]" + msgstr "SHEMA[:PUTANJA]" + +-#: gio/gsettings-tool.c:597 ++#: gio/gsettings-tool.c:602 + msgid "List the children of SCHEMA" +-msgstr "" ++msgstr "Prikaži podsadržaj SHEME" + +-#: gio/gsettings-tool.c:603 ++#: gio/gsettings-tool.c:608 + msgid "" + "List keys and values, recursively\n" + "If no SCHEMA is given, list all keys\n" + msgstr "" ++"Prikaži ključeve i vrijednosti, rekruzivno\n" ++"Ako nema zadane SHEME, prikaži sve ključeve\n" + +-#: gio/gsettings-tool.c:605 ++#: gio/gsettings-tool.c:610 + msgid "[SCHEMA[:PATH]]" + msgstr "[SHEMA[:PUTANJA]]" + +-#: gio/gsettings-tool.c:610 ++#: gio/gsettings-tool.c:615 + msgid "Get the value of KEY" +-msgstr "" ++msgstr "Nabavi vrijednost KLJUČA" + +-#: gio/gsettings-tool.c:611 gio/gsettings-tool.c:617 gio/gsettings-tool.c:623 +-#: gio/gsettings-tool.c:635 gio/gsettings-tool.c:647 ++#: gio/gsettings-tool.c:616 gio/gsettings-tool.c:622 gio/gsettings-tool.c:628 ++#: gio/gsettings-tool.c:640 gio/gsettings-tool.c:652 + msgid "SCHEMA[:PATH] KEY" + msgstr "SHEMA[:PUTANJA] KLJUČ" + +-#: gio/gsettings-tool.c:616 ++#: gio/gsettings-tool.c:621 + msgid "Query the range of valid values for KEY" +-msgstr "" ++msgstr "Upitaj za raspon valjanih vrijednosti KLJUČA" + +-#: gio/gsettings-tool.c:622 ++#: gio/gsettings-tool.c:627 + msgid "Query the description for KEY" +-msgstr "" ++msgstr "Upitaj za opis KLJUČA" + +-#: gio/gsettings-tool.c:628 ++#: gio/gsettings-tool.c:633 + msgid "Set the value of KEY to VALUE" +-msgstr "" ++msgstr "Postavi vrijednost KLJUČA u VRIJEDNOST" + +-#: gio/gsettings-tool.c:629 ++#: gio/gsettings-tool.c:634 + msgid "SCHEMA[:PATH] KEY VALUE" + msgstr "SHEMA[:PUTANJA] VRIJEDNOST KLJUČA" + +-#: gio/gsettings-tool.c:634 ++#: gio/gsettings-tool.c:639 + msgid "Reset KEY to its default value" +-msgstr "" ++msgstr "Vrati KLJUČ na njegovu zadanu vrijednost" + +-#: gio/gsettings-tool.c:640 ++#: gio/gsettings-tool.c:645 + msgid "Reset all keys in SCHEMA to their defaults" +-msgstr "" ++msgstr "Vrati sve ključeve u SHEMI na njihove zadane vrijednosti" + +-#: gio/gsettings-tool.c:646 ++#: gio/gsettings-tool.c:651 + msgid "Check if KEY is writable" +-msgstr "" ++msgstr "Provjeri je li KLJUČ zapisiv" + +-#: gio/gsettings-tool.c:652 ++#: gio/gsettings-tool.c:657 + msgid "" + "Monitor KEY for changes.\n" + "If no KEY is specified, monitor all keys in SCHEMA.\n" + "Use ^C to stop monitoring.\n" + msgstr "" ++"Nadgledaj KLJUČ za promjene.\n" ++"Ako KLJUČ nije naveden, nadgledaj sve ključeve u SHEMI.\n" ++"Koristite ^C za zaustavljanje nadgledanja.\n" + +-#: gio/gsettings-tool.c:655 ++#: gio/gsettings-tool.c:660 + msgid "SCHEMA[:PATH] [KEY]" + msgstr "SHEMA[:PUTANJA] [KLJUČ]" + +-#: gio/gsettings-tool.c:667 ++#: gio/gsettings-tool.c:672 + msgid "" + "Usage:\n" + " gsettings --version\n" +@@ -3541,8 +3749,30 @@ msgid "" + "Use “gsettings help COMMAND” to get detailed help.\n" + "\n" + msgstr "" ++"Upotreba:\n" ++" gsettings --version\n" ++" gsettings [--schemadir DIREKTORIJ SHEME] NAREDBA [ARGUMENTI…]\n" ++"\n" ++"Naredbe:\n" ++" help Prikaži ove informacije\n" ++" list-schemas Prikaži instalirane sheme\n" ++" list-relocatable-schemas Prikaži premjestive sheme\n" ++" list-keys Prikaži ključeve u shemi\n" ++" list-children Prikaži podsadržaj scheme\n" ++" list-recursively Prikaži ključeve i vrijednosti, rekruzivno\n" ++" range Upitaj za raspon ključa\n" ++" describe Upitaj za opis ključa\n" ++" get Nabavi vrijednost ključa\n" ++" set Postavi vrijednost ključa\n" ++" reset Vrati izvornu vrijednost ključa\n" ++" reset-recursively Vrati izvorne sve vrijednosti u zadanoj shemi\n" ++" writable Provjeri je li ključ zapisiv\n" ++" monitor Nadgledaj promjene\n" ++"\n" ++"Koristite “gsettings help NAREDBA” za opširniju pomoć.\n" ++"\n" + +-#: gio/gsettings-tool.c:691 ++#: gio/gsettings-tool.c:696 + #, c-format + msgid "" + "Usage:\n" +@@ -3551,394 +3781,413 @@ msgid "" + "%s\n" + "\n" + msgstr "" ++"Upotreba:\n" ++" gsettings [--schemadir DIREKTORIJ SHEME] %s %s\n" ++"\n" ++"%s\n" ++"\n" + +-#: gio/gsettings-tool.c:697 ++#: gio/gsettings-tool.c:702 + msgid " SCHEMADIR A directory to search for additional schemas\n" +-msgstr "" ++msgstr " DIREKTORIJ SHEME Direktorij za pretragu dodatnih shema\n" + +-#: gio/gsettings-tool.c:705 ++#: gio/gsettings-tool.c:710 + msgid "" + " SCHEMA The name of the schema\n" + " PATH The path, for relocatable schemas\n" + msgstr "" ++" SHEMA Naziv sheme\n" ++" PUTANJA Putanja, za premjestive sheme\n" + +-#: gio/gsettings-tool.c:710 ++#: gio/gsettings-tool.c:715 + msgid " KEY The (optional) key within the schema\n" +-msgstr "" ++msgstr " KLJUČ (Neobavezno) ključ sadržan unutar sheme\n" + +-#: gio/gsettings-tool.c:714 ++#: gio/gsettings-tool.c:719 + msgid " KEY The key within the schema\n" +-msgstr "" ++msgstr " KLJUČ Ključ sadržan unutar sheme\n" + +-#: gio/gsettings-tool.c:718 ++#: gio/gsettings-tool.c:723 + msgid " VALUE The value to set\n" +-msgstr "" ++msgstr " VRIJEDNOST Vrijednost za postaviti\n" + +-#: gio/gsettings-tool.c:773 ++#: gio/gsettings-tool.c:778 + #, c-format + msgid "Could not load schemas from %s: %s\n" + msgstr "Nemoguće učitavanje sheme iz %s: %s\n" + +-#: gio/gsettings-tool.c:785 ++#: gio/gsettings-tool.c:790 + msgid "No schemas installed\n" + msgstr "Nema instaliranih shema\n" + +-#: gio/gsettings-tool.c:864 ++#: gio/gsettings-tool.c:869 + msgid "Empty schema name given\n" +-msgstr "" ++msgstr "Zadan je prazan naziv sheme\n" + +-#: gio/gsettings-tool.c:919 ++#: gio/gsettings-tool.c:924 + #, c-format + msgid "No such key “%s”\n" +-msgstr "" ++msgstr "Nema takvog ključa “%s”\n" + + #: gio/gsocket.c:413 + msgid "Invalid socket, not initialized" +-msgstr "" ++msgstr "Nevaljana priključnica, nije pokrenuto" + + #: gio/gsocket.c:420 + #, c-format + msgid "Invalid socket, initialization failed due to: %s" +-msgstr "" ++msgstr "Nevaljana priključnica, neuspjelo pokretanje zbog: %s" + + #: gio/gsocket.c:428 + msgid "Socket is already closed" +-msgstr "" ++msgstr "Priključnica je već zatvorena" + +-#: gio/gsocket.c:443 gio/gsocket.c:3180 gio/gsocket.c:4403 gio/gsocket.c:4461 ++#: gio/gsocket.c:443 gio/gsocket.c:3190 gio/gsocket.c:4420 gio/gsocket.c:4478 + msgid "Socket I/O timed out" + msgstr "Istek vremena U/I priključnice" + + #: gio/gsocket.c:578 + #, c-format + msgid "creating GSocket from fd: %s" +-msgstr "" ++msgstr "stvaranje GSocketa iz fd: %s" + +-#: gio/gsocket.c:607 gio/gsocket.c:661 gio/gsocket.c:668 ++#: gio/gsocket.c:607 gio/gsocket.c:671 gio/gsocket.c:678 + #, c-format + msgid "Unable to create socket: %s" +-msgstr "" ++msgstr "Nemoguće stvaranje priključnice: %s" + +-#: gio/gsocket.c:661 ++#: gio/gsocket.c:671 + msgid "Unknown family was specified" +-msgstr "" ++msgstr "Navedena je nepoznata obitelj" + +-#: gio/gsocket.c:668 ++#: gio/gsocket.c:678 + msgid "Unknown protocol was specified" +-msgstr "" ++msgstr "Naveden je nepoznat protokol" + +-#: gio/gsocket.c:1159 ++#: gio/gsocket.c:1169 + #, c-format + msgid "Cannot use datagram operations on a non-datagram socket." +-msgstr "" ++msgstr "Nemoguće korištenje datagram radnji na ne-datagram priključnici." + +-#: gio/gsocket.c:1176 ++#: gio/gsocket.c:1186 + #, c-format + msgid "Cannot use datagram operations on a socket with a timeout set." + msgstr "" ++"Nemoguće korištenje datagram radnji na priključnici s postavljenim istekom " ++"vremena." + +-#: gio/gsocket.c:1983 ++#: gio/gsocket.c:1993 + #, c-format + msgid "could not get local address: %s" +-msgstr "" ++msgstr "nemoguće dobivanje lokalne adrese: %s" + +-#: gio/gsocket.c:2029 ++#: gio/gsocket.c:2039 + #, c-format + msgid "could not get remote address: %s" +-msgstr "" ++msgstr "nemoguće dobivanje udaljene adrese: %s" + +-#: gio/gsocket.c:2095 ++#: gio/gsocket.c:2105 + #, c-format + msgid "could not listen: %s" +-msgstr "" ++msgstr "nemoguće osluškivanje: %s" + +-#: gio/gsocket.c:2199 +-#, fuzzy, c-format +-#| msgid "Error opening directory '%s': %s" ++#: gio/gsocket.c:2209 ++#, c-format + msgid "Error binding to address %s: %s" +-msgstr "Greška pri otvaranju mape '%s': %s" ++msgstr "Greška povezivanja s adresom %s: %s" + +-#: gio/gsocket.c:2375 gio/gsocket.c:2412 gio/gsocket.c:2522 gio/gsocket.c:2547 +-#: gio/gsocket.c:2610 gio/gsocket.c:2668 gio/gsocket.c:2686 ++#: gio/gsocket.c:2385 gio/gsocket.c:2422 gio/gsocket.c:2532 gio/gsocket.c:2557 ++#: gio/gsocket.c:2620 gio/gsocket.c:2678 gio/gsocket.c:2696 + #, c-format + msgid "Error joining multicast group: %s" +-msgstr "" ++msgstr "Greška pridruživanja multicast grupi: %s" + +-#: gio/gsocket.c:2376 gio/gsocket.c:2413 gio/gsocket.c:2523 gio/gsocket.c:2548 +-#: gio/gsocket.c:2611 gio/gsocket.c:2669 gio/gsocket.c:2687 ++#: gio/gsocket.c:2386 gio/gsocket.c:2423 gio/gsocket.c:2533 gio/gsocket.c:2558 ++#: gio/gsocket.c:2621 gio/gsocket.c:2679 gio/gsocket.c:2697 + #, c-format + msgid "Error leaving multicast group: %s" +-msgstr "" ++msgstr "Greška napuštanja multicast grupe: %s" + +-#: gio/gsocket.c:2377 ++#: gio/gsocket.c:2387 + msgid "No support for source-specific multicast" +-msgstr "" ++msgstr "Nema podrške za izvorom-određeni multicast" + +-#: gio/gsocket.c:2524 ++#: gio/gsocket.c:2534 + msgid "Unsupported socket family" +-msgstr "" ++msgstr "Nepodržana obitelj priključnice" + +-#: gio/gsocket.c:2549 ++#: gio/gsocket.c:2559 + msgid "source-specific not an IPv4 address" +-msgstr "" ++msgstr "izvorom-određeno nije IPv4 adresa" + +-#: gio/gsocket.c:2573 ++#: gio/gsocket.c:2583 + #, c-format + msgid "Interface name too long" +-msgstr "" ++msgstr "Naziv sučelja je predugačak" + +-#: gio/gsocket.c:2586 gio/gsocket.c:2636 ++#: gio/gsocket.c:2596 gio/gsocket.c:2646 + #, c-format + msgid "Interface not found: %s" +-msgstr "" ++msgstr "Sučelje nije pronađeno: %s" + +-#: gio/gsocket.c:2612 ++#: gio/gsocket.c:2622 + msgid "No support for IPv4 source-specific multicast" +-msgstr "" ++msgstr "Nema podrške za IPv4 izvorom-određeni multicast" + +-#: gio/gsocket.c:2670 ++#: gio/gsocket.c:2680 + msgid "No support for IPv6 source-specific multicast" +-msgstr "" ++msgstr "Nema podrške za IPv6 izvorom-određeni multicast" + +-#: gio/gsocket.c:2879 ++#: gio/gsocket.c:2889 + #, c-format + msgid "Error accepting connection: %s" +-msgstr "" ++msgstr "Greška prihvaćanja povezivanja: %s" + +-#: gio/gsocket.c:3005 ++#: gio/gsocket.c:3015 + msgid "Connection in progress" +-msgstr "" ++msgstr "Povezivanje u tijeku" + +-#: gio/gsocket.c:3056 ++#: gio/gsocket.c:3066 + msgid "Unable to get pending error: " +-msgstr "" ++msgstr "Nemoguće dobivanje greške čekanja: " + +-#: gio/gsocket.c:3245 ++#: gio/gsocket.c:3255 + #, c-format + msgid "Error receiving data: %s" +-msgstr "" ++msgstr "Greška primanja podataka: %s" + +-#: gio/gsocket.c:3442 ++#: gio/gsocket.c:3452 + #, c-format + msgid "Error sending data: %s" +-msgstr "" ++msgstr "Greška slanja podataka: %s" + +-#: gio/gsocket.c:3629 ++#: gio/gsocket.c:3639 + #, c-format + msgid "Unable to shutdown socket: %s" +-msgstr "" ++msgstr "Nemoguće isključivanje priključnice: %s" + +-#: gio/gsocket.c:3710 ++#: gio/gsocket.c:3720 + #, c-format + msgid "Error closing socket: %s" +-msgstr "" ++msgstr "Greška zatvaranja priključnice: %s" + +-#: gio/gsocket.c:4396 ++#: gio/gsocket.c:4413 + #, c-format + msgid "Waiting for socket condition: %s" +-msgstr "" ++msgstr "Čekanje stanja priključnice: %s" + +-#: gio/gsocket.c:4774 gio/gsocket.c:4776 gio/gsocket.c:4923 gio/gsocket.c:5008 +-#: gio/gsocket.c:5186 gio/gsocket.c:5226 gio/gsocket.c:5228 ++#: gio/gsocket.c:4804 gio/gsocket.c:4820 gio/gsocket.c:4833 ++#, c-format ++msgid "Unable to send message: %s" ++msgstr "Nemoguće slanje poruke: %s" ++ ++#: gio/gsocket.c:4805 gio/gsocket.c:4821 gio/gsocket.c:4834 ++msgid "Message vectors too large" ++msgstr "Vektori poruke su preveliki" ++ ++#: gio/gsocket.c:4850 gio/gsocket.c:4852 gio/gsocket.c:4999 gio/gsocket.c:5084 ++#: gio/gsocket.c:5262 gio/gsocket.c:5302 gio/gsocket.c:5304 + #, c-format + msgid "Error sending message: %s" +-msgstr "" ++msgstr "Greška slanja poruke: %s" + +-#: gio/gsocket.c:4950 ++#: gio/gsocket.c:5026 + msgid "GSocketControlMessage not supported on Windows" +-msgstr "" ++msgstr "GSocketControlMessage nije podržano na Windowsima" + +-#: gio/gsocket.c:5419 gio/gsocket.c:5492 gio/gsocket.c:5718 ++#: gio/gsocket.c:5499 gio/gsocket.c:5575 gio/gsocket.c:5801 + #, c-format + msgid "Error receiving message: %s" +-msgstr "" ++msgstr "Greška primanja poruke: %s" + +-#: gio/gsocket.c:5990 gio/gsocket.c:6038 +-#, fuzzy, c-format +-#| msgid "Failed to read from file '%s': %s" ++#: gio/gsocket.c:6074 gio/gsocket.c:6085 gio/gsocket.c:6131 ++#, c-format + msgid "Unable to read socket credentials: %s" +-msgstr "Greška pri čitanju iz datoteke '%s': %s" ++msgstr "Nemoguće čitanje vjerodajnice priključnice: %s" + +-#: gio/gsocket.c:6047 ++#: gio/gsocket.c:6140 + msgid "g_socket_get_credentials not implemented for this OS" +-msgstr "" ++msgstr "g_socket_get_credentials nije implemetirano za ovaj OS" + +-#: gio/gsocketclient.c:182 ++#: gio/gsocketclient.c:191 + #, c-format + msgid "Could not connect to proxy server %s: " +-msgstr "" ++msgstr "Nemoguće povezivanje sa proxy poslužiteljem %s: " + +-#: gio/gsocketclient.c:196 ++#: gio/gsocketclient.c:205 + #, c-format + msgid "Could not connect to %s: " +-msgstr "" ++msgstr "Nemoguće povezivanje sa %s: " + +-#: gio/gsocketclient.c:198 ++#: gio/gsocketclient.c:207 + msgid "Could not connect: " +-msgstr "" +- +-#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1866 +-msgid "Unknown error on connect" +-msgstr "" ++msgstr "Nemoguće povezivanje: " + +-#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668 ++#: gio/gsocketclient.c:1162 gio/gsocketclient.c:1749 + msgid "Proxying over a non-TCP connection is not supported." +-msgstr "" ++msgstr "Proxyiranje putem ne-TCP povezivanja nije podržano." + +-#: gio/gsocketclient.c:1120 gio/gsocketclient.c:1698 ++#: gio/gsocketclient.c:1194 gio/gsocketclient.c:1778 + #, c-format + msgid "Proxy protocol “%s” is not supported." +-msgstr "" ++msgstr "Proxy protokol “%s” još nije podržan." + + #: gio/gsocketlistener.c:230 + msgid "Listener is already closed" +-msgstr "" ++msgstr "Slušatelj je već zatvoren" + + #: gio/gsocketlistener.c:276 + msgid "Added socket is closed" +-msgstr "" ++msgstr "Dodana priključnica je zatvorena" + + #: gio/gsocks4aproxy.c:118 + #, c-format + msgid "SOCKSv4 does not support IPv6 address “%s”" +-msgstr "" ++msgstr "SOCKSv4 ne podržava IPv6 adresu “%s”" + + #: gio/gsocks4aproxy.c:136 + msgid "Username is too long for SOCKSv4 protocol" +-msgstr "" ++msgstr "Korisničko ime je predugačko za SOCKSv4 protokol" + + #: gio/gsocks4aproxy.c:153 + #, c-format + msgid "Hostname “%s” is too long for SOCKSv4 protocol" +-msgstr "" ++msgstr "Naziv računala “%s” je predugačak za SOCKSv4 protokol" + + #: gio/gsocks4aproxy.c:179 + msgid "The server is not a SOCKSv4 proxy server." +-msgstr "" ++msgstr "Poslužitelj nije SOCKSv4 proxy poslužitelj." + + #: gio/gsocks4aproxy.c:186 + msgid "Connection through SOCKSv4 server was rejected" +-msgstr "" ++msgstr "Povezivanje putem SOCKSv4 poslužitelja je odbijeno" + + #: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:338 gio/gsocks5proxy.c:348 + msgid "The server is not a SOCKSv5 proxy server." +-msgstr "" ++msgstr "Poslužitelj nije SOCKSv5 proxy poslužitelj." + + #: gio/gsocks5proxy.c:167 gio/gsocks5proxy.c:184 + msgid "The SOCKSv5 proxy requires authentication." +-msgstr "" ++msgstr "SOCKSv5 proxy zahtijeva ovjeru." + + #: gio/gsocks5proxy.c:191 + msgid "" + "The SOCKSv5 proxy requires an authentication method that is not supported by " + "GLib." +-msgstr "" ++msgstr "SOCKSv5 proxy zahtijeva način ovjere koji nije podržan od GLib strane." + + #: gio/gsocks5proxy.c:220 + msgid "Username or password is too long for SOCKSv5 protocol." +-msgstr "" ++msgstr "Korisničko ime ili lozinka su predugački za SOCKSv5 protokol." + + #: gio/gsocks5proxy.c:250 + msgid "SOCKSv5 authentication failed due to wrong username or password." + msgstr "" ++"SOCKSv5 ovjera je neuspjela zbog netočnog korisničkog imena ili lozinke." + + #: gio/gsocks5proxy.c:300 + #, c-format + msgid "Hostname “%s” is too long for SOCKSv5 protocol" +-msgstr "" ++msgstr "Naziv računala “%s” je predugačak za SOCKSv5 protokol" + + #: gio/gsocks5proxy.c:362 + msgid "The SOCKSv5 proxy server uses unknown address type." +-msgstr "" ++msgstr "SOCKSv5 proxy poslužitelj koristi nepoznatu vrstu adrese." + + #: gio/gsocks5proxy.c:369 + msgid "Internal SOCKSv5 proxy server error." +-msgstr "" ++msgstr "Unutrašnja greška SOCKSv5 proxy poslužitelja." + + #: gio/gsocks5proxy.c:375 + msgid "SOCKSv5 connection not allowed by ruleset." +-msgstr "" ++msgstr "SOCKSv5 povezivanje nije dopušteno postavljenim pravilima." + + #: gio/gsocks5proxy.c:382 + msgid "Host unreachable through SOCKSv5 server." +-msgstr "" ++msgstr "Poslužitelj je nedostupsn putem SOCKSv5 poslužitelja." + + #: gio/gsocks5proxy.c:388 + msgid "Network unreachable through SOCKSv5 proxy." +-msgstr "" ++msgstr "Mreža je nedostupna putem SOCKSv5 proxya." + + #: gio/gsocks5proxy.c:394 + msgid "Connection refused through SOCKSv5 proxy." +-msgstr "" ++msgstr "Povezivanje je odbijeno putem SOCKSv5 proxya." + + #: gio/gsocks5proxy.c:400 + msgid "SOCKSv5 proxy does not support “connect” command." +-msgstr "" ++msgstr "SOCKSv5 proxy ne podržava “connect” naredbu." + + #: gio/gsocks5proxy.c:406 + msgid "SOCKSv5 proxy does not support provided address type." +-msgstr "" ++msgstr "SOCKSv5 proxy ne podržava navedenu vrstu adrese." + + #: gio/gsocks5proxy.c:412 + msgid "Unknown SOCKSv5 proxy error." +-msgstr "" ++msgstr "Nepoznata SOCKSv5 proxy greška." + + #: gio/gthemedicon.c:595 + #, c-format + msgid "Can’t handle version %d of GThemedIcon encoding" +-msgstr "" ++msgstr "Nemoguće rukovanje %d inačicom GThemedIcon kôdiranja" + + #: gio/gthreadedresolver.c:152 + msgid "No valid addresses were found" +-msgstr "" ++msgstr "Nema pronađenih valjanih adresa" + + #: gio/gthreadedresolver.c:337 + #, c-format + msgid "Error reverse-resolving “%s”: %s" +-msgstr "" ++msgstr "Greška obrnutog razrješavanja “%s”: %s" + + #: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 + #: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 + #, c-format + msgid "No DNS record of the requested type for “%s”" +-msgstr "" ++msgstr "Nema DNS zapisa zahtijevane vrste za “%s”" + + #: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 + #, c-format + msgid "Temporarily unable to resolve “%s”" +-msgstr "" ++msgstr "Privremeno nedostupno za razrješavanje “%s”" + + #: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 + #: gio/gthreadedresolver.c:973 + #, c-format + msgid "Error resolving “%s”" +-msgstr "" ++msgstr "Greška razrješavanja “%s”" + +-#: gio/gtlscertificate.c:243 ++#: gio/gtlscertificate.c:431 + msgid "No PEM-encoded private key found" +-msgstr "" ++msgstr "Nema pronađenog PEM-kôdiranog privatnog ključa" + +-#: gio/gtlscertificate.c:253 ++#: gio/gtlscertificate.c:441 + msgid "Cannot decrypt PEM-encoded private key" +-msgstr "" ++msgstr "Nemoguće dešifriranje PEM-kôdiranog privatnog ključa" + +-#: gio/gtlscertificate.c:264 ++#: gio/gtlscertificate.c:452 + msgid "Could not parse PEM-encoded private key" +-msgstr "" ++msgstr "Nemoguća obrada PEM-kôdiranog privatnog ključa" + +-#: gio/gtlscertificate.c:291 ++#: gio/gtlscertificate.c:479 + msgid "No PEM-encoded certificate found" +-msgstr "" ++msgstr "Nema pronađene PEM-kôdirane vjerodajnice" + +-#: gio/gtlscertificate.c:300 ++#: gio/gtlscertificate.c:488 + msgid "Could not parse PEM-encoded certificate" +-msgstr "" ++msgstr "Nemoguća obrada PEM-kôdirane vjerodajnice" ++ ++#: gio/gtlscertificate.c:844 ++msgid "This GTlsBackend does not support creating PKCS #11 certificates" ++msgstr "GTlsBackend ne podržava stvaranje PKCS #11 vjerodajnica" + + #: gio/gtlspassword.c:111 + msgid "" + "This is the last chance to enter the password correctly before your access " + "is locked out." + msgstr "" ++"Ovo je posljednja šansa za ispravno upisivanje lozinke prije nego što se vaš " ++"pristup zaključa." + + #. Translators: This is not the 'This is the last chance' string. It is + #. * displayed when more than one attempt is allowed. +@@ -3947,115 +4196,119 @@ msgid "" + "Several passwords entered have been incorrect, and your access will be " + "locked out after further failures." + msgstr "" ++"Nekoliko lozinki je neispravno upisano i vaš pristup će se zaključati nakon " ++"budućih neuspjelih upisa." + + #: gio/gtlspassword.c:117 + msgid "The password entered is incorrect." +-msgstr "" ++msgstr "Upisana lozinka je neispravna." + + #: gio/gunixconnection.c:166 gio/gunixconnection.c:579 + #, c-format + msgid "Expecting 1 control message, got %d" + msgid_plural "Expecting 1 control message, got %d" +-msgstr[0] "" +-msgstr[1] "" +-msgstr[2] "" ++msgstr[0] "Očekivana je 1 kontrolna poruka, dobivena je %d" ++msgstr[1] "Očekivana je 1 kontrolna poruka, dobivene su %d" ++msgstr[2] "Očekivana je 1 kontrolna poruka, dobiveno je %d" + + #: gio/gunixconnection.c:182 gio/gunixconnection.c:591 + msgid "Unexpected type of ancillary data" +-msgstr "" ++msgstr "Neočekivana vrsta pomoćnih podataka" + + #: gio/gunixconnection.c:200 + #, c-format + msgid "Expecting one fd, but got %d\n" + msgid_plural "Expecting one fd, but got %d\n" +-msgstr[0] "" +-msgstr[1] "" +-msgstr[2] "" ++msgstr[0] "Očekivan je jedan fd, ali dobiven je %d\n" ++msgstr[1] "Očekivan je jedan fd, ali dobivena su %d\n" ++msgstr[2] "Očekivan je jedan fd, ali dobiveno je %d\n" + + #: gio/gunixconnection.c:219 + msgid "Received invalid fd" +-msgstr "" ++msgstr "Primljen je nevaljani fd" + + #: gio/gunixconnection.c:363 + msgid "Error sending credentials: " +-msgstr "" ++msgstr "Greška slanja vjerodajnica: " + + #: gio/gunixconnection.c:520 + #, c-format + msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +-msgstr "" ++msgstr "Greška provjere je li SO_PASSCRED omogućen za priključnicu: %s" + + #: gio/gunixconnection.c:536 + #, c-format + msgid "Error enabling SO_PASSCRED: %s" +-msgstr "" ++msgstr "Greška omgućavanja SO_PASSCRED: %s" + + #: gio/gunixconnection.c:565 + msgid "" + "Expecting to read a single byte for receiving credentials but read zero bytes" + msgstr "" ++"Očekivano čitanje je jedan bajt primljenih vjerodajnica ali očitano je nula " ++"bajta" + + #: gio/gunixconnection.c:605 + #, c-format + msgid "Not expecting control message, but got %d" +-msgstr "" ++msgstr "Ne očekuje se kontrolna poruka, ali dobivena je %d" + + #: gio/gunixconnection.c:630 + #, c-format + msgid "Error while disabling SO_PASSCRED: %s" +-msgstr "" ++msgstr "Greška onemogućavanja SO_PASSCRED: %s" + +-#: gio/gunixinputstream.c:362 gio/gunixinputstream.c:383 ++#: gio/gunixinputstream.c:357 gio/gunixinputstream.c:378 + #, c-format + msgid "Error reading from file descriptor: %s" +-msgstr "" ++msgstr "Greška čitanja iz opisnika datoteke: %s" + +-#: gio/gunixinputstream.c:416 gio/gunixoutputstream.c:525 ++#: gio/gunixinputstream.c:411 gio/gunixoutputstream.c:520 + #: gio/gwin32inputstream.c:217 gio/gwin32outputstream.c:204 + #, c-format + msgid "Error closing file descriptor: %s" +-msgstr "" ++msgstr "Greška zatvaranja opisnika datoteke: %s" + +-#: gio/gunixmounts.c:2755 gio/gunixmounts.c:2808 ++#: gio/gunixmounts.c:2782 gio/gunixmounts.c:2835 + msgid "Filesystem root" +-msgstr "" ++msgstr "Korijenski datotečni sustav" + +-#: gio/gunixoutputstream.c:362 gio/gunixoutputstream.c:382 +-#: gio/gunixoutputstream.c:469 gio/gunixoutputstream.c:489 +-#: gio/gunixoutputstream.c:635 ++#: gio/gunixoutputstream.c:357 gio/gunixoutputstream.c:377 ++#: gio/gunixoutputstream.c:464 gio/gunixoutputstream.c:484 ++#: gio/gunixoutputstream.c:630 + #, c-format + msgid "Error writing to file descriptor: %s" +-msgstr "" ++msgstr "Greška zapisivanja u opisnik datoteke: %s" + +-#: gio/gunixsocketaddress.c:243 ++#: gio/gunixsocketaddress.c:244 + msgid "Abstract UNIX domain socket addresses not supported on this system" +-msgstr "" ++msgstr "Sažeta UNIX domena priključnice adrese nije podržana na ovom sustavu" + + #: gio/gvolume.c:438 + msgid "volume doesn’t implement eject" +-msgstr "" ++msgstr "uređaj nema implementirano izbacivanje" + + #. Translators: This is an error + #. * message for volume objects that + #. * don't implement any of eject or eject_with_operation. + #: gio/gvolume.c:515 + msgid "volume doesn’t implement eject or eject_with_operation" +-msgstr "" ++msgstr "uređaj nema implementirano izbacivanje ili izbacivanje_s_radnjom" + + #: gio/gwin32inputstream.c:185 + #, c-format + msgid "Error reading from handle: %s" +-msgstr "" ++msgstr "Greška čitanja iz rukovanja: %s" + + #: gio/gwin32inputstream.c:232 gio/gwin32outputstream.c:219 + #, c-format + msgid "Error closing handle: %s" +-msgstr "" ++msgstr "Greška zatvaranja rukovanja: %s" + + #: gio/gwin32outputstream.c:172 + #, c-format + msgid "Error writing to handle: %s" +-msgstr "" ++msgstr "Greška zapisivanja u rukovanje: %s" + + #: gio/gzlibcompressor.c:394 gio/gzlibdecompressor.c:347 + msgid "Not enough memory" +@@ -4076,192 +4329,178 @@ msgstr "Neispravno sažeti podaci" + + #: gio/tests/gdbus-daemon.c:18 + msgid "Address to listen on" +-msgstr "" ++msgstr "Adresa za osluškivanje" + + #: gio/tests/gdbus-daemon.c:19 + msgid "Ignored, for compat with GTestDbus" +-msgstr "" ++msgstr "Zanemareno, zbog kompatibilnosti sa GTestDbus" + + #: gio/tests/gdbus-daemon.c:20 + msgid "Print address" +-msgstr "" ++msgstr "Prikaži adresu" + + #: gio/tests/gdbus-daemon.c:21 + msgid "Print address in shell mode" +-msgstr "" ++msgstr "Prikaži adresu u načnu rada ljuske" + + #: gio/tests/gdbus-daemon.c:28 + msgid "Run a dbus service" +-msgstr "" ++msgstr "Pokreni dbus uslugu" + + #: gio/tests/gdbus-daemon.c:42 + msgid "Wrong args\n" +-msgstr "" ++msgstr "Pogrešni argumenti\n" + +-#: glib/gbookmarkfile.c:768 ++#: glib/gbookmarkfile.c:777 + #, c-format + msgid "Unexpected attribute “%s” for element “%s”" +-msgstr "" ++msgstr "Neočekivano svojstvo “%s” za element “%s”" + +-#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +-#: glib/gbookmarkfile.c:982 ++#: glib/gbookmarkfile.c:788 glib/gbookmarkfile.c:868 glib/gbookmarkfile.c:878 ++#: glib/gbookmarkfile.c:991 + #, c-format + msgid "Attribute “%s” of element “%s” not found" +-msgstr "" ++msgstr "Svojstvo “%s” od elementa “%s” nije pronađeno" + +-#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +-#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 ++#: glib/gbookmarkfile.c:1200 glib/gbookmarkfile.c:1265 ++#: glib/gbookmarkfile.c:1329 glib/gbookmarkfile.c:1339 + #, c-format + msgid "Unexpected tag “%s”, tag “%s” expected" +-msgstr "" ++msgstr "Neočekivana oznaka “%s”, očekivana je “%s” oznaka" + +-#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +-#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 ++#: glib/gbookmarkfile.c:1225 glib/gbookmarkfile.c:1239 ++#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1353 + #, c-format + msgid "Unexpected tag “%s” inside “%s”" +-msgstr "" ++msgstr "Neočekivana oznaka “%s” unutar “%s”" + +-#: glib/gbookmarkfile.c:1624 ++#: glib/gbookmarkfile.c:1633 + #, c-format + msgid "Invalid date/time ‘%s’ in bookmark file" +-msgstr "" ++msgstr "Nevaljani datum/vrijeme ‘%s’ u datoteci zabilješke" + +-#: glib/gbookmarkfile.c:1827 ++#: glib/gbookmarkfile.c:1836 + msgid "No valid bookmark file found in data dirs" +-msgstr "" ++msgstr "Nema pronađene valjane datoteke zabilješke u direktoriju podataka" + +-#: glib/gbookmarkfile.c:2028 ++#: glib/gbookmarkfile.c:2037 + #, c-format + msgid "A bookmark for URI “%s” already exists" +-msgstr "" +- +-#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +-#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +-#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +-#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +-#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +-#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +-#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +-#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +-#: glib/gbookmarkfile.c:3998 ++msgstr "Zabilješka za URI “%s” već postoji" ++ ++#: glib/gbookmarkfile.c:2086 glib/gbookmarkfile.c:2244 ++#: glib/gbookmarkfile.c:2329 glib/gbookmarkfile.c:2409 ++#: glib/gbookmarkfile.c:2494 glib/gbookmarkfile.c:2628 ++#: glib/gbookmarkfile.c:2761 glib/gbookmarkfile.c:2896 ++#: glib/gbookmarkfile.c:2938 glib/gbookmarkfile.c:3035 ++#: glib/gbookmarkfile.c:3156 glib/gbookmarkfile.c:3350 ++#: glib/gbookmarkfile.c:3491 glib/gbookmarkfile.c:3710 ++#: glib/gbookmarkfile.c:3799 glib/gbookmarkfile.c:3888 ++#: glib/gbookmarkfile.c:4007 + #, c-format + msgid "No bookmark found for URI “%s”" +-msgstr "" ++msgstr "Nema pronađene zabilješke za URI “%s”" + +-#: glib/gbookmarkfile.c:2409 ++#: glib/gbookmarkfile.c:2418 + #, c-format + msgid "No MIME type defined in the bookmark for URI “%s”" +-msgstr "" ++msgstr "Nema MIME vrste određene u zabilješki za URI “%s”" + +-#: glib/gbookmarkfile.c:2494 ++#: glib/gbookmarkfile.c:2503 + #, c-format + msgid "No private flag has been defined in bookmark for URI “%s”" +-msgstr "" ++msgstr "Nema određene privatne oznake u zabilješki za URI “%s”" + +-#: glib/gbookmarkfile.c:3035 ++#: glib/gbookmarkfile.c:3044 + #, c-format + msgid "No groups set in bookmark for URI “%s”" +-msgstr "" ++msgstr "Nema postavljenih grupa u zabilješki za URI “%s”" + +-#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 ++#: glib/gbookmarkfile.c:3512 glib/gbookmarkfile.c:3720 + #, c-format + msgid "No application with name “%s” registered a bookmark for “%s”" +-msgstr "" ++msgstr "Nema aplikacije naziva “%s” registrirane zabilješke za “%s”" + +-#: glib/gbookmarkfile.c:3734 ++#: glib/gbookmarkfile.c:3743 + #, c-format + msgid "Failed to expand exec line “%s” with URI “%s”" +-msgstr "" ++msgstr "Neuspjelo proširivanje redka izvršavanja “%s” sa URI-jem “%s”" + +-#: glib/gconvert.c:467 +-#, fuzzy +-#| msgid "Invalid sequence in conversion input" ++#: glib/gconvert.c:468 + msgid "Unrepresentable character in conversion input" +-msgstr "Neispravna sekvenca u pretvaranju ulaza" ++msgstr "Nereprezentativni znak u ulazu pretvorbe" + +-#: glib/gconvert.c:494 glib/gutf8.c:871 glib/gutf8.c:1083 glib/gutf8.c:1220 +-#: glib/gutf8.c:1324 ++#: glib/gconvert.c:495 glib/gutf8.c:871 glib/gutf8.c:1084 glib/gutf8.c:1221 ++#: glib/gutf8.c:1325 + msgid "Partial character sequence at end of input" +-msgstr "Djelomična znakovna sekvenca pri kraju izlaza" ++msgstr "Nedovršeni niz znakova na kraju ulaza" + +-#: glib/gconvert.c:763 +-#, fuzzy, c-format +-#| msgid "Cannot convert fallback '%s' to codeset '%s'" ++#: glib/gconvert.c:764 ++#, c-format + msgid "Cannot convert fallback “%s” to codeset “%s”" +-msgstr "Ne mogu prevesti '%s' u znakovni skup '%s'" ++msgstr "Nemoguća pretvorba zamjenskog \"%s\" u skup kôda \"%s\"" + +-#: glib/gconvert.c:935 +-#, fuzzy +-#| msgid "Invalid byte sequence in conversion input" ++#: glib/gconvert.c:936 + msgid "Embedded NUL byte in conversion input" +-msgstr "Neispravna sekvenca bajtova u izlazu konverzije" ++msgstr "Ugrađeni NULA bajt u ulazu pretvorbe" + +-#: glib/gconvert.c:956 +-#, fuzzy +-#| msgid "Invalid byte sequence in conversion input" ++#: glib/gconvert.c:957 + msgid "Embedded NUL byte in conversion output" +-msgstr "Neispravna sekvenca bajtova u izlazu konverzije" ++msgstr "Ugrađeni NULA bajt u izlazu pretvorbe" + +-#: glib/gconvert.c:1641 +-#, fuzzy, c-format +-#| msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" ++#: glib/gconvert.c:1688 ++#, c-format + msgid "The URI “%s” is not an absolute URI using the “file” scheme" +-msgstr "'%s' nije apsolutni URI sa \"datoteka\" shemom" ++msgstr "URI “%s” nije apsolutan URI pri korištenju “datoteka” sheme" + +-#: glib/gconvert.c:1651 +-#, fuzzy, c-format +-#| msgid "The local file URI '%s' may not include a '#'" ++#: glib/gconvert.c:1698 ++#, c-format + msgid "The local file URI “%s” may not include a “#”" +-msgstr "URI lokalne datoteke '%s' ne smije uključivati '#'" ++msgstr "URI “%s” lokalne datoteke možda ne uključuje “#”" + +-#: glib/gconvert.c:1668 +-#, fuzzy, c-format +-#| msgid "The URI '%s' is invalid" ++#: glib/gconvert.c:1715 ++#, c-format + msgid "The URI “%s” is invalid" +-msgstr "URI '%s' nije ispravan" ++msgstr "URI “%s” je nevaljan" + +-#: glib/gconvert.c:1680 +-#, fuzzy, c-format +-#| msgid "The hostname of the URI '%s' is invalid" ++#: glib/gconvert.c:1727 ++#, c-format + msgid "The hostname of the URI “%s” is invalid" +-msgstr "Ime računala URI-ja '%s' je neispravno" ++msgstr "Naziv računala URI-ja “%s” je nevaljan" + +-#: glib/gconvert.c:1696 +-#, fuzzy, c-format +-#| msgid "The URI '%s' contains invalidly escaped characters" ++#: glib/gconvert.c:1743 ++#, c-format + msgid "The URI “%s” contains invalidly escaped characters" +-msgstr "URI '%s' sadrži neispravne escape znakove" ++msgstr "URI “%s” sadrži nevaljane escape znakove" + +-#: glib/gconvert.c:1768 +-#, fuzzy, c-format +-#| msgid "The pathname '%s' is not an absolute path" ++#: glib/gconvert.c:1815 ++#, c-format + msgid "The pathname “%s” is not an absolute path" +-msgstr "Putanja '%s' nije apsolutna putanja" ++msgstr "Naziv putanje “%s” nije apsolutna putanja" + + #. Translators: this is the preferred format for expressing the date and the time +-#: glib/gdatetime.c:220 ++#: glib/gdatetime.c:226 + msgctxt "GDateTime" + msgid "%a %b %e %H:%M:%S %Y" + msgstr "%a %d %b %Y %T" + + #. Translators: this is the preferred format for expressing the date +-#: glib/gdatetime.c:223 ++#: glib/gdatetime.c:229 + msgctxt "GDateTime" + msgid "%m/%d/%y" +-msgstr "%d.%m.%Y" ++msgstr "%d.%m.%Y." + + #. Translators: this is the preferred format for expressing the time +-#: glib/gdatetime.c:226 ++#: glib/gdatetime.c:232 + msgctxt "GDateTime" + msgid "%H:%M:%S" +-msgstr "%T" ++msgstr "%H:%M:%S" + + #. Translators: this is the preferred format for expressing 12 hour time +-#: glib/gdatetime.c:229 +-#, fuzzy ++#: glib/gdatetime.c:235 + msgctxt "GDateTime" + msgid "%I:%M:%S %p" +-msgstr "%I:%M:%S %p" ++msgstr "%H:%M:%S" + + #. Translators: Some languages (Baltic, Slavic, Greek, and some more) + #. * need different grammatical forms of month names depending on whether +@@ -4279,62 +4518,62 @@ msgstr "%I:%M:%S %p" + #. * non-European) there is no difference between the standalone and + #. * complete date form. + #. +-#: glib/gdatetime.c:268 ++#: glib/gdatetime.c:274 + msgctxt "full month name" + msgid "January" + msgstr "Siječanj" + +-#: glib/gdatetime.c:270 ++#: glib/gdatetime.c:276 + msgctxt "full month name" + msgid "February" + msgstr "Veljača" + +-#: glib/gdatetime.c:272 ++#: glib/gdatetime.c:278 + msgctxt "full month name" + msgid "March" + msgstr "Ožujak" + +-#: glib/gdatetime.c:274 ++#: glib/gdatetime.c:280 + msgctxt "full month name" + msgid "April" + msgstr "Travanj" + +-#: glib/gdatetime.c:276 ++#: glib/gdatetime.c:282 + msgctxt "full month name" + msgid "May" + msgstr "Svibanj" + +-#: glib/gdatetime.c:278 ++#: glib/gdatetime.c:284 + msgctxt "full month name" + msgid "June" + msgstr "Lipanj" + +-#: glib/gdatetime.c:280 ++#: glib/gdatetime.c:286 + msgctxt "full month name" + msgid "July" + msgstr "Srpanj" + +-#: glib/gdatetime.c:282 ++#: glib/gdatetime.c:288 + msgctxt "full month name" + msgid "August" + msgstr "Kolovoz" + +-#: glib/gdatetime.c:284 ++#: glib/gdatetime.c:290 + msgctxt "full month name" + msgid "September" + msgstr "Rujan" + +-#: glib/gdatetime.c:286 ++#: glib/gdatetime.c:292 + msgctxt "full month name" + msgid "October" + msgstr "Listopad" + +-#: glib/gdatetime.c:288 ++#: glib/gdatetime.c:294 + msgctxt "full month name" + msgid "November" + msgstr "Studeni" + +-#: glib/gdatetime.c:290 ++#: glib/gdatetime.c:296 + msgctxt "full month name" + msgid "December" + msgstr "Prosinac" +@@ -4356,132 +4595,132 @@ msgstr "Prosinac" + #. * other platform. Here are abbreviated month names in a form + #. * appropriate when they are used standalone. + #. +-#: glib/gdatetime.c:322 ++#: glib/gdatetime.c:328 + msgctxt "abbreviated month name" + msgid "Jan" + msgstr "Sij" + +-#: glib/gdatetime.c:324 ++#: glib/gdatetime.c:330 + msgctxt "abbreviated month name" + msgid "Feb" + msgstr "Vel" + +-#: glib/gdatetime.c:326 ++#: glib/gdatetime.c:332 + msgctxt "abbreviated month name" + msgid "Mar" + msgstr "Ožu" + +-#: glib/gdatetime.c:328 ++#: glib/gdatetime.c:334 + msgctxt "abbreviated month name" + msgid "Apr" + msgstr "Tra" + +-#: glib/gdatetime.c:330 ++#: glib/gdatetime.c:336 + msgctxt "abbreviated month name" + msgid "May" + msgstr "Svi" + +-#: glib/gdatetime.c:332 ++#: glib/gdatetime.c:338 + msgctxt "abbreviated month name" + msgid "Jun" + msgstr "Lip" + +-#: glib/gdatetime.c:334 ++#: glib/gdatetime.c:340 + msgctxt "abbreviated month name" + msgid "Jul" + msgstr "Srp" + +-#: glib/gdatetime.c:336 ++#: glib/gdatetime.c:342 + msgctxt "abbreviated month name" + msgid "Aug" + msgstr "Kol" + +-#: glib/gdatetime.c:338 ++#: glib/gdatetime.c:344 + msgctxt "abbreviated month name" + msgid "Sep" + msgstr "Ruj" + +-#: glib/gdatetime.c:340 ++#: glib/gdatetime.c:346 + msgctxt "abbreviated month name" + msgid "Oct" + msgstr "Lis" + +-#: glib/gdatetime.c:342 ++#: glib/gdatetime.c:348 + msgctxt "abbreviated month name" + msgid "Nov" + msgstr "Stu" + +-#: glib/gdatetime.c:344 ++#: glib/gdatetime.c:350 + msgctxt "abbreviated month name" + msgid "Dec" + msgstr "Pro" + +-#: glib/gdatetime.c:359 ++#: glib/gdatetime.c:365 + msgctxt "full weekday name" + msgid "Monday" + msgstr "Ponedjeljak" + +-#: glib/gdatetime.c:361 ++#: glib/gdatetime.c:367 + msgctxt "full weekday name" + msgid "Tuesday" + msgstr "Utorak" + +-#: glib/gdatetime.c:363 ++#: glib/gdatetime.c:369 + msgctxt "full weekday name" + msgid "Wednesday" + msgstr "Srijeda" + +-#: glib/gdatetime.c:365 ++#: glib/gdatetime.c:371 + msgctxt "full weekday name" + msgid "Thursday" + msgstr "Četvrtak" + +-#: glib/gdatetime.c:367 ++#: glib/gdatetime.c:373 + msgctxt "full weekday name" + msgid "Friday" + msgstr "Petak" + +-#: glib/gdatetime.c:369 ++#: glib/gdatetime.c:375 + msgctxt "full weekday name" + msgid "Saturday" + msgstr "Subota" + +-#: glib/gdatetime.c:371 ++#: glib/gdatetime.c:377 + msgctxt "full weekday name" + msgid "Sunday" + msgstr "Nedjelja" + +-#: glib/gdatetime.c:386 ++#: glib/gdatetime.c:392 + msgctxt "abbreviated weekday name" + msgid "Mon" + msgstr "Pon" + +-#: glib/gdatetime.c:388 ++#: glib/gdatetime.c:394 + msgctxt "abbreviated weekday name" + msgid "Tue" + msgstr "Uto" + +-#: glib/gdatetime.c:390 ++#: glib/gdatetime.c:396 + msgctxt "abbreviated weekday name" + msgid "Wed" + msgstr "Sri" + +-#: glib/gdatetime.c:392 ++#: glib/gdatetime.c:398 + msgctxt "abbreviated weekday name" + msgid "Thu" + msgstr "Čet" + +-#: glib/gdatetime.c:394 ++#: glib/gdatetime.c:400 + msgctxt "abbreviated weekday name" + msgid "Fri" + msgstr "Pet" + +-#: glib/gdatetime.c:396 ++#: glib/gdatetime.c:402 + msgctxt "abbreviated weekday name" + msgid "Sat" + msgstr "Sub" + +-#: glib/gdatetime.c:398 ++#: glib/gdatetime.c:404 + msgctxt "abbreviated weekday name" + msgid "Sun" + msgstr "Ned" +@@ -4503,62 +4742,62 @@ msgstr "Ned" + #. * (western European, non-European) there is no difference between the + #. * standalone and complete date form. + #. +-#: glib/gdatetime.c:462 ++#: glib/gdatetime.c:468 + msgctxt "full month name with day" + msgid "January" + msgstr "siječnja" + +-#: glib/gdatetime.c:464 ++#: glib/gdatetime.c:470 + msgctxt "full month name with day" + msgid "February" + msgstr "veljače" + +-#: glib/gdatetime.c:466 ++#: glib/gdatetime.c:472 + msgctxt "full month name with day" + msgid "March" + msgstr "ožujka" + +-#: glib/gdatetime.c:468 ++#: glib/gdatetime.c:474 + msgctxt "full month name with day" + msgid "April" + msgstr "travnja" + +-#: glib/gdatetime.c:470 ++#: glib/gdatetime.c:476 + msgctxt "full month name with day" + msgid "May" + msgstr "svibnja" + +-#: glib/gdatetime.c:472 ++#: glib/gdatetime.c:478 + msgctxt "full month name with day" + msgid "June" + msgstr "lipnja" + +-#: glib/gdatetime.c:474 ++#: glib/gdatetime.c:480 + msgctxt "full month name with day" + msgid "July" + msgstr "srpnja" + +-#: glib/gdatetime.c:476 ++#: glib/gdatetime.c:482 + msgctxt "full month name with day" + msgid "August" + msgstr "kolovoza" + +-#: glib/gdatetime.c:478 ++#: glib/gdatetime.c:484 + msgctxt "full month name with day" + msgid "September" + msgstr "rujna" + +-#: glib/gdatetime.c:480 ++#: glib/gdatetime.c:486 + msgctxt "full month name with day" + msgid "October" + msgstr "listopada" + +-#: glib/gdatetime.c:482 ++#: glib/gdatetime.c:488 + msgctxt "full month name with day" + msgid "November" + msgstr "studenoga" + +-#: glib/gdatetime.c:484 ++#: glib/gdatetime.c:490 + msgctxt "full month name with day" + msgid "December" + msgstr "prosinca" +@@ -4580,543 +4819,463 @@ msgstr "prosinca" + #. * month names almost ready to copy and paste here. In other systems + #. * due to a bug the result is incorrect in some languages. + #. +-#: glib/gdatetime.c:549 ++#: glib/gdatetime.c:555 + msgctxt "abbreviated month name with day" + msgid "Jan" + msgstr "sij" + +-#: glib/gdatetime.c:551 ++#: glib/gdatetime.c:557 + msgctxt "abbreviated month name with day" + msgid "Feb" + msgstr "vel" + +-#: glib/gdatetime.c:553 ++#: glib/gdatetime.c:559 + msgctxt "abbreviated month name with day" + msgid "Mar" + msgstr "ožu" + +-#: glib/gdatetime.c:555 ++#: glib/gdatetime.c:561 + msgctxt "abbreviated month name with day" + msgid "Apr" + msgstr "tra" + +-#: glib/gdatetime.c:557 ++#: glib/gdatetime.c:563 + msgctxt "abbreviated month name with day" + msgid "May" + msgstr "svi" + +-#: glib/gdatetime.c:559 ++#: glib/gdatetime.c:565 + msgctxt "abbreviated month name with day" + msgid "Jun" + msgstr "lip" + +-#: glib/gdatetime.c:561 ++#: glib/gdatetime.c:567 + msgctxt "abbreviated month name with day" + msgid "Jul" + msgstr "srp" + +-#: glib/gdatetime.c:563 ++#: glib/gdatetime.c:569 + msgctxt "abbreviated month name with day" + msgid "Aug" + msgstr "kol" + +-#: glib/gdatetime.c:565 ++#: glib/gdatetime.c:571 + msgctxt "abbreviated month name with day" + msgid "Sep" + msgstr "ruj" + +-#: glib/gdatetime.c:567 ++#: glib/gdatetime.c:573 + msgctxt "abbreviated month name with day" + msgid "Oct" + msgstr "lis" + +-#: glib/gdatetime.c:569 ++#: glib/gdatetime.c:575 + msgctxt "abbreviated month name with day" + msgid "Nov" + msgstr "stu" + +-#: glib/gdatetime.c:571 ++#: glib/gdatetime.c:577 + msgctxt "abbreviated month name with day" + msgid "Dec" + msgstr "pro" + + #. Translators: 'before midday' indicator +-#: glib/gdatetime.c:588 ++#: glib/gdatetime.c:594 + msgctxt "GDateTime" + msgid "AM" + msgstr "AM" + + #. Translators: 'after midday' indicator +-#: glib/gdatetime.c:591 ++#: glib/gdatetime.c:597 + msgctxt "GDateTime" + msgid "PM" + msgstr "PM" + +-#: glib/gdir.c:154 ++#: glib/gdir.c:156 + #, c-format + msgid "Error opening directory “%s”: %s" + msgstr "Greška otvaranja direktorija “%s”: %s" + +-#: glib/gfileutils.c:737 glib/gfileutils.c:829 +-#, fuzzy, c-format +-#| msgid "Could not allocate %lu bytes to read file \"%s\"" ++#: glib/gfileutils.c:738 glib/gfileutils.c:830 ++#, c-format + msgid "Could not allocate %lu byte to read file “%s”" + msgid_plural "Could not allocate %lu bytes to read file “%s”" +-msgstr[0] "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\"" +-msgstr[1] "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\"" +-msgstr[2] "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\"" ++msgstr[0] "Nemoguće dodjeljivanje %lu bajta u datoteku čitanja “%s”" ++msgstr[1] "Nemoguće dodjeljivanje %lu bajta u datoteku čitanja “%s”" ++msgstr[2] "Nemoguće dodjeljivanje %lu bajta u datoteku čitanja “%s”" + +-#: glib/gfileutils.c:754 ++#: glib/gfileutils.c:755 + #, c-format + msgid "Error reading file “%s”: %s" + msgstr "Greška čitanja datoteke “%s”: %s" + +-#: glib/gfileutils.c:790 ++#: glib/gfileutils.c:791 + #, c-format + msgid "File “%s” is too large" +-msgstr "" ++msgstr "Datoteka “%s” je prevelika" + +-#: glib/gfileutils.c:854 +-#, fuzzy, c-format +-#| msgid "Failed to read from file '%s': %s" ++#: glib/gfileutils.c:855 ++#, c-format + msgid "Failed to read from file “%s”: %s" +-msgstr "Greška pri čitanju iz datoteke '%s': %s" ++msgstr "Neuspjelo čitanje iz datoteke “%s”: %s" + +-#: glib/gfileutils.c:902 glib/gfileutils.c:974 glib/gfileutils.c:1466 +-#, fuzzy, c-format +-#| msgid "Failed to open file '%s': %s" ++#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1469 ++#, c-format + msgid "Failed to open file “%s”: %s" +-msgstr "Greška pri otvaranju datoteke '%s': %s" ++msgstr "Nemoguće otvaranje datoteke “%s“: %s" + +-#: glib/gfileutils.c:914 +-#, fuzzy, c-format +-#| msgid "Failed to get attributes of file '%s': fstat() failed: %s" ++#: glib/gfileutils.c:918 ++#, c-format + msgid "Failed to get attributes of file “%s”: fstat() failed: %s" +-msgstr "Greška pri dohvatu atributa datoteke '%s': fstat() nije uspio: %s" ++msgstr "Neuspjelo dobivanje svojstva datoteke “%s”: fstat() neuspio: %s" + +-#: glib/gfileutils.c:944 +-#, fuzzy, c-format +-#| msgid "Failed to open file '%s': fdopen() failed: %s" ++#: glib/gfileutils.c:949 ++#, c-format + msgid "Failed to open file “%s”: fdopen() failed: %s" +-msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s" ++msgstr "Neuspjelo otvaranje datoteke “%s”: fdopen() neuspio: %s" + +-#: glib/gfileutils.c:1044 +-#, fuzzy, c-format +-#| msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" ++#: glib/gfileutils.c:1050 ++#, c-format + msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" +-msgstr "" +-"Greška pri preimenovanju datoteke '%s' u '%s': g_rename() nije uspio: %s" ++msgstr "Neuspjelo preimenovanje datoteke “%s” u “%s”: g_rename() neuspio: %s" + +-#: glib/gfileutils.c:1169 +-#, fuzzy, c-format +-#| msgid "Failed to write file '%s': fwrite() failed: %s" ++#: glib/gfileutils.c:1176 ++#, c-format + msgid "Failed to write file “%s”: write() failed: %s" +-msgstr "Greška pri pisanje u datoteku '%s': fwrite() nije uspio: %s" ++msgstr "Neuspjelo zapisivanje datoteke “%s”: write() neuspio: %s" + +-#: glib/gfileutils.c:1189 +-#, fuzzy, c-format +-#| msgid "Failed to write file '%s': fwrite() failed: %s" ++#: glib/gfileutils.c:1197 ++#, c-format + msgid "Failed to write file “%s”: fsync() failed: %s" +-msgstr "Greška pri pisanje u datoteku '%s': fwrite() nije uspio: %s" ++msgstr "Neuspjelo zapisivanje datoteke “%s”: fsync() neuspio: %s" + +-#: glib/gfileutils.c:1357 glib/gfileutils.c:1769 +-#, fuzzy, c-format +-#| msgid "Failed to create file '%s': %s" ++#: glib/gfileutils.c:1358 glib/gfileutils.c:1773 ++#, c-format + msgid "Failed to create file “%s”: %s" +-msgstr "Greška pri stvaranju datoteke '%s': %s" ++msgstr "Neuspjelo stvaranje datoteke \"%s\": %s" + +-#: glib/gfileutils.c:1401 +-#, fuzzy, c-format +-#| msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" ++#: glib/gfileutils.c:1403 ++#, c-format + msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" +-msgstr "" +-"Postojeća datoteka '%s' ne može biti obrisana: g_unlink() nije uspio: %s" ++msgstr "Postojeća datoteka “%s” se ne može ukloniti: g_unlink() neuspio: %s" + +-#: glib/gfileutils.c:1735 +-#, fuzzy, c-format +-#| msgid "Template '%s' invalid, should not contain a '%s'" ++#: glib/gfileutils.c:1738 ++#, c-format + msgid "Template “%s” invalid, should not contain a “%s”" +-msgstr "Predložak '%s' nije ispravan, ne smije sadržavati'%s'" ++msgstr "Predložak “%s” je nevaljan, ne smije sadržavati “%s”" + +-#: glib/gfileutils.c:1748 ++#: glib/gfileutils.c:1751 + #, c-format + msgid "Template “%s” doesn’t contain XXXXXX" +-msgstr "" ++msgstr "Predložak “%s” ne sadrži XXXXXX" + +-#: glib/gfileutils.c:2306 glib/gfileutils.c:2334 +-#, fuzzy, c-format +-#| msgid "Failed to read the symbolic link '%s': %s" ++#: glib/gfileutils.c:2311 glib/gfileutils.c:2340 ++#, c-format + msgid "Failed to read the symbolic link “%s”: %s" +-msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" ++msgstr "Neuspjelo čitanje simboličke poveznice “%s”: %s" + +-#: glib/giochannel.c:1396 +-#, fuzzy, c-format +-#| msgid "Could not open converter from '%s' to '%s': %s" ++#: glib/giochannel.c:1405 ++#, c-format + msgid "Could not open converter from “%s” to “%s”: %s" +-msgstr "Ne mogu otvoriti pretvornik iz '%s' u '%s': %s" ++msgstr "Neuspjelo otvaranje pretvornika iz “%s” u “%s”: %s" + +-#: glib/giochannel.c:1749 +-#, fuzzy +-#| msgid "Can't do a raw read in g_io_channel_read_line_string" ++#: glib/giochannel.c:1758 + msgid "Can’t do a raw read in g_io_channel_read_line_string" +-msgstr "Ne mogu izvršiti raw čitanje u g_io_channel_read_line_string" ++msgstr "Neuspjelo neobrađeno čitanje u g_io_channel_read_line_string" + +-#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141 ++#: glib/giochannel.c:1805 glib/giochannel.c:2063 glib/giochannel.c:2150 + msgid "Leftover unconverted data in read buffer" +-msgstr "Postoji ostatak nepretvorenih podataka u međuspremniku za čitanje" ++msgstr "Postoji ostatak nepretvorenih podataka u međuspremniku čitanja" + +-#: glib/giochannel.c:1877 glib/giochannel.c:1954 ++#: glib/giochannel.c:1886 glib/giochannel.c:1963 + msgid "Channel terminates in a partial character" +-msgstr "Kanal završava sa djelomičnim znakom" ++msgstr "Kanal završava sa nedovršenim znakom" + +-#: glib/giochannel.c:1940 +-#, fuzzy +-#| msgid "Can't do a raw read in g_io_channel_read_to_end" ++#: glib/giochannel.c:1949 + msgid "Can’t do a raw read in g_io_channel_read_to_end" +-msgstr "Ne mogu izvršiti raw čitanje u g_io_channel_read_to_end" ++msgstr "Neuspjelo neobrađeno čitanje u g_io_channel_read_to_end" + +-#: glib/gkeyfile.c:789 ++#: glib/gkeyfile.c:791 + msgid "Valid key file could not be found in search dirs" +-msgstr "" ++msgstr "Valjana datoteka ključa se ne može pronaći u direktorijima pretrage" + +-#: glib/gkeyfile.c:826 ++#: glib/gkeyfile.c:828 + msgid "Not a regular file" +-msgstr "Nije regularna datoteka" ++msgstr "Nije uobičajena datoteka" + +-#: glib/gkeyfile.c:1275 +-#, fuzzy, c-format +-#| msgid "" +-#| "Key file contains line '%s' which is not a key-value pair, group, or " +-#| "comment" ++#: glib/gkeyfile.c:1283 ++#, c-format + msgid "" + "Key file contains line “%s” which is not a key-value pair, group, or comment" + msgstr "" +-"Datoteka s ključem sadrži redak '%s' koji nije oblika ključ-vrijednost, " +-"grupa ili komentar" ++"Datoteka ključa sadrži redak “%s” koji nije par ključ-vrijednost, grupa ili " ++"komentar" + +-#: glib/gkeyfile.c:1332 ++#: glib/gkeyfile.c:1340 + #, c-format + msgid "Invalid group name: %s" +-msgstr "" ++msgstr "Nevaljani naziv grupe: %s" + +-#: glib/gkeyfile.c:1354 ++#: glib/gkeyfile.c:1362 + msgid "Key file does not start with a group" +-msgstr "Datoteka s ključem ne započinje s grupom" ++msgstr "Datoteka ključa ne započinje s grupom" + +-#: glib/gkeyfile.c:1380 ++#: glib/gkeyfile.c:1388 + #, c-format + msgid "Invalid key name: %s" +-msgstr "" ++msgstr "Nevaljani naziv ključa: %s" + +-#: glib/gkeyfile.c:1407 +-#, fuzzy, c-format +-#| msgid "Key file contains unsupported encoding '%s'" ++#: glib/gkeyfile.c:1415 ++#, c-format + msgid "Key file contains unsupported encoding “%s”" +-msgstr "Datoteka s ključem sadrži nepodržano kodiranje '%s'" ++msgstr "Datoteka ključa sadrži nepodržano kôdiranje “%s”" + +-#: glib/gkeyfile.c:1650 glib/gkeyfile.c:1823 glib/gkeyfile.c:3276 +-#: glib/gkeyfile.c:3340 glib/gkeyfile.c:3470 glib/gkeyfile.c:3602 +-#: glib/gkeyfile.c:3748 glib/gkeyfile.c:3977 glib/gkeyfile.c:4044 +-#, fuzzy, c-format +-#| msgid "Key file does not have group '%s'" ++#: glib/gkeyfile.c:1664 glib/gkeyfile.c:1837 glib/gkeyfile.c:3287 ++#: glib/gkeyfile.c:3351 glib/gkeyfile.c:3481 glib/gkeyfile.c:3613 ++#: glib/gkeyfile.c:3759 glib/gkeyfile.c:3994 glib/gkeyfile.c:4061 ++#, c-format + msgid "Key file does not have group “%s”" +-msgstr "Datoteka s ključem ne sadrži grupu '%s'" ++msgstr "Datoteka ključa nema grupe “%s”" + +-#: glib/gkeyfile.c:1778 +-#, fuzzy, c-format +-#| msgid "Key file does not have key '%s' in group '%s'" ++#: glib/gkeyfile.c:1792 ++#, c-format + msgid "Key file does not have key “%s” in group “%s”" +-msgstr "Datoteka s ključem na sadrži ključ '%s' u grupi '%s'" ++msgstr "Datoteka ključa nema ključ “%s” u grupi “%s”" + +-#: glib/gkeyfile.c:1940 glib/gkeyfile.c:2056 +-#, fuzzy, c-format +-#| msgid "Key file contains key '%s' with value '%s' which is not UTF-8" ++#: glib/gkeyfile.c:1954 glib/gkeyfile.c:2070 ++#, c-format + msgid "Key file contains key “%s” with value “%s” which is not UTF-8" +-msgstr "Datoteka s ključem sadrži ključ '%s' čija vrijednost '%s' nije u UTF-8" ++msgstr "Datoteka ključa sadrži ključ “%s” s vrijednošću “%s” koja nije UTF-8" + +-#: glib/gkeyfile.c:1960 glib/gkeyfile.c:2076 glib/gkeyfile.c:2518 +-#, fuzzy, c-format +-#| msgid "" +-#| "Key file contains line '%s' which is not a key-value pair, group, or " +-#| "comment" ++#: glib/gkeyfile.c:1974 glib/gkeyfile.c:2090 glib/gkeyfile.c:2529 ++#, c-format + msgid "" + "Key file contains key “%s” which has a value that cannot be interpreted." + msgstr "" +-"Datoteka s ključem sadrži redak '%s' koji nije oblika ključ-vrijednost, " +-"grupa ili komentar" ++"Datoteka ključa sadrži ključ “%s” s vrijednošću koja se ne može " ++"interperetirati." + +-#: glib/gkeyfile.c:2736 glib/gkeyfile.c:3105 ++#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 + #, c-format + msgid "" + "Key file contains key “%s” in group “%s” which has a value that cannot be " + "interpreted." + msgstr "" ++"Datoteka ključa sadrži ključ “%s” u grupi “%s” s vrijednošću koja se ne može " ++"interperetirati." + +-#: glib/gkeyfile.c:2814 glib/gkeyfile.c:2891 ++#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 + #, c-format + msgid "Key “%s” in group “%s” has value “%s” where %s was expected" +-msgstr "" ++msgstr "Ključ “%s” u grupi “%s” ima vrijednost “%s” gdje je %s očekivan" + +-#: glib/gkeyfile.c:4284 ++#: glib/gkeyfile.c:4304 + msgid "Key file contains escape character at end of line" +-msgstr "Datoteka s ključem na kraju retka ima izbjegnute znakove" ++msgstr "Datoteka ključa sadrži escape znak na kraju redka" + +-#: glib/gkeyfile.c:4306 +-#, fuzzy, c-format +-#| msgid "Key file contains invalid escape sequence '%s'" ++#: glib/gkeyfile.c:4326 ++#, c-format + msgid "Key file contains invalid escape sequence “%s”" +-msgstr "Datoteka s ključem sadrži neispravno izbjegnuti niz '%s'" ++msgstr "Datoteka ključa sadrži nevaljani escape niz “%s”" + +-#: glib/gkeyfile.c:4450 +-#, fuzzy, c-format +-#| msgid "Value '%s' cannot be interpreted as a number." ++#: glib/gkeyfile.c:4470 ++#, c-format + msgid "Value “%s” cannot be interpreted as a number." +-msgstr "Vrijednost '%s' ne može biti protumačena kao broj." ++msgstr "Vrijednost “%s” se ne može tumačiti kao broj." + +-#: glib/gkeyfile.c:4464 +-#, fuzzy, c-format +-#| msgid "Integer value '%s' out of range" ++#: glib/gkeyfile.c:4484 ++#, c-format + msgid "Integer value “%s” out of range" +-msgstr "Brojčana vrijednost '%s' je izvan opsega" ++msgstr "Cjelobrojna vrijednost \"%s\" je izvan raspona" + +-#: glib/gkeyfile.c:4497 +-#, fuzzy, c-format +-#| msgid "Value '%s' cannot be interpreted as a number." ++#: glib/gkeyfile.c:4517 ++#, c-format + msgid "Value “%s” cannot be interpreted as a float number." +-msgstr "Vrijednost '%s' ne može biti protumačena kao broj." ++msgstr "Vrijednost \"%s\" ne može se tumačiti kao decimalni broj." + +-#: glib/gkeyfile.c:4536 +-#, fuzzy, c-format +-#| msgid "Value '%s' cannot be interpreted as a boolean." ++#: glib/gkeyfile.c:4556 ++#, c-format + msgid "Value “%s” cannot be interpreted as a boolean." +-msgstr "Vrijednost '%s' ne može biti protumačena kao boolean." ++msgstr "Vrijednost \"%s\" ne može se tumačiti kao bool varijable." + + #: glib/gmappedfile.c:129 +-#, fuzzy, c-format +-#| msgid "Failed to get attributes of file '%s': fstat() failed: %s" ++#, c-format + msgid "Failed to get attributes of file “%s%s%s%s”: fstat() failed: %s" +-msgstr "Greška pri dohvatu atributa datoteke '%s': fstat() nije uspio: %s" ++msgstr "Neuspjelo dobivanje svojstava datoteke “%s%s%s%s”: fstat() neuspio: %s" + + #: glib/gmappedfile.c:195 + #, c-format + msgid "Failed to map %s%s%s%s: mmap() failed: %s" +-msgstr "" ++msgstr "Neuspjelo mapiranje %s%s%s%s: mmap() neuspio: %s" + + #: glib/gmappedfile.c:262 +-#, fuzzy, c-format +-#| msgid "Failed to open file '%s': open() failed: %s" ++#, c-format + msgid "Failed to open file “%s”: open() failed: %s" +-msgstr "Greška pri otvaranju datoteke '%s': open() nije uspio: %s" ++msgstr "Neuspjelo otvaranje “%s”: open() neuspio: %s" + + #: glib/gmarkup.c:398 glib/gmarkup.c:440 + #, c-format + msgid "Error on line %d char %d: " +-msgstr "" ++msgstr "Greška u retku %d znak %d: " + + #: glib/gmarkup.c:462 glib/gmarkup.c:545 + #, c-format + msgid "Invalid UTF-8 encoded text in name — not valid “%s”" +-msgstr "" ++msgstr "Nevaljani UTF-8 kôdirani tekst u nazivu — nije valjan “%s”" + + #: glib/gmarkup.c:473 + #, c-format + msgid "“%s” is not a valid name" +-msgstr "" ++msgstr "“%s” nije valjani naziv" + + #: glib/gmarkup.c:489 + #, c-format + msgid "“%s” is not a valid name: “%c”" +-msgstr "" ++msgstr "“%s” nije valjani naziv: “%c”" + + #: glib/gmarkup.c:613 + #, c-format + msgid "Error on line %d: %s" +-msgstr "Greška na retku %d: %s" ++msgstr "Greška u retku %d: %s" + + #: glib/gmarkup.c:690 +-#, fuzzy, c-format +-#| msgid "" +-#| "Failed to parse '%-.*s', which should have been a digit inside a " +-#| "character reference (ê for example) - perhaps the digit is too large" ++#, c-format + msgid "" + "Failed to parse “%-.*s”, which should have been a digit inside a character " + "reference (ê for example) — perhaps the digit is too large" + msgstr "" +-"Nisam uspio izanalizirati '%-.*s', koji je trebao biti broj unutar znakovne " +-"reference (npr. ê) - možda je broj prevelik" ++"Neuspjela obrada “%-.*s”, mora biti broj unutar reference znaka (ê na " ++"primjer) — možda je broj prevelik" + + #: glib/gmarkup.c:702 +-#, fuzzy +-#| msgid "" +-#| "Character reference did not end with a semicolon; most likely you used an " +-#| "ampersand character without intending to start an entity - escape " +-#| "ampersand as &" + msgid "" + "Character reference did not end with a semicolon; most likely you used an " + "ampersand character without intending to start an entity — escape ampersand " + "as &" + msgstr "" +-"Znakovna referenca nije završila sa točka-zarezom; vjerojatno ste koristitli " +-"ampersand znakbez namjere da počnete entitet - escapirajte ampersand kao " +-"&" ++"Referenca znakova nije završila točka-zarezom; najvjerojatnije ste koristili " ++"znak ampersand bez namjere pokretanja entiteta — escape ampersand kao &" + + #: glib/gmarkup.c:728 +-#, fuzzy, c-format +-#| msgid "Character reference '%-.*s' does not encode a permitted character" ++#, c-format + msgid "Character reference “%-.*s” does not encode a permitted character" +-msgstr "Znakovna referenca '%-.*s' ne kodira dozvoljeni znak" ++msgstr "Referenca znakova “%-.*s” ne kôdira dopušteni znak" + + #: glib/gmarkup.c:766 +-#, fuzzy +-#| msgid "" +-#| "Empty entity '&;' seen; valid entities are: & " < > '" + msgid "" + "Empty entity “&;” seen; valid entities are: & " < > '" + msgstr "" +-"Prazan entitet '&;' ; ispravni entiteti su: & " < > '" ++"Prazan entitet “&;” viđen; valjani entiteti su: & " < > '" + + #: glib/gmarkup.c:774 + #, c-format + msgid "Entity name “%-.*s” is not known" +-msgstr "" ++msgstr "Naziv entiteta “%-.*s” nije poznat" + + #: glib/gmarkup.c:779 +-#, fuzzy +-#| msgid "" +-#| "Entity did not end with a semicolon; most likely you used an ampersand " +-#| "character without intending to start an entity - escape ampersand as &" + msgid "" + "Entity did not end with a semicolon; most likely you used an ampersand " + "character without intending to start an entity — escape ampersand as &" + msgstr "" +-"Entitet nije zavšio sa točka-zarezom; vjerojatno ste koristili ampersand " +-"znak bez namjere da započnete entitet - escapirajte ampersand sa &" ++"Entitet nije završio točka-zarezom; najvjerojatnije ste koristili znak " ++"ampersand bez namjere pokretanja entiteta — escape ampersand kao &" + + #: glib/gmarkup.c:1193 + msgid "Document must begin with an element (e.g. )" +-msgstr "Dokument mora početi sa elementom(npr. )" ++msgstr "Dokument mora započinjati elementom (npr. )" + + #: glib/gmarkup.c:1233 +-#, fuzzy, c-format +-#| msgid "" +-#| "'%s' is not a valid character following a '<' character; it may not begin " +-#| "an element name" ++#, c-format + msgid "" + "“%s” is not a valid character following a “<” character; it may not begin an " + "element name" + msgstr "" +-"'%s' nije dozvoljeni znak koji smije slijediti nakon '<' znaka; ne smije " +-"započeti ime elementa" ++"“%s” nije valjan znak nakon “<” znaka; možda ne započinje s nazivom elementa" + + #: glib/gmarkup.c:1276 +-#, fuzzy, c-format +-#| msgid "" +-#| "Odd character '%s', expected a '=' after attribute name '%s' of element " +-#| "'%s'" ++#, c-format + msgid "" + "Odd character “%s”, expected a “>” character to end the empty-element tag " + "“%s”" + msgstr "" +-"Neparan znak '%s', očekuje se '=' poslije imena atributa '%s' elementa '%s'" ++"Neparan znak “%s”, očekivan je “>” znak na kraju empty-element oznake “%s”" + + #: glib/gmarkup.c:1346 + #, c-format + msgid "Too many attributes in element “%s”" +-msgstr "" ++msgstr "Previše svojstava u elementu “%s”" + + #: glib/gmarkup.c:1366 +-#, fuzzy, c-format +-#| msgid "" +-#| "Odd character '%s', expected a '=' after attribute name '%s' of element " +-#| "'%s'" ++#, c-format + msgid "" + "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" + msgstr "" +-"Neparan znak '%s', očekuje se '=' poslije imena atributa '%s' elementa '%s'" ++"Neparan znak “%s”, očekivan je “=” nakon naziva svojstva “%s” elementa “%s”" + + #: glib/gmarkup.c:1408 +-#, fuzzy, c-format +-#| msgid "" +-#| "Odd character '%s', expected a '>' or '/' character to end the start tag " +-#| "of element '%s', or optionally an attribute; perhaps you used an invalid " +-#| "character in an attribute name" ++#, c-format + msgid "" + "Odd character “%s”, expected a “>” or “/” character to end the start tag of " + "element “%s”, or optionally an attribute; perhaps you used an invalid " + "character in an attribute name" + msgstr "" +-"Čudan znak '%s', očekuje se da znak '>' ili '/' završe početak taga elementa " +-"'%s', ili opcionalno atributa; možda ste koristili neispravan znaku imenu " +-"atributa" ++"Neparan znak “%s”, očekivan je “>” ili “/” znak na kraju početka oznake " ++"elementa “%s”, ili neobaveznog svojstva; možda ste koristili nevaljani znak " ++"u nazivu svojstva" + + #: glib/gmarkup.c:1453 +-#, fuzzy, c-format +-#| msgid "" +-#| "Odd character '%s', expected an open quote mark after the equals sign " +-#| "when giving value for attribute '%s' of element '%s'" ++#, c-format + msgid "" + "Odd character “%s”, expected an open quote mark after the equals sign when " + "giving value for attribute “%s” of element “%s”" + msgstr "" +-"Čudan znak '%s', očekuje se otvoreni navodnik nakon znaka jednakostikada se " +-"daje vrijednost atributa '%s' elementa '%s'" ++"Neparni znak \"%s\", očekivan je otvoreni navodnik nakon znaka jednakosti " ++"pri davanju vrijednosti za svojstvo \"%s\" elementa \"%s\"" + + #: glib/gmarkup.c:1587 +-#, fuzzy, c-format +-#| msgid "" +-#| "'%s' is not a valid character following the characters ''" ++#, c-format + msgid "" + "“%s” is not a valid character following the close element name “%s”; the " + "allowed character is “>”" + msgstr "" +-"'%s' nije ispravan znak koji može slijediti nakon imena završnog elementa " +-"'%s'; dozvoljeni znak je '>'" ++"“%s” nije valjan znak nakon najbližeg naziva elementa “%s”; dopušteni znak " ++"je “>”" + + #: glib/gmarkup.c:1637 +-#, fuzzy, c-format +-#| msgid "Element '%s' was closed, no element is currently open" ++#, c-format + msgid "Element “%s” was closed, no element is currently open" +-msgstr "Element '%s' je zatvoren, trenutno nema otvorenog elementa" ++msgstr "Element “%s” je zatvoren, trenutno nema otvorenih elemenata" + + #: glib/gmarkup.c:1646 +-#, fuzzy, c-format +-#| msgid "Element '%s' was closed, but the currently open element is '%s'" ++#, c-format + msgid "Element “%s” was closed, but the currently open element is “%s”" +-msgstr "Element '%s' je zatvoren, ali trenutno otvoreni element je '%s'" ++msgstr "Element “%s” je zatvoren, ali trenutno otvoreni element je “%s”" + + #: glib/gmarkup.c:1799 + msgid "Document was empty or contained only whitespace" +-msgstr "Dokument je bio prazan ili je sadržavao samo znakove prazne znakove" ++msgstr "Dokument je bio prazan ili je sadržavao samo razmake" + + #: glib/gmarkup.c:1813 +-#, fuzzy +-#| msgid "Document ended unexpectedly just after an open angle bracket '<'" + msgid "Document ended unexpectedly just after an open angle bracket “<”" +-msgstr "Dokument je završio neočekivano nakon otvaranja zagrade '<'" ++msgstr "Dokument je neočekivano završio nakon otvorene kutne zagrade “<”" + + #: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +-#, fuzzy, c-format +-#| msgid "" +-#| "Document ended unexpectedly with elements still open - '%s' was the last " +-#| "element opened" ++#, c-format + msgid "" + "Document ended unexpectedly with elements still open — “%s” was the last " + "element opened" + msgstr "" +-"Dokument je završio neočekivano sa još uvijek otvorenim elementima- '%s' je " +-"bio zadnjiotvoreni element" ++"Dokument je neočekivano završio s još otvorenim elementima — “%s” je " ++"posljednji otvoreni element" + + #: glib/gmarkup.c:1829 + #, c-format +@@ -5124,54 +5283,51 @@ msgid "" + "Document ended unexpectedly, expected to see a close angle bracket ending " + "the tag <%s/>" + msgstr "" +-"Dokument je završio neočekivano, očekivalo se da zatvorena šiljata " +-"zagradazavrši tag<%s/>" ++"Dokument je neočekivano završio, očekivana je zatvorena kutna zagrada na " ++"završetku oznake <%s/>" + + #: glib/gmarkup.c:1835 + msgid "Document ended unexpectedly inside an element name" +-msgstr "Dokument je završio neočekivano unutar imena elementa" ++msgstr "Dokument je neočekivano završio unutar naziva elementa" + + #: glib/gmarkup.c:1841 + msgid "Document ended unexpectedly inside an attribute name" +-msgstr "Dokument je završio neočekivano unutar imena atributa" ++msgstr "Dokument je neočekivano završio unutar naziva svojstva" + + #: glib/gmarkup.c:1846 + msgid "Document ended unexpectedly inside an element-opening tag." +-msgstr "Dokument je završio neočekivano unutar oznake otvaranja elementa." ++msgstr "Dokument je neočekivano završio unutar element-opening oznake." + + #: glib/gmarkup.c:1852 + msgid "" + "Document ended unexpectedly after the equals sign following an attribute " + "name; no attribute value" + msgstr "" +-"Dokument je završio neočekivano nakon što je znak jednakosti slijedioime " +-"atributa; nema vrijednosti atributa" ++"Dokument je neočekivano završio nakon što je znak jednakosti iza naziva " ++"svojstva; nema vrijednosti svojstva" + + #: glib/gmarkup.c:1859 + msgid "Document ended unexpectedly while inside an attribute value" +-msgstr "Dokument je završio neočekivano unutar vrijednosti atributa" ++msgstr "Dokument je neočekivano završio unutar vrijednosti svojstva" + + #: glib/gmarkup.c:1876 + #, c-format + msgid "Document ended unexpectedly inside the close tag for element “%s”" +-msgstr "" +-"Dokument je završio neočekivano unutar oznake zatvaranja za element “%s”" ++msgstr "Dokument je neočekivano završio unutar završne oznake za element “%s”" + + #: glib/gmarkup.c:1880 + msgid "" + "Document ended unexpectedly inside the close tag for an unopened element" + msgstr "" +-"Dokument je završio neočekivano unutar oznake zatvaranja za neotvoreni " +-"element" ++"Dokument je neočekivano završio unutar završne oznake za neotvoreni element" + + #: glib/gmarkup.c:1886 + msgid "Document ended unexpectedly inside a comment or processing instruction" +-msgstr "" +-"Dokument je završio neočekivano unutar komentara ili izvršavanja instrukcije" ++msgstr "Dokument je neočekivano završio unutar komentara ili procesne naredbe" + + #: glib/goption.c:873 + msgid "[OPTION…]" +-msgstr "[MOGUĆNOST...]" ++msgstr "[MOGUĆNOST…]" + + #: glib/goption.c:989 + msgid "Help Options:" +@@ -5194,633 +5350,634 @@ msgid "Options:" + msgstr "Mogućnosti:" + + #: glib/goption.c:1125 glib/goption.c:1195 +-#, fuzzy, c-format +-#| msgid "Cannot parse integer value '%s' for %s" ++#, c-format + msgid "Cannot parse integer value “%s” for %s" +-msgstr "Analiza brojčane vrijednosti '%s' za %s nije uspjela" ++msgstr "Nemoguća obrada cjelobrojne vrijednosti “%s” za %s" + + #: glib/goption.c:1135 glib/goption.c:1203 +-#, fuzzy, c-format +-#| msgid "Integer value '%s' for %s out of range" ++#, c-format + msgid "Integer value “%s” for %s out of range" +-msgstr "Brojčana vrijednost '%s' za '%s' izvan opsega" ++msgstr "Cjelobrojna vrijednost “%s” za %s je izvan raspona" + + #: glib/goption.c:1160 +-#, fuzzy, c-format +-#| msgid "Cannot parse integer value '%s' for %s" ++#, c-format + msgid "Cannot parse double value “%s” for %s" +-msgstr "Analiza brojčane vrijednosti '%s' za %s nije uspjela" ++msgstr "Nemoguća obrada dvostruke vrijednosti “%s” za %s" + + #: glib/goption.c:1168 +-#, fuzzy, c-format +-#| msgid "Integer value '%s' for %s out of range" ++#, c-format + msgid "Double value “%s” for %s out of range" +-msgstr "Brojčana vrijednost '%s' za '%s' izvan opsega" ++msgstr "Dvostruka vrijednost “%s” za %s je izvan raspona" + + #: glib/goption.c:1460 glib/goption.c:1539 + #, c-format + msgid "Error parsing option %s" + msgstr "Greška obrade mogućnosti %s" + +-#: glib/goption.c:1570 glib/goption.c:1683 ++#: glib/goption.c:1561 glib/goption.c:1674 + #, c-format + msgid "Missing argument for %s" + msgstr "Nedostaje parametar za %s" + +-#: glib/goption.c:2194 ++#: glib/goption.c:2185 + #, c-format + msgid "Unknown option %s" + msgstr "Nepoznata mogućnost %s" + +-#: glib/gregex.c:257 ++#: glib/gregex.c:255 + msgid "corrupted object" + msgstr "oštećeni objekt" + +-#: glib/gregex.c:259 ++#: glib/gregex.c:257 + msgid "internal error or corrupted object" + msgstr "unutarnja greška ili oštećeni objekt" + +-#: glib/gregex.c:261 ++#: glib/gregex.c:259 + msgid "out of memory" + msgstr "ponestalo memorije" + +-#: glib/gregex.c:266 ++#: glib/gregex.c:264 + msgid "backtracking limit reached" +-msgstr "" ++msgstr "dosegnuto ograničenje vraćanja" + +-#: glib/gregex.c:278 glib/gregex.c:286 ++#: glib/gregex.c:276 glib/gregex.c:284 + msgid "the pattern contains items not supported for partial matching" +-msgstr "" ++msgstr "uzorak sadržava stavke koje nisu podržane za djelomično podudaranje" + +-#: glib/gregex.c:280 ++#: glib/gregex.c:278 + msgid "internal error" +-msgstr "" ++msgstr "unutarnja greška" + +-#: glib/gregex.c:288 ++#: glib/gregex.c:286 + msgid "back references as conditions are not supported for partial matching" +-msgstr "" ++msgstr "povratne reference kao uvjeti nisu podržane za djelomično podudaranje" + +-#: glib/gregex.c:297 ++#: glib/gregex.c:295 + msgid "recursion limit reached" +-msgstr "" ++msgstr "dostignuta je ograničenje rekurzije" + +-#: glib/gregex.c:299 ++#: glib/gregex.c:297 + msgid "invalid combination of newline flags" +-msgstr "" ++msgstr "nevaljana kombinacija oznaka novog redka" + +-#: glib/gregex.c:301 ++#: glib/gregex.c:299 + msgid "bad offset" +-msgstr "" ++msgstr "loš pomak" + +-#: glib/gregex.c:303 ++#: glib/gregex.c:301 + msgid "short utf8" +-msgstr "" ++msgstr "kratak utf8" + +-#: glib/gregex.c:305 ++#: glib/gregex.c:303 + msgid "recursion loop" +-msgstr "" ++msgstr "petlja rekurzije" + +-#: glib/gregex.c:309 ++#: glib/gregex.c:307 + msgid "unknown error" + msgstr "nepoznata greška" + +-#: glib/gregex.c:329 ++#: glib/gregex.c:327 + msgid "\\ at end of pattern" +-msgstr "" ++msgstr "\\ na kraju uzorka" + +-#: glib/gregex.c:332 ++#: glib/gregex.c:330 + msgid "\\c at end of pattern" +-msgstr "" ++msgstr "\\c na kraju uzorka" + +-#: glib/gregex.c:335 ++#: glib/gregex.c:333 + msgid "unrecognized character following \\" +-msgstr "" ++msgstr "neprepoznati znak nakon \\" + +-#: glib/gregex.c:338 ++#: glib/gregex.c:336 + msgid "numbers out of order in {} quantifier" +-msgstr "" ++msgstr "brojevi izvan poredka u {} kvantifikatoru" + +-#: glib/gregex.c:341 ++#: glib/gregex.c:339 + msgid "number too big in {} quantifier" +-msgstr "" ++msgstr "prevelik broj u {} kvantifikatoru" + +-#: glib/gregex.c:344 ++#: glib/gregex.c:342 + msgid "missing terminating ] for character class" +-msgstr "" ++msgstr "nedostaje završetak ] za klasu znakova" + +-#: glib/gregex.c:347 ++#: glib/gregex.c:345 + msgid "invalid escape sequence in character class" +-msgstr "" ++msgstr "nevaljani escape nakon klase znaka" + +-#: glib/gregex.c:350 ++#: glib/gregex.c:348 + msgid "range out of order in character class" +-msgstr "" ++msgstr "raspon izvan poredka u klasi znakova" + +-#: glib/gregex.c:353 ++#: glib/gregex.c:351 + msgid "nothing to repeat" +-msgstr "" ++msgstr "ništa za ponavljanje" + +-#: glib/gregex.c:357 ++#: glib/gregex.c:355 + msgid "unexpected repeat" +-msgstr "" ++msgstr "neočekivano ponavljanje" + +-#: glib/gregex.c:360 ++#: glib/gregex.c:358 + msgid "unrecognized character after (? or (?-" +-msgstr "" ++msgstr "neprepoznati znak nakon (? ili (?-" + +-#: glib/gregex.c:363 ++#: glib/gregex.c:361 + msgid "POSIX named classes are supported only within a class" +-msgstr "" ++msgstr "POSIX nazvane klase podržane su samo unutar klase" + +-#: glib/gregex.c:366 ++#: glib/gregex.c:364 + msgid "missing terminating )" +-msgstr "" ++msgstr "nedostaje završetak )" + +-#: glib/gregex.c:369 ++#: glib/gregex.c:367 + msgid "reference to non-existent subpattern" +-msgstr "" ++msgstr "referenca na nepostojeći poduzorak" + +-#: glib/gregex.c:372 ++#: glib/gregex.c:370 + msgid "missing ) after comment" +-msgstr "" ++msgstr "nedostaje ) nakon komentara" + +-#: glib/gregex.c:375 ++#: glib/gregex.c:373 + msgid "regular expression is too large" +-msgstr "" ++msgstr "uobičajen izraz je prevelik" + +-#: glib/gregex.c:378 ++#: glib/gregex.c:376 + msgid "failed to get memory" +-msgstr "" ++msgstr "neuspjelo dobivanje memorije" + +-#: glib/gregex.c:382 ++#: glib/gregex.c:380 + msgid ") without opening (" +-msgstr "" ++msgstr ") bez otvaranja (" + +-#: glib/gregex.c:386 ++#: glib/gregex.c:384 + msgid "code overflow" +-msgstr "" ++msgstr "prekoračenje kôda" + +-#: glib/gregex.c:390 ++#: glib/gregex.c:388 + msgid "unrecognized character after (?<" +-msgstr "" ++msgstr "neprepoznati znak nakon (?<" + +-#: glib/gregex.c:393 ++#: glib/gregex.c:391 + msgid "lookbehind assertion is not fixed length" +-msgstr "" ++msgstr "lookbehind navod nije nepromjenjive duljine" + +-#: glib/gregex.c:396 ++#: glib/gregex.c:394 + msgid "malformed number or name after (?(" +-msgstr "" ++msgstr "oštećeni broj ili naziv nakon (?(" + +-#: glib/gregex.c:399 ++#: glib/gregex.c:397 + msgid "conditional group contains more than two branches" +-msgstr "" ++msgstr "uvjetovana grupa sadrži više od dva ogranka" + +-#: glib/gregex.c:402 ++#: glib/gregex.c:400 + msgid "assertion expected after (?(" +-msgstr "" ++msgstr "navod se očekuje nakon (?(" + + #. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) + #. * sequences here, '(?-54' would be an example for the second group. + #. +-#: glib/gregex.c:409 ++#: glib/gregex.c:407 + msgid "(?R or (?[+-]digits must be followed by )" +-msgstr "" ++msgstr "(?R ili (?[+-]znamenka mora biti nakon )" + +-#: glib/gregex.c:412 ++#: glib/gregex.c:410 + msgid "unknown POSIX class name" +-msgstr "" ++msgstr "nepoznat POSIX naziva klase" + +-#: glib/gregex.c:415 ++#: glib/gregex.c:413 + msgid "POSIX collating elements are not supported" +-msgstr "" ++msgstr "POSIX elementi razvrstavanja nisu podržani" + +-#: glib/gregex.c:418 ++#: glib/gregex.c:416 + msgid "character value in \\x{...} sequence is too large" +-msgstr "" ++msgstr "vrijednost znaka u \\x{...} slijedu je prevelika" + +-#: glib/gregex.c:421 ++#: glib/gregex.c:419 + msgid "invalid condition (?(0)" +-msgstr "" ++msgstr "nevaljani uvjet (?(0)" + +-#: glib/gregex.c:424 ++#: glib/gregex.c:422 + msgid "\\C not allowed in lookbehind assertion" +-msgstr "" ++msgstr "\\C nije dopušten u lookbehind navodu" + +-#: glib/gregex.c:431 ++#: glib/gregex.c:429 + msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +-msgstr "" ++msgstr "escapes \\L, \\l, \\N{naziv}, \\U, i \\u nisu podržani" + +-#: glib/gregex.c:434 ++#: glib/gregex.c:432 + msgid "recursive call could loop indefinitely" +-msgstr "" ++msgstr "rekruzivni poziv bi se mogao neograničeno ponavljati" + +-#: glib/gregex.c:438 ++#: glib/gregex.c:436 + msgid "unrecognized character after (?P" +-msgstr "" ++msgstr "neprepoznati znak nakon (?P" + +-#: glib/gregex.c:441 ++#: glib/gregex.c:439 + msgid "missing terminator in subpattern name" +-msgstr "" ++msgstr "nedostaje završetak u nazivu poduzorka" + +-#: glib/gregex.c:444 ++#: glib/gregex.c:442 + msgid "two named subpatterns have the same name" +-msgstr "" ++msgstr "dva imenovana poduzorka imaju isti naziv" + +-#: glib/gregex.c:447 ++#: glib/gregex.c:445 + msgid "malformed \\P or \\p sequence" +-msgstr "" ++msgstr "oštećni \\P ili \\p slijed" + +-#: glib/gregex.c:450 ++#: glib/gregex.c:448 + msgid "unknown property name after \\P or \\p" +-msgstr "" ++msgstr "nepoznat naziv svojstva nakon \\P ili \\p" + +-#: glib/gregex.c:453 ++#: glib/gregex.c:451 + msgid "subpattern name is too long (maximum 32 characters)" +-msgstr "" ++msgstr "naziv poduzorka je predugačak (najviše 32 znaka)" + +-#: glib/gregex.c:456 ++#: glib/gregex.c:454 + msgid "too many named subpatterns (maximum 10,000)" +-msgstr "" ++msgstr "previše imenovanih poduzorka (najviše 10,000)" + +-#: glib/gregex.c:459 ++#: glib/gregex.c:457 + msgid "octal value is greater than \\377" +-msgstr "" ++msgstr "oktalana vrijednost je veća od \\377" + +-#: glib/gregex.c:463 ++#: glib/gregex.c:461 + msgid "overran compiling workspace" +-msgstr "" ++msgstr "prekoraćenje sastavljanja radnog prostora" + +-#: glib/gregex.c:467 ++#: glib/gregex.c:465 + msgid "previously-checked referenced subpattern not found" +-msgstr "" ++msgstr "prije provjereni referentni poduzorak nije pronađen" + +-#: glib/gregex.c:470 ++#: glib/gregex.c:468 + msgid "DEFINE group contains more than one branch" +-msgstr "" ++msgstr "DEFINE grupa sadrži više od jednog ogranka" + +-#: glib/gregex.c:473 ++#: glib/gregex.c:471 + msgid "inconsistent NEWLINE options" +-msgstr "" ++msgstr "nedosljedna NEWLINE mogućnost" + +-#: glib/gregex.c:476 ++#: glib/gregex.c:474 + msgid "" + "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " + "or by a plain number" + msgstr "" ++"\\g ne završava sa zagradom, kutnom zagradom, ili citiranim nazivom ili " ++"brojem, ili običnim brojem" + +-#: glib/gregex.c:480 ++#: glib/gregex.c:478 + msgid "a numbered reference must not be zero" +-msgstr "" ++msgstr "brojčana referenca ne može biti nula" + +-#: glib/gregex.c:483 ++#: glib/gregex.c:481 + msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +-msgstr "" ++msgstr "argument nije dopušten za (*ACCEPT), (*FAIL), ili (*COMMIT)" + +-#: glib/gregex.c:486 ++#: glib/gregex.c:484 + msgid "(*VERB) not recognized" +-msgstr "" ++msgstr "(*VERB) nije prepoznat" + +-#: glib/gregex.c:489 ++#: glib/gregex.c:487 + msgid "number is too big" +-msgstr "" ++msgstr "broj je prevelik" + +-#: glib/gregex.c:492 ++#: glib/gregex.c:490 + msgid "missing subpattern name after (?&" +-msgstr "" ++msgstr "nedostaje naziv poduzorka nakon (?&" + +-#: glib/gregex.c:495 ++#: glib/gregex.c:493 + msgid "digit expected after (?+" +-msgstr "" ++msgstr "očekuje se znamenka nakon (?+" + +-#: glib/gregex.c:498 ++#: glib/gregex.c:496 + msgid "] is an invalid data character in JavaScript compatibility mode" +-msgstr "" ++msgstr "] je nevaljani znak podatka u JavaScript načinu kompatibilnosti" + +-#: glib/gregex.c:501 ++#: glib/gregex.c:499 + msgid "different names for subpatterns of the same number are not allowed" +-msgstr "" ++msgstr "različiti nazivi za poduzorke istog broja nisu dopušteni" + +-#: glib/gregex.c:504 ++#: glib/gregex.c:502 + msgid "(*MARK) must have an argument" +-msgstr "" ++msgstr "(*MARK) mora sadržavati argument" + +-#: glib/gregex.c:507 ++#: glib/gregex.c:505 + msgid "\\c must be followed by an ASCII character" +-msgstr "" ++msgstr "\\c mora slijediti ASCII znak" + +-#: glib/gregex.c:510 ++#: glib/gregex.c:508 + msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +-msgstr "" ++msgstr "\\k ne mora slijediti zagrade, kutne zagrade ili citirani naziv" + +-#: glib/gregex.c:513 ++#: glib/gregex.c:511 + msgid "\\N is not supported in a class" +-msgstr "" ++msgstr "\\N nije podržan u klasi" + +-#: glib/gregex.c:516 ++#: glib/gregex.c:514 + msgid "too many forward references" +-msgstr "" ++msgstr "previše proslijeđenih referenci" + +-#: glib/gregex.c:519 ++#: glib/gregex.c:517 + msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +-msgstr "" ++msgstr "naziv je predugačak u (*MARK), (*PRUNE), (*SKIP), ili (*THEN)" + +-#: glib/gregex.c:522 ++#: glib/gregex.c:520 + msgid "character value in \\u.... sequence is too large" +-msgstr "" ++msgstr "vrijednost znaka u \\u.... slijedu je prevelika" + +-#: glib/gregex.c:745 glib/gregex.c:1983 ++#: glib/gregex.c:743 glib/gregex.c:1988 + #, c-format + msgid "Error while matching regular expression %s: %s" +-msgstr "" ++msgstr "Greška usporedbe običnog izraza %s: %s" + +-#: glib/gregex.c:1316 ++#: glib/gregex.c:1321 + msgid "PCRE library is compiled without UTF8 support" +-msgstr "" ++msgstr "PCRE biblioteka je kompilirana bez UTF8 podrške" + +-#: glib/gregex.c:1320 ++#: glib/gregex.c:1325 + msgid "PCRE library is compiled without UTF8 properties support" +-msgstr "" ++msgstr "PCRE biblioteka je kompilirana bez podrške UTF8 svojstava" + +-#: glib/gregex.c:1328 ++#: glib/gregex.c:1333 + msgid "PCRE library is compiled with incompatible options" +-msgstr "" ++msgstr "PCRE biblioteka je kompilirana s nekompatibilnom mogućnosti" + +-#: glib/gregex.c:1357 ++#: glib/gregex.c:1362 + #, c-format + msgid "Error while optimizing regular expression %s: %s" +-msgstr "" ++msgstr "Greška optimizacije običnog izraza %s: %s" + +-#: glib/gregex.c:1437 ++#: glib/gregex.c:1442 + #, c-format + msgid "Error while compiling regular expression %s at char %d: %s" +-msgstr "" ++msgstr "Greška kompiliranja običnog izraza %s pri znaku %d: %s" + +-#: glib/gregex.c:2419 ++#: glib/gregex.c:2427 + msgid "hexadecimal digit or “}” expected" +-msgstr "" ++msgstr "heksadecimalna znamenka ili “}” je očekivano" + +-#: glib/gregex.c:2435 ++#: glib/gregex.c:2443 + msgid "hexadecimal digit expected" +-msgstr "" ++msgstr "heksadecimalna znamenka je očekivana" + +-#: glib/gregex.c:2475 ++#: glib/gregex.c:2483 + msgid "missing “<” in symbolic reference" +-msgstr "" ++msgstr "nedostaje “<” u simboličkoj referenci" + +-#: glib/gregex.c:2484 ++#: glib/gregex.c:2492 + msgid "unfinished symbolic reference" +-msgstr "" ++msgstr "nedovršena simbolička referenca" + +-#: glib/gregex.c:2491 ++#: glib/gregex.c:2499 + msgid "zero-length symbolic reference" +-msgstr "" ++msgstr "simbolička referenca nulte duljine" + +-#: glib/gregex.c:2502 ++#: glib/gregex.c:2510 + msgid "digit expected" +-msgstr "" ++msgstr "očekivana je znamenka" + +-#: glib/gregex.c:2520 ++#: glib/gregex.c:2528 + msgid "illegal symbolic reference" +-msgstr "" ++msgstr "nevažeća simbolička referenca" + +-#: glib/gregex.c:2583 ++#: glib/gregex.c:2591 + msgid "stray final “\\”" +-msgstr "" ++msgstr "završno zalutali “\\”" + +-#: glib/gregex.c:2587 ++#: glib/gregex.c:2595 + msgid "unknown escape sequence" +-msgstr "" ++msgstr "nepoznati escape slijed" + +-#: glib/gregex.c:2597 ++#: glib/gregex.c:2605 + #, c-format + msgid "Error while parsing replacement text “%s” at char %lu: %s" +-msgstr "" ++msgstr "Greška obrade zamjenskog teksta “%s” pri znaku %lu: %s" + +-#: glib/gshell.c:94 ++#: glib/gshell.c:96 + msgid "Quoted text doesn’t begin with a quotation mark" + msgstr "Citirani tekst ne počinje sa navodnikom" + +-#: glib/gshell.c:184 ++#: glib/gshell.c:186 + msgid "Unmatched quotation mark in command line or other shell-quoted text" + msgstr "Navodnik nije uparen u naredbenom redku ili drugom tekstu ljuske" + +-#: glib/gshell.c:580 ++#: glib/gshell.c:592 + #, c-format + msgid "Text ended just after a “\\” character. (The text was “%s”)" +-msgstr "Tekst je završio nakon “\\” znaka (Tekst je bio '%s')" ++msgstr "Tekst je završio nakon “\\” znaka (Tekst je bio “%s”)" + +-#: glib/gshell.c:587 ++#: glib/gshell.c:599 + #, c-format + msgid "Text ended before matching quote was found for %c. (The text was “%s”)" + msgstr "" +-"Tekst je završio prije nego što je nađen završni navodnik %c. (Tekst je bio " +-"“%s”)" ++"Tekst je završio prije nego što je pronađen završni navodnik %c. (Tekst je " ++"bio “%s”)" + +-#: glib/gshell.c:599 ++#: glib/gshell.c:611 + msgid "Text was empty (or contained only whitespace)" +-msgstr "Tekst je bio prazan (ili je sadržavao samo prazne znakove)" ++msgstr "Tekst je bio prazan (ili je sadržavao samo razmake)" + +-#: glib/gspawn.c:323 ++#: glib/gspawn.c:310 + #, c-format + msgid "Failed to read data from child process (%s)" +-msgstr "Neuspješno čitanje podataka iz podređenog procesa (%s)" ++msgstr "Neuspjelo čitanje podataka iz podređenog procesa (%s)" + +-#: glib/gspawn.c:468 ++#: glib/gspawn.c:461 + #, c-format + msgid "Unexpected error in reading data from a child process (%s)" + msgstr "Neočekivana greška u čitanju podataka podređenog procesa (%s)" + +-#: glib/gspawn.c:553 ++#: glib/gspawn.c:546 + #, c-format + msgid "Unexpected error in waitpid() (%s)" + msgstr "Neočekivana greška u waitpid() (%s)" + +-#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 ++#: glib/gspawn.c:1166 glib/gspawn-win32.c:1407 + #, c-format + msgid "Child process exited with code %ld" +-msgstr "" ++msgstr "Podređeni proces se zatvorio s kôdom %ld" + +-#: glib/gspawn.c:1069 ++#: glib/gspawn.c:1174 + #, c-format + msgid "Child process killed by signal %ld" +-msgstr "" ++msgstr "Podređeni proces je ubio signal %ld" + +-#: glib/gspawn.c:1076 ++#: glib/gspawn.c:1181 + #, c-format + msgid "Child process stopped by signal %ld" +-msgstr "" ++msgstr "Podređeni proces je zaustavio signal %ld" + +-#: glib/gspawn.c:1083 ++#: glib/gspawn.c:1188 + #, c-format + msgid "Child process exited abnormally" +-msgstr "" ++msgstr "Podređeni proces se zatvorio abnormalno" + +-#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 ++#: glib/gspawn.c:1855 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 + #, c-format + msgid "Failed to read from child pipe (%s)" + msgstr "Neuspjelo čitanje iz podređenog slivnika (%s)" + +-#: glib/gspawn.c:1788 +-#, fuzzy, c-format +-#| msgid "Failed to fork child process (%s)" ++#: glib/gspawn.c:2157 ++#, c-format + msgid "Failed to spawn child process “%s” (%s)" +-msgstr "Nisam uspio pokrenuti proces dijete (%s)" ++msgstr "Neuspjelo pokretanje podređenog procesa “%s” (%s)" + +-#: glib/gspawn.c:1871 ++#: glib/gspawn.c:2274 + #, c-format + msgid "Failed to fork (%s)" +-msgstr "Pokretanje nije uspio (%s)" ++msgstr "Neuspjelo grananje (%s)" + +-#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 +-#, fuzzy, c-format +-#| msgid "Failed to change to directory '%s' (%s)" ++#: glib/gspawn.c:2434 glib/gspawn-win32.c:381 ++#, c-format + msgid "Failed to change to directory “%s” (%s)" +-msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)" ++msgstr "Neuspjela promjena direktorija “%s” (%s)" + +-#: glib/gspawn.c:2036 +-#, fuzzy, c-format +-#| msgid "Failed to execute child process \"%s\" (%s)" ++#: glib/gspawn.c:2444 ++#, c-format + msgid "Failed to execute child process “%s” (%s)" +-msgstr "Neuspjeh u izvršavanju procesa djeteta \"%s\" (%s)" ++msgstr "Neuspjelo pokretanje podređenog procesa “%s” (%s)" + +-#: glib/gspawn.c:2046 ++#: glib/gspawn.c:2454 + #, c-format + msgid "Failed to redirect output or input of child process (%s)" +-msgstr "Nisam uspio preusmjeriti izlaz ili ulaz procesa djeteta (%s)" ++msgstr "Neuspjelo preusmjeravanje izlaza ili ulaza podređenog procesa (%s)" + +-#: glib/gspawn.c:2055 ++#: glib/gspawn.c:2463 + #, c-format + msgid "Failed to fork child process (%s)" +-msgstr "Nisam uspio pokrenuti proces dijete (%s)" ++msgstr "Neuspjelo grananje podređenog procesa (%s)" + +-#: glib/gspawn.c:2063 +-#, fuzzy, c-format +-#| msgid "Unknown error executing child process \"%s\"" ++#: glib/gspawn.c:2471 ++#, c-format + msgid "Unknown error executing child process “%s”" +-msgstr "Nepoznata greška u izvršavanju procesa djeteta \"%s\"" ++msgstr "Nepoznata greška pokretanja podređenog procesa “%s”" + +-#: glib/gspawn.c:2087 ++#: glib/gspawn.c:2495 + #, c-format + msgid "Failed to read enough data from child pid pipe (%s)" +-msgstr "Neuspjeh u čitanju dovoljno podataka iz cjevovoda procesa djeteta (%s)" ++msgstr "" ++"Neuspjelo čitanje dovoljno podataka iz id procesa podređenog slivnika (%s)" + + #: glib/gspawn-win32.c:294 + msgid "Failed to read data from child process" +-msgstr "Nisam uspio čitati podatke od procesa djeteta" ++msgstr "Neuspjelo čitanje podataka iz podređenog procesa" + + #: glib/gspawn-win32.c:311 + #, c-format + msgid "Failed to create pipe for communicating with child process (%s)" +-msgstr "Ne mogu stvoriti cjevovod za komuniciranje sa procesom djetetom(%s)" ++msgstr "" ++"Neuspjelo stvaranje slivnika za komunikaciju s podređenim procesom (%s)" + + #: glib/gspawn-win32.c:387 glib/gspawn-win32.c:392 glib/gspawn-win32.c:511 + #, c-format + msgid "Failed to execute child process (%s)" +-msgstr "Nisam mogao izvesti proces dijete (%s)" ++msgstr "Neuspjelo pokretanje podređenog procesa (%s)" + + #: glib/gspawn-win32.c:461 + #, c-format + msgid "Invalid program name: %s" +-msgstr "Neispravno ime programa: %s" ++msgstr "Nevaljani naziv programa: %s" + +-#: glib/gspawn-win32.c:471 glib/gspawn-win32.c:725 ++#: glib/gspawn-win32.c:471 glib/gspawn-win32.c:779 + #, c-format + msgid "Invalid string in argument vector at %d: %s" +-msgstr "Neispravan niz znakova u argumentima na %d: %s" ++msgstr "Nevaljan niz znakova u vektoru argumenta na %d: %s" + +-#: glib/gspawn-win32.c:482 glib/gspawn-win32.c:740 ++#: glib/gspawn-win32.c:482 glib/gspawn-win32.c:794 + #, c-format + msgid "Invalid string in environment: %s" +-msgstr "Neispravan niz znakova u okružju: %s" ++msgstr "Nevaljan niz znakova u okružju: %s" + +-#: glib/gspawn-win32.c:721 ++#: glib/gspawn-win32.c:775 + #, c-format + msgid "Invalid working directory: %s" +-msgstr "Neispravni radni direktorij: %s" ++msgstr "Nevaljan radni direktorij: %s" + +-#: glib/gspawn-win32.c:783 ++#: glib/gspawn-win32.c:837 + #, c-format + msgid "Failed to execute helper program (%s)" +-msgstr "Neuspjelo izvršavanje pomoćnog programa (%s)" ++msgstr "Neuspjelo pokretanje programa pomoći (%s)" + +-#: glib/gspawn-win32.c:1056 ++#: glib/gspawn-win32.c:1064 + msgid "" + "Unexpected error in g_io_channel_win32_poll() reading data from a child " + "process" + msgstr "" +-"Neočekivana greška u g_io_channel_win32_poll() čitajući podatke " +-"procesadjeteta" ++"Neočekivana greška u g_io_channel_win32_poll() čitanju podataka podređenog " ++"procesa" + +-#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 ++#: glib/gstrfuncs.c:3345 glib/gstrfuncs.c:3447 + msgid "Empty string is not a number" +-msgstr "" ++msgstr "Prazan niz znakova nije broj" + +-#: glib/gstrfuncs.c:3327 ++#: glib/gstrfuncs.c:3369 + #, c-format + msgid "“%s” is not a signed number" +-msgstr "" ++msgstr "“%s” nije potpisani broj" + +-#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 ++#: glib/gstrfuncs.c:3379 glib/gstrfuncs.c:3483 + #, c-format + msgid "Number “%s” is out of bounds [%s, %s]" +-msgstr "" ++msgstr "Broj “%s” je izvan granica [%s, %s]" + +-#: glib/gstrfuncs.c:3431 ++#: glib/gstrfuncs.c:3473 + #, c-format + msgid "“%s” is not an unsigned number" +-msgstr "" ++msgstr "“%s” nije nepotpisani broj" + +-#: glib/guri.c:313 ++#: glib/guri.c:315 + #, no-c-format + msgid "Invalid %-encoding in URI" +-msgstr "" ++msgstr "Nevaljano %-kôdiranje u URI-ju" + +-#: glib/guri.c:330 ++#: glib/guri.c:332 + msgid "Illegal character in URI" +-msgstr "" ++msgstr "Nedopušten znak u URI-ju" + +-#: glib/guri.c:359 ++#: glib/guri.c:366 + msgid "Non-UTF-8 characters in URI" +-msgstr "" ++msgstr "Ne-UTF-8 znak u URI-ju" + +-#: glib/guri.c:462 ++#: glib/guri.c:546 + #, c-format + msgid "Invalid IPv6 address ‘%.*s’ in URI" +-msgstr "" ++msgstr "Nevaljana IPv6 adresa ‘%.*s’ u URI-ju" + +-#: glib/guri.c:524 ++#: glib/guri.c:601 + #, c-format + msgid "Illegal encoded IP address ‘%.*s’ in URI" +-msgstr "" ++msgstr "Nevaljano kôdirana IP adresa ‘%.*s’ u URI-ju" ++ ++#: glib/guri.c:613 ++#, c-format ++msgid "Illegal internationalized hostname ‘%.*s’ in URI" ++msgstr "Nedopušteni internacionalizirani naziv računala ‘%.*s’ u URI-ju" + +-#: glib/guri.c:558 glib/guri.c:570 ++#: glib/guri.c:645 glib/guri.c:657 + #, c-format + msgid "Could not parse port ‘%.*s’ in URI" +-msgstr "" ++msgstr "Nemoguća obrada ulaza ‘%.*s’ u URI-ju" + +-#: glib/guri.c:577 ++#: glib/guri.c:664 + #, c-format + msgid "Port ‘%.*s’ in URI is out of range" +-msgstr "" ++msgstr "Ulaz ‘%.*s’ u URI-ju je izvan raspona" + +-#: glib/guri.c:1057 glib/guri.c:1121 ++#: glib/guri.c:1224 glib/guri.c:1288 + #, c-format + msgid "URI ‘%s’ is not an absolute URI" + msgstr "URI '%s' nije apsolutni URI" + +-#: glib/guri.c:1063 ++#: glib/guri.c:1230 + #, c-format + msgid "URI ‘%s’ has no host component" +-msgstr "" ++msgstr "URI ‘%s’ nema komponentu poslužitelja" + +-#: glib/guri.c:1265 ++#: glib/guri.c:1435 + msgid "URI is not absolute, and no base URI was provided" +-msgstr "" ++msgstr "URI nije apsolutan, i nema navednog osnovnog URI-ja" + +-#: glib/guri.c:2021 ++#: glib/guri.c:2213 + msgid "Missing ‘=’ and parameter value" +-msgstr "" ++msgstr "Nedostaje ‘=’ i vrijednost parametra" + + #: glib/gutf8.c:817 + msgid "Failed to allocate memory" +@@ -5830,160 +5987,160 @@ msgstr "Neuspjela preraspodjela memorije" + msgid "Character out of range for UTF-8" + msgstr "Znak je izvan raspona za UTF-8" + +-#: glib/gutf8.c:1051 glib/gutf8.c:1060 glib/gutf8.c:1190 glib/gutf8.c:1199 +-#: glib/gutf8.c:1338 glib/gutf8.c:1435 ++#: glib/gutf8.c:1052 glib/gutf8.c:1061 glib/gutf8.c:1191 glib/gutf8.c:1200 ++#: glib/gutf8.c:1339 glib/gutf8.c:1436 + msgid "Invalid sequence in conversion input" +-msgstr "Neispravna sekvenca u pretvaranju ulaza" ++msgstr "Neispravan niz u ulazu pretvorbe" + +-#: glib/gutf8.c:1349 glib/gutf8.c:1446 ++#: glib/gutf8.c:1350 glib/gutf8.c:1447 + msgid "Character out of range for UTF-16" + msgstr "Znak je izvan raspona za UTF-16" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2756 ++#: glib/gutils.c:2739 + #, c-format + msgid "%.1f kB" + msgstr "%.1f kB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2758 ++#: glib/gutils.c:2741 + #, c-format + msgid "%.1f MB" + msgstr "%.1f MB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2760 ++#: glib/gutils.c:2743 + #, c-format + msgid "%.1f GB" + msgstr "%.1f GB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2762 ++#: glib/gutils.c:2745 + #, c-format + msgid "%.1f TB" + msgstr "%.1f TB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2764 ++#: glib/gutils.c:2747 + #, c-format + msgid "%.1f PB" + msgstr "%.1f PB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2766 ++#: glib/gutils.c:2749 + #, c-format + msgid "%.1f EB" + msgstr "%.1f EB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2770 ++#: glib/gutils.c:2753 + #, c-format + msgid "%.1f KiB" + msgstr "%.1f KiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2772 ++#: glib/gutils.c:2755 + #, c-format + msgid "%.1f MiB" + msgstr "%.1f MiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2774 ++#: glib/gutils.c:2757 + #, c-format + msgid "%.1f GiB" + msgstr "%.1f GiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2776 ++#: glib/gutils.c:2759 + #, c-format + msgid "%.1f TiB" + msgstr "%.1f TiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2778 ++#: glib/gutils.c:2761 + #, c-format + msgid "%.1f PiB" + msgstr "%.1f PiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2780 ++#: glib/gutils.c:2763 + #, c-format + msgid "%.1f EiB" + msgstr "%.1f EiB" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2784 ++#: glib/gutils.c:2767 + #, c-format + msgid "%.1f kb" + msgstr "%.1f kb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2786 ++#: glib/gutils.c:2769 + #, c-format + msgid "%.1f Mb" + msgstr "%.1f Mb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2788 ++#: glib/gutils.c:2771 + #, c-format + msgid "%.1f Gb" + msgstr "%.1f Gb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2790 ++#: glib/gutils.c:2773 + #, c-format + msgid "%.1f Tb" + msgstr "%.1f Tb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2792 ++#: glib/gutils.c:2775 + #, c-format + msgid "%.1f Pb" + msgstr "%.1f Pb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2794 ++#: glib/gutils.c:2777 + #, c-format + msgid "%.1f Eb" + msgstr "%.1f Eb" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2798 ++#: glib/gutils.c:2781 + #, c-format + msgid "%.1f Kib" + msgstr "%.1f Kib" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2800 ++#: glib/gutils.c:2783 + #, c-format + msgid "%.1f Mib" + msgstr "%.1f Mib" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2802 ++#: glib/gutils.c:2785 + #, c-format + msgid "%.1f Gib" + msgstr "%.1f Gib" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2804 ++#: glib/gutils.c:2787 + #, c-format + msgid "%.1f Tib" + msgstr "%.1f Tib" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2806 ++#: glib/gutils.c:2789 + #, c-format + msgid "%.1f Pib" + msgstr "%.1f Pib" + + #. Translators: Keep the no-break space between %.1f and the unit symbol +-#: glib/gutils.c:2808 ++#: glib/gutils.c:2791 + #, c-format + msgid "%.1f Eib" + msgstr "%.1f Eib" + +-#: glib/gutils.c:2842 glib/gutils.c:2959 ++#: glib/gutils.c:2825 glib/gutils.c:2942 + #, c-format + msgid "%u byte" + msgid_plural "%u bytes" +@@ -5991,7 +6148,7 @@ msgstr[0] "%u bajt" + msgstr[1] "%u bajta" + msgstr[2] "%u bajtova" + +-#: glib/gutils.c:2846 ++#: glib/gutils.c:2829 + #, c-format + msgid "%u bit" + msgid_plural "%u bits" +@@ -6000,7 +6157,7 @@ msgstr[1] "%u bita" + msgstr[2] "%u bitova" + + #. Translators: the %s in "%s bytes" will always be replaced by a number. +-#: glib/gutils.c:2913 ++#: glib/gutils.c:2896 + #, c-format + msgid "%s byte" + msgid_plural "%s bytes" +@@ -6009,7 +6166,7 @@ msgstr[1] "%s bajta" + msgstr[2] "%s bajtova" + + #. Translators: the %s in "%s bits" will always be replaced by a number. +-#: glib/gutils.c:2918 ++#: glib/gutils.c:2901 + #, c-format + msgid "%s bit" + msgid_plural "%s bits" +@@ -6022,42 +6179,32 @@ msgstr[2] "%s bitova" + #. * compatibility. Users will not see this string unless a program is using this deprecated function. + #. * Please translate as literally as possible. + #. +-#: glib/gutils.c:2972 ++#: glib/gutils.c:2955 + #, c-format + msgid "%.1f KB" + msgstr "%.1f KB" + +-#: glib/gutils.c:2977 ++#: glib/gutils.c:2960 + #, c-format + msgid "%.1f MB" + msgstr "%.1f MB" + +-#: glib/gutils.c:2982 ++#: glib/gutils.c:2965 + #, c-format + msgid "%.1f GB" + msgstr "%.1f GB" + +-#: glib/gutils.c:2987 ++#: glib/gutils.c:2970 + #, c-format + msgid "%.1f TB" + msgstr "%.1f TB" + +-#: glib/gutils.c:2992 ++#: glib/gutils.c:2975 + #, c-format + msgid "%.1f PB" + msgstr "%.1f PB" + +-#: glib/gutils.c:2997 ++#: glib/gutils.c:2980 + #, c-format + msgid "%.1f EB" + msgstr "%.1f EB" +- +-#~ msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +-#~ msgstr "" +-#~ "Greška pri otvaranju datoteke '%s' za pisanje: fdopen() nije uspio: %s" +- +-#~ msgid "Failed to close file '%s': fclose() failed: %s" +-#~ msgstr "Greška pri zatvaranju datoteke '%s': fclose() nije uspio: %s" +- +-#~ msgid "Key file does not have key '%s'" +-#~ msgstr "Datoteka s ključem ne sadrži ključ '%s'" diff -Nru glib2.0-2.66.8/debian/patches/debian/gvariant-test-Don-t-run-at-build-time-on-mips.patch glib2.0-2.66.8/debian/patches/debian/gvariant-test-Don-t-run-at-build-time-on-mips.patch --- glib2.0-2.66.8/debian/patches/debian/gvariant-test-Don-t-run-at-build-time-on-mips.patch 2021-03-20 15:35:19.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/debian/gvariant-test-Don-t-run-at-build-time-on-mips.patch 2023-09-30 13:25:23.000000000 +0000 @@ -16,10 +16,10 @@ 1 file changed, 8 insertions(+) diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c -index 3905e20..d418c75 100644 +index a90c1bb..c391798 100644 --- a/glib/tests/gvariant.c +++ b/glib/tests/gvariant.c -@@ -2405,6 +2405,14 @@ test_fuzzes (gpointer data) +@@ -2466,6 +2466,14 @@ test_fuzzes (gpointer data) gdouble fuzziness; int i; diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Add-internal-g_variant_maybe_get_child_value.patch glib2.0-2.66.8/debian/patches/gvariant-Add-internal-g_variant_maybe_get_child_value.patch --- glib2.0-2.66.8/debian/patches/gvariant-Add-internal-g_variant_maybe_get_child_value.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Add-internal-g_variant_maybe_get_child_value.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,105 @@ +From: Philip Withnall +Date: Tue, 25 Oct 2022 13:03:22 +0100 +Subject: gvariant: Add internal g_variant_maybe_get_child_value() + +This will be used in a following commit. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2540 +Origin: upstream, 2.74.4, commit:1770e255ae6cc3f0bf5312322432bbc6524a3632 +--- + glib/gvariant-core.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/gvariant-core.h | 3 +++ + 2 files changed, 71 insertions(+) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index f0f2c62..60cca1e 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1202,6 +1202,74 @@ g_variant_get_child_value (GVariant *value, + } + } + ++/** ++ * g_variant_maybe_get_child_value: ++ * @value: a container #GVariant ++ * @index_: the index of the child to fetch ++ * ++ * Reads a child item out of a container #GVariant instance, if it is in normal ++ * form. If it is not in normal form, return %NULL. ++ * ++ * This function behaves the same as g_variant_get_child_value(), except that it ++ * returns %NULL if the child is not in normal form. g_variant_get_child_value() ++ * would instead return a new default value of the correct type. ++ * ++ * This is intended to be used internally to avoid unnecessary #GVariant ++ * allocations. ++ * ++ * The returned value is never floating. You should free it with ++ * g_variant_unref() when you're done with it. ++ * ++ * This function is O(1). ++ * ++ * Returns: (transfer full): the child at the specified index ++ * ++ * Since: 2.74 ++ */ ++GVariant * ++g_variant_maybe_get_child_value (GVariant *value, ++ gsize index_) ++{ ++ g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); ++ g_return_val_if_fail (value->depth < G_MAXSIZE, NULL); ++ ++ if (~g_atomic_int_get (&value->state) & STATE_SERIALISED) ++ { ++ g_variant_lock (value); ++ ++ if (~value->state & STATE_SERIALISED) ++ { ++ GVariant *child; ++ ++ child = g_variant_ref (value->contents.tree.children[index_]); ++ g_variant_unlock (value); ++ ++ return child; ++ } ++ ++ g_variant_unlock (value); ++ } ++ ++ { ++ GVariantSerialised serialised = g_variant_to_serialised (value); ++ GVariantSerialised s_child; ++ ++ /* get the serializer to extract the serialized data for the child ++ * from the serialized data for the container ++ */ ++ s_child = g_variant_serialised_get_child (serialised, index_); ++ ++ if (!(value->state & STATE_TRUSTED) && s_child.data == NULL) ++ { ++ g_variant_type_info_unref (s_child.type_info); ++ return NULL; ++ } ++ ++ g_variant_type_info_unref (s_child.type_info); ++ return g_variant_get_child_value (value, index_); ++ } ++} ++ + /** + * g_variant_store: + * @value: the #GVariant to store +diff --git a/glib/gvariant-core.h b/glib/gvariant-core.h +index fc04711..947a98c 100644 +--- a/glib/gvariant-core.h ++++ b/glib/gvariant-core.h +@@ -36,4 +36,7 @@ GVariantTypeInfo * g_variant_get_type_info (GVarian + + gsize g_variant_get_depth (GVariant *value); + ++GVariant * g_variant_maybe_get_child_value (GVariant *value, ++ gsize index_); ++ + #endif /* __G_VARIANT_CORE_H__ */ diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch glib2.0-2.66.8/debian/patches/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch --- glib2.0-2.66.8/debian/patches/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,294 @@ +From: Philip Withnall +Date: Thu, 27 Oct 2022 22:53:13 +0100 +Subject: gvariant: Allow g_variant_byteswap() to operate on tree-form + variants +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This avoids needing to always serialise a variant before byteswapping it. +With variants in non-normal forms, serialisation can result in a large +increase in size of the variant, and a lot of allocations for leaf +`GVariant`s. This can lead to a denial of service attack. + +Avoid that by changing byteswapping so that it happens on the tree form +of the variant if the input is in non-normal form. If the input is in +normal form (either serialised or in tree form), continue using the +existing code as byteswapping an already-serialised normal variant is +about 3× faster than byteswapping on the equivalent tree form. + +The existing unit tests cover byteswapping well, but need some +adaptation so that they operate on tree form variants too. + +I considered dropping the serialised byteswapping code and doing all +byteswapping on tree-form variants, as that would make maintenance +simpler (avoiding having two parallel implementations of byteswapping). +However, most inputs to `g_variant_byteswap()` are likely to be +serialised variants (coming from a byte array of input from some foreign +source) and most of them are going to be in normal form (as corruption +and malicious action are rare). So getting rid of the serialised +byteswapping code would impose quite a performance penalty on the common +case. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2797 +Origin: upstream, 2.74.4, commit:7d7efce1d9c379fdd7d2ff58caea88f8806fdd2e +--- + glib/gvariant.c | 87 ++++++++++++++++++++++++++++++++++++++------------- + glib/tests/gvariant.c | 57 ++++++++++++++++++++++++++++----- + 2 files changed, 115 insertions(+), 29 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index d1764f7..dc9d696 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -5852,7 +5852,8 @@ g_variant_iter_loop (GVariantIter *iter, + + /* Serialised data {{{1 */ + static GVariant * +-g_variant_deep_copy (GVariant *value) ++g_variant_deep_copy (GVariant *value, ++ gboolean byteswap) + { + switch (g_variant_classify (value)) + { +@@ -5869,7 +5870,7 @@ g_variant_deep_copy (GVariant *value) + for (i = 0, n_children = g_variant_n_children (value); i < n_children; i++) + { + GVariant *child = g_variant_get_child_value (value, i); +- g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); ++ g_variant_builder_add_value (&builder, g_variant_deep_copy (child, byteswap)); + g_variant_unref (child); + } + +@@ -5920,7 +5921,7 @@ g_variant_deep_copy (GVariant *value) + * be non-normal for reasons other than invalid offset table + * entries. As they are all the same type, they will all have + * the same default value though, so keep that around. */ +- g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); ++ g_variant_builder_add_value (&builder, g_variant_deep_copy (child, byteswap)); + } + else if (child == NULL && first_invalid_child_deep_copy != NULL) + { +@@ -5929,7 +5930,7 @@ g_variant_deep_copy (GVariant *value) + else if (child == NULL) + { + child = g_variant_get_child_value (value, i); +- first_invalid_child_deep_copy = g_variant_ref_sink (g_variant_deep_copy (child)); ++ first_invalid_child_deep_copy = g_variant_ref_sink (g_variant_deep_copy (child, byteswap)); + g_variant_builder_add_value (&builder, first_invalid_child_deep_copy); + } + +@@ -5948,28 +5949,63 @@ g_variant_deep_copy (GVariant *value) + return g_variant_new_byte (g_variant_get_byte (value)); + + case G_VARIANT_CLASS_INT16: +- return g_variant_new_int16 (g_variant_get_int16 (value)); ++ if (byteswap) ++ return g_variant_new_int16 (GUINT16_SWAP_LE_BE (g_variant_get_int16 (value))); ++ else ++ return g_variant_new_int16 (g_variant_get_int16 (value)); + + case G_VARIANT_CLASS_UINT16: +- return g_variant_new_uint16 (g_variant_get_uint16 (value)); ++ if (byteswap) ++ return g_variant_new_uint16 (GUINT16_SWAP_LE_BE (g_variant_get_uint16 (value))); ++ else ++ return g_variant_new_uint16 (g_variant_get_uint16 (value)); + + case G_VARIANT_CLASS_INT32: +- return g_variant_new_int32 (g_variant_get_int32 (value)); ++ if (byteswap) ++ return g_variant_new_int32 (GUINT32_SWAP_LE_BE (g_variant_get_int32 (value))); ++ else ++ return g_variant_new_int32 (g_variant_get_int32 (value)); + + case G_VARIANT_CLASS_UINT32: +- return g_variant_new_uint32 (g_variant_get_uint32 (value)); ++ if (byteswap) ++ return g_variant_new_uint32 (GUINT32_SWAP_LE_BE (g_variant_get_uint32 (value))); ++ else ++ return g_variant_new_uint32 (g_variant_get_uint32 (value)); + + case G_VARIANT_CLASS_INT64: +- return g_variant_new_int64 (g_variant_get_int64 (value)); ++ if (byteswap) ++ return g_variant_new_int64 (GUINT64_SWAP_LE_BE (g_variant_get_int64 (value))); ++ else ++ return g_variant_new_int64 (g_variant_get_int64 (value)); + + case G_VARIANT_CLASS_UINT64: +- return g_variant_new_uint64 (g_variant_get_uint64 (value)); ++ if (byteswap) ++ return g_variant_new_uint64 (GUINT64_SWAP_LE_BE (g_variant_get_uint64 (value))); ++ else ++ return g_variant_new_uint64 (g_variant_get_uint64 (value)); + + case G_VARIANT_CLASS_HANDLE: +- return g_variant_new_handle (g_variant_get_handle (value)); ++ if (byteswap) ++ return g_variant_new_handle (GUINT32_SWAP_LE_BE (g_variant_get_handle (value))); ++ else ++ return g_variant_new_handle (g_variant_get_handle (value)); + + case G_VARIANT_CLASS_DOUBLE: +- return g_variant_new_double (g_variant_get_double (value)); ++ if (byteswap) ++ { ++ /* We have to convert the double to a uint64 here using a union, ++ * because a cast will round it numerically. */ ++ union ++ { ++ guint64 u64; ++ gdouble dbl; ++ } u1, u2; ++ u1.dbl = g_variant_get_double (value); ++ u2.u64 = GUINT64_SWAP_LE_BE (u1.u64); ++ return g_variant_new_double (u2.dbl); ++ } ++ else ++ return g_variant_new_double (g_variant_get_double (value)); + + case G_VARIANT_CLASS_STRING: + return g_variant_new_string (g_variant_get_string (value, NULL)); +@@ -6026,7 +6062,7 @@ g_variant_get_normal_form (GVariant *value) + if (g_variant_is_normal_form (value)) + return g_variant_ref (value); + +- trusted = g_variant_deep_copy (value); ++ trusted = g_variant_deep_copy (value, FALSE); + g_assert (g_variant_is_trusted (trusted)); + + return g_variant_ref_sink (trusted); +@@ -6046,6 +6082,11 @@ g_variant_get_normal_form (GVariant *value) + * contain multi-byte numeric data. That include strings, booleans, + * bytes and containers containing only these things (recursively). + * ++ * While this function can safely handle untrusted, non-normal data, it is ++ * recommended to check whether the input is in normal form beforehand, using ++ * g_variant_is_normal_form(), and to reject non-normal inputs if your ++ * application can be strict about what inputs it rejects. ++ * + * The returned value is always in normal form and is marked as trusted. + * + * Returns: (transfer full): the byteswapped form of @value +@@ -6063,22 +6104,21 @@ g_variant_byteswap (GVariant *value) + + g_variant_type_info_query (type_info, &alignment, NULL); + +- if (alignment) +- /* (potentially) contains multi-byte numeric data */ ++ if (alignment && g_variant_is_normal_form (value)) + { ++ /* (potentially) contains multi-byte numeric data, but is also already in ++ * normal form so we can use a faster byteswapping codepath on the ++ * serialised data */ + GVariantSerialised serialised = { 0, }; +- GVariant *trusted; + GBytes *bytes; + +- trusted = g_variant_get_normal_form (value); +- serialised.type_info = g_variant_get_type_info (trusted); +- serialised.size = g_variant_get_size (trusted); ++ serialised.type_info = g_variant_get_type_info (value); ++ serialised.size = g_variant_get_size (value); + serialised.data = g_malloc (serialised.size); +- serialised.depth = g_variant_get_depth (trusted); ++ serialised.depth = g_variant_get_depth (value); + serialised.ordered_offsets_up_to = G_MAXSIZE; /* operating on the normal form */ + serialised.checked_offsets_up_to = G_MAXSIZE; +- g_variant_store (trusted, serialised.data); +- g_variant_unref (trusted); ++ g_variant_store (value, serialised.data); + + g_variant_serialised_byteswap (serialised); + +@@ -6086,6 +6126,9 @@ g_variant_byteswap (GVariant *value) + new = g_variant_ref_sink (g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE)); + g_bytes_unref (bytes); + } ++ else if (alignment) ++ /* (potentially) contains multi-byte numeric data */ ++ new = g_variant_ref_sink (g_variant_deep_copy (value, TRUE)); + else + /* contains no multi-byte data */ + new = g_variant_get_normal_form (value); +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 0442b0a..7e18f41 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -2290,24 +2290,67 @@ serialise_tree (TreeInstance *tree, + static void + test_byteswap (void) + { +- GVariantSerialised one = { 0, }, two = { 0, }; ++ GVariantSerialised one = { 0, }, two = { 0, }, three = { 0, }; + TreeInstance *tree; +- ++ GVariant *one_variant = NULL; ++ GVariant *two_variant = NULL; ++ GVariant *two_byteswapped = NULL; ++ GVariant *three_variant = NULL; ++ GVariant *three_byteswapped = NULL; ++ guint8 *three_data_copy = NULL; ++ gsize three_size_copy = 0; ++ ++ /* Write a tree out twice, once normally and once byteswapped. */ + tree = tree_instance_new (NULL, 3); + serialise_tree (tree, &one); + ++ one_variant = g_variant_new_from_data (G_VARIANT_TYPE (g_variant_type_info_get_type_string (one.type_info)), ++ one.data, one.size, FALSE, NULL, NULL); ++ + i_am_writing_byteswapped = TRUE; + serialise_tree (tree, &two); ++ serialise_tree (tree, &three); + i_am_writing_byteswapped = FALSE; + +- g_variant_serialised_byteswap (two); +- +- g_assert_cmpmem (one.data, one.size, two.data, two.size); +- g_assert_cmpuint (one.depth, ==, two.depth); +- ++ /* Swap the first byteswapped one back using the function we want to test. */ ++ two_variant = g_variant_new_from_data (G_VARIANT_TYPE (g_variant_type_info_get_type_string (two.type_info)), ++ two.data, two.size, FALSE, NULL, NULL); ++ two_byteswapped = g_variant_byteswap (two_variant); ++ ++ /* Make the second byteswapped one non-normal (hopefully), and then byteswap ++ * it back using the function we want to test in its non-normal mode. ++ * This might not work because it’s not necessarily possible to make an ++ * arbitrary random variant non-normal. Adding a single zero byte to the end ++ * often makes something non-normal but still readable. */ ++ three_size_copy = three.size + 1; ++ three_data_copy = g_malloc (three_size_copy); ++ memcpy (three_data_copy, three.data, three.size); ++ three_data_copy[three.size] = '\0'; ++ ++ three_variant = g_variant_new_from_data (G_VARIANT_TYPE (g_variant_type_info_get_type_string (three.type_info)), ++ three_data_copy, three_size_copy, FALSE, NULL, NULL); ++ three_byteswapped = g_variant_byteswap (three_variant); ++ ++ /* Check they’re the same. We can always compare @one_variant and ++ * @two_byteswapped. We can only compare @two_byteswapped and ++ * @three_byteswapped if @two_variant and @three_variant are equal: in that ++ * case, the corruption to @three_variant was enough to make it non-normal but ++ * not enough to change its value. */ ++ g_assert_cmpvariant (one_variant, two_byteswapped); ++ ++ if (g_variant_equal (two_variant, three_variant)) ++ g_assert_cmpvariant (two_byteswapped, three_byteswapped); ++ ++ g_variant_unref (three_byteswapped); ++ g_variant_unref (three_variant); ++ g_variant_unref (two_byteswapped); ++ g_variant_unref (two_variant); ++ g_variant_unref (one_variant); + tree_instance_free (tree); + g_free (one.data); + g_free (two.data); ++ g_free (three.data); ++ g_free (three_data_copy); + } + + static void diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch glib2.0-2.66.8/debian/patches/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch --- glib2.0-2.66.8/debian/patches/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,149 @@ +From: Philip Withnall +Date: Thu, 15 Dec 2022 13:00:39 +0000 +Subject: =?utf-8?q?gvariant=3A_Check_offset_table_doesn=E2=80=99t_fall_outs?= + =?utf-8?q?ide_variant_bounds?= +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +When dereferencing the first entry in the offset table for a tuple, +check that it doesn’t fall outside the bounds of the variant first. + +This prevents an out-of-bounds read from some non-normal tuples. + +This bug was introduced in commit 73d0aa81c2575a5c9ae77d. + +Includes a unit test, although the test will likely only catch the +original bug if run with asan enabled. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2840 +Bug-oss-fuzz: #54302 +Origin: upstream, 2.74.4, commit:bf008669f26f70426ca30ee8cdcbd48e41a74718 +--- + glib/gvariant-serialiser.c | 12 ++++++--- + glib/tests/gvariant.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 72 insertions(+), 3 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 662aa84..47dfcab 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -982,7 +982,8 @@ gvs_tuple_get_member_bounds (GVariantSerialised value, + + member_info = g_variant_type_info_member_info (value.type_info, index_); + +- if (member_info->i + 1) ++ if (member_info->i + 1 && ++ offset_size * (member_info->i + 1) <= value.size) + member_start = gvs_read_unaligned_le (value.data + value.size - + offset_size * (member_info->i + 1), + offset_size); +@@ -993,7 +994,8 @@ gvs_tuple_get_member_bounds (GVariantSerialised value, + member_start &= member_info->b; + member_start |= member_info->c; + +- if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST) ++ if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST && ++ offset_size * (member_info->i + 1) <= value.size) + member_end = value.size - offset_size * (member_info->i + 1); + + else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) +@@ -1004,11 +1006,15 @@ gvs_tuple_get_member_bounds (GVariantSerialised value, + member_end = member_start + fixed_size; + } + +- else /* G_VARIANT_MEMBER_ENDING_OFFSET */ ++ else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET && ++ offset_size * (member_info->i + 2) <= value.size) + member_end = gvs_read_unaligned_le (value.data + value.size - + offset_size * (member_info->i + 2), + offset_size); + ++ else /* invalid */ ++ member_end = G_MAXSIZE; ++ + if (out_member_start != NULL) + *out_member_start = member_start; + if (out_member_end != NULL) +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 7e18f41..a90c1bb 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -5576,6 +5576,67 @@ test_normal_checking_tuple_offsets4 (void) + g_variant_unref (variant); + } + ++/* This is a regression test that dereferencing the first element in the offset ++ * table doesn’t dereference memory before the start of the GVariant. The first ++ * element in the offset table gives the offset of the final member in the ++ * tuple (the offset table is stored in reverse), and the position of this final ++ * member is needed to check that none of the tuple members overlap with the ++ * offset table ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2840 */ ++static void ++test_normal_checking_tuple_offsets5 (void) ++{ ++ /* A tuple of type (sss) in normal form would have an offset table with two ++ * entries: ++ * - The first entry (lowest index in the table) gives the offset of the ++ * third `s` in the tuple, as the offset table is reversed compared to the ++ * tuple members. ++ * - The second entry (highest index in the table) gives the offset of the ++ * second `s` in the tuple. ++ * - The offset of the first `s` in the tuple is always 0. ++ * ++ * See §2.5.4 (Structures) of the GVariant specification for details, noting ++ * that the table is only layed out this way because all three members of the ++ * tuple have non-fixed sizes. ++ * ++ * It’s not clear whether the 0xaa data of this variant is part of the strings ++ * in the tuple, or part of the offset table. It doesn’t really matter. This ++ * is a regression test to check that the code to validate the offset table ++ * doesn’t unconditionally try to access the first entry in the offset table ++ * by subtracting the table size from the end of the GVariant data. ++ * ++ * In this non-normal case, that would result in an address off the start of ++ * the GVariant data, and an out-of-bounds read, because the GVariant is one ++ * byte long, but the offset table is calculated as two bytes long (with 1B ++ * sized entries) from the tuple’s type. ++ */ ++ const GVariantType *data_type = G_VARIANT_TYPE ("(sss)"); ++ const guint8 data[] = { 0xaa }; ++ gsize size = sizeof (data); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected = NULL; ++ ++ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2840"); ++ ++ variant = g_variant_new_from_data (data_type, data, size, FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ g_assert_false (g_variant_is_normal_form (variant)); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ ++ expected = g_variant_new_parsed ("('', '', '')"); ++ g_assert_cmpvariant (expected, variant); ++ g_assert_cmpvariant (expected, normal_variant); ++ ++ g_variant_unref (expected); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ + /* Test that an otherwise-valid serialised GVariant is considered non-normal if + * its offset table entries are too wide. + * +@@ -5828,6 +5889,8 @@ main (int argc, char **argv) + test_normal_checking_tuple_offsets3); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets4", + test_normal_checking_tuple_offsets4); ++ g_test_add_func ("/gvariant/normal-checking/tuple-offsets5", ++ test_normal_checking_tuple_offsets5); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets/minimal-sized", + test_normal_checking_tuple_offsets_minimal_sized); + g_test_add_func ("/gvariant/normal-checking/empty-object-path", diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Clarify-operator-precedence.patch glib2.0-2.66.8/debian/patches/gvariant-Clarify-operator-precedence.patch --- glib2.0-2.66.8/debian/patches/gvariant-Clarify-operator-precedence.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Clarify-operator-precedence.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,32 @@ +From: Philip Withnall +Date: Tue, 8 Dec 2020 11:19:12 +0000 +Subject: gvariant: Clarify operator precedence +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This doesn’t change the behaviour of the code, but should squash some +compiler/static analysis warnings about ‘are you sure you got the +precedence right here?’. + +Coverity CID: #1159470 + +Signed-off-by: Philip Withnall +Origin: upstream, 2.67.2, commit:d5778ec4790c88b69ee2235922186437e9d73827 +--- + glib/gvariant.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 50fae54..bf2c406 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -4290,7 +4290,7 @@ g_variant_format_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr) + { +-#define next_char() (string == limit ? '\0' : *string++) ++#define next_char() (string == limit ? '\0' : *(string++)) + #define peek_char() (string == limit ? '\0' : *string) + char c; + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch glib2.0-2.66.8/debian/patches/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch --- glib2.0-2.66.8/debian/patches/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,28 @@ +From: Philip Withnall +Date: Mon, 24 Oct 2022 18:14:57 +0100 +Subject: gvariant: Clarify the docs for g_variant_get_normal_form() + +Document how non-normal parts of the `GVariant` are handled. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:9d2a142807806212a23436d0332b0209733810f2 +--- + glib/gvariant.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 9dbbab7..cb1685f 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -5936,7 +5936,9 @@ g_variant_deep_copy (GVariant *value) + * marked as trusted and a new reference to it is returned. + * + * If @value is found not to be in normal form then a new trusted +- * #GVariant is created with the same value as @value. ++ * #GVariant is created with the same value as @value. The non-normal parts of ++ * @value will be replaced with default values which are guaranteed to be in ++ * normal form. + * + * It makes sense to call this function if you've received #GVariant + * data from untrusted sources and you want to ensure your serialised diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch glib2.0-2.66.8/debian/patches/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch --- glib2.0-2.66.8/debian/patches/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Cut-allocs-of-default-values-for-children-of-non.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,126 @@ +From: Philip Withnall +Date: Tue, 25 Oct 2022 13:03:45 +0100 +Subject: gvariant: Cut allocs of default values for children of non-normal + arrays +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This improves a slow case in `g_variant_get_normal_form()` where +allocating many identical default values for the children of a +variable-sized array which has a malformed offset table would take a lot +of time. + +The fix is to make all child values after the first invalid one be +references to the default value emitted for the first invalid one, +rather than identical new `GVariant`s. + +In particular, this fixes a case where an attacker could create an array +of length L of very large tuples of size T each, corrupt the offset table +so they don’t have to specify the array content, and then induce +`g_variant_get_normal_form()` into allocating L×T default values from an +input which is significantly smaller than L×T in length. + +A pre-existing workaround for this issue is for code to call +`g_variant_is_normal_form()` before calling +`g_variant_get_normal_form()`, and to skip the latter call if the former +returns false. This commit improves the behaviour in the case that +`g_variant_get_normal_form()` is called anyway. + +This fix changes the time to run the `fuzz_variant_binary` test on the +testcase from oss-fuzz#19777 from >60s (before being terminated) with +2.3GB of memory usage and 580k page faults; to 32s, 8.3MB of memory +usage and 1500 page faults (as measured by `time -v`). + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2540 +Bug-oss-fuzz: #19777 +Origin: upstream, 2.74.4, commit:82fc15af4c84a2645343c51b18ab3528c51790ab +--- + glib/gvariant.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 65 insertions(+), 1 deletion(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 4566cd1..92f6abd 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -5857,7 +5857,6 @@ g_variant_deep_copy (GVariant *value) + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_MAYBE: +- case G_VARIANT_CLASS_ARRAY: + case G_VARIANT_CLASS_TUPLE: + case G_VARIANT_CLASS_DICT_ENTRY: + case G_VARIANT_CLASS_VARIANT: +@@ -5877,6 +5876,71 @@ g_variant_deep_copy (GVariant *value) + return g_variant_builder_end (&builder); + } + ++ case G_VARIANT_CLASS_ARRAY: ++ { ++ GVariantBuilder builder; ++ gsize i, n_children; ++ GVariant *first_invalid_child_deep_copy = NULL; ++ ++ /* Arrays are in theory treated the same as maybes, tuples, dict entries ++ * and variants, and could be another case in the above block of code. ++ * ++ * However, they have the property that when dealing with non-normal ++ * data (which is the only time g_variant_deep_copy() is currently ++ * called) in a variable-sized array, the code above can easily end up ++ * creating many default child values in order to return an array which ++ * is of the right length and type, but without containing non-normal ++ * data. This can happen if the offset table for the array is malformed. ++ * ++ * In this case, the code above would end up allocating the same default ++ * value for each one of the child indexes beyond the first malformed ++ * entry in the offset table. This can end up being a lot of identical ++ * allocations of default values, particularly if the non-normal array ++ * is crafted maliciously. ++ * ++ * Avoid that problem by returning a new reference to the same default ++ * value for every child after the first invalid one. This results in ++ * returning an equivalent array, in normal form and trusted — but with ++ * significantly fewer memory allocations. ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2540 */ ++ ++ g_variant_builder_init (&builder, g_variant_get_type (value)); ++ ++ for (i = 0, n_children = g_variant_n_children (value); i < n_children; i++) ++ { ++ /* Try maybe_get_child_value() first; if it returns NULL, this child ++ * is non-normal. get_child_value() would have constructed and ++ * returned a default value in that case. */ ++ GVariant *child = g_variant_maybe_get_child_value (value, i); ++ ++ if (child != NULL) ++ { ++ /* Non-normal children may not always be contiguous, as they may ++ * be non-normal for reasons other than invalid offset table ++ * entries. As they are all the same type, they will all have ++ * the same default value though, so keep that around. */ ++ g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); ++ } ++ else if (child == NULL && first_invalid_child_deep_copy != NULL) ++ { ++ g_variant_builder_add_value (&builder, first_invalid_child_deep_copy); ++ } ++ else if (child == NULL) ++ { ++ child = g_variant_get_child_value (value, i); ++ first_invalid_child_deep_copy = g_variant_ref_sink (g_variant_deep_copy (child)); ++ g_variant_builder_add_value (&builder, first_invalid_child_deep_copy); ++ } ++ ++ g_clear_pointer (&child, g_variant_unref); ++ } ++ ++ g_clear_pointer (&first_invalid_child_deep_copy, g_variant_unref); ++ ++ return g_variant_builder_end (&builder); ++ } ++ + case G_VARIANT_CLASS_BOOLEAN: + return g_variant_new_boolean (g_variant_get_boolean (value)); + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch --- glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,388 @@ +From: Philip Withnall +Date: Fri, 7 Jan 2022 16:42:14 +0000 +Subject: =?utf-8?q?gvariant=3A_Don=E2=80=99t_allow_child_elements_of_a_tupl?= + =?utf-8?q?e_to_overlap_each_other?= + +This is similar to the earlier commit which prevents child elements of a +variable-sized array from overlapping each other, but this time for +tuples. It is based heavily on ideas by William Manley. + +Tuples are slightly different from variable-sized arrays in that they +contain a mixture of fixed and variable sized elements. All but one of +the variable sized elements have an entry in the frame offsets table. +This means that if we were to just check the ordering of the frame +offsets table, the variable sized elements could still overlap +interleaving fixed sized elements, which would be bad. + +Therefore we have to check the elements rather than the frame offsets. + +The logic of checking the elements up to the index currently being +requested, and caching the result in `ordered_offsets_up_to`, means that +the algorithmic cost implications are the same for this commit as for +variable-sized arrays: an O(N) cost for these checks is amortised out +over N accesses to O(1) per access. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:2d55b3b74b1bc256e91a9d0d59120570376e6acc +--- + glib/gvariant-core.c | 6 +- + glib/gvariant-serialiser.c | 40 ++++++++++ + glib/gvariant-serialiser.h | 7 +- + glib/gvariant.c | 1 + + glib/tests/gvariant.c | 181 +++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 232 insertions(+), 3 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 4bd7d05..9b268d9 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1,6 +1,7 @@ + /* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited ++ * Copyright © 2022 Endless OS Foundation, LLC + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -179,7 +180,7 @@ struct _GVariant + * offsets themselves. + * + * This field is only relevant for arrays of non +- * fixed width types. ++ * fixed width types and for tuples. + * + * .tree: Only valid when the instance is in tree form. + * +@@ -1139,6 +1140,9 @@ g_variant_get_child_value (GVariant *value, + */ + s_child = g_variant_serialised_get_child (serialised, index_); + ++ /* Update the cached ordered_offsets_up_to, since @serialised will be thrown away when this function exits */ ++ value->contents.serialised.ordered_offsets_up_to = MAX (value->contents.serialised.ordered_offsets_up_to, serialised.ordered_offsets_up_to); ++ + /* Check whether this would cause nesting too deep. If so, return a fake + * child. The only situation we expect this to happen in is with a variant, + * as all other deeply-nested types have a static type, and hence should +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index eef1a53..812e0d9 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -942,6 +942,10 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + * for the tuple. See the notes in gvarianttypeinfo.h. + */ + ++/* Note: This doesn’t guarantee that @out_member_end >= @out_member_start; that ++ * condition may not hold true for invalid serialised variants. The caller is ++ * responsible for checking the returned values and handling invalid ones ++ * appropriately. */ + static void + gvs_tuple_get_member_bounds (GVariantSerialised value, + gsize index_, +@@ -1028,6 +1032,42 @@ gvs_tuple_get_child (GVariantSerialised value, + return child; + } + ++ /* If the requested @index_ is beyond the set of indices whose framing offsets ++ * have been checked, check the remaining offsets to see whether they’re ++ * normal (in order, no overlapping tuple elements). ++ * ++ * Unlike the checks in gvs_variable_sized_array_get_child(), we have to check ++ * all the tuple *elements* here, not just all the framing offsets, since ++ * tuples contain a mix of elements which use framing offsets and ones which ++ * don’t. None of them are allowed to overlap. */ ++ if (index_ > value.ordered_offsets_up_to) ++ { ++ gsize i, prev_i_end = 0; ++ ++ if (value.ordered_offsets_up_to > 0) ++ gvs_tuple_get_member_bounds (value, value.ordered_offsets_up_to - 1, offset_size, NULL, &prev_i_end); ++ ++ for (i = value.ordered_offsets_up_to; i <= index_; i++) ++ { ++ gsize i_start, i_end; ++ ++ gvs_tuple_get_member_bounds (value, i, offset_size, &i_start, &i_end); ++ ++ if (i_start > i_end || i_start < prev_i_end || i_end > value.size) ++ break; ++ ++ prev_i_end = i_end; ++ } ++ ++ value.ordered_offsets_up_to = i - 1; ++ } ++ ++ if (index_ > value.ordered_offsets_up_to) ++ { ++ /* Offsets are invalid somewhere, so return an empty child. */ ++ return child; ++ } ++ + if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) + { + if (offset_size * (member_info->i + 2) > value.size) +diff --git a/glib/gvariant-serialiser.h b/glib/gvariant-serialiser.h +index bc63600..765bd43 100644 +--- a/glib/gvariant-serialiser.h ++++ b/glib/gvariant-serialiser.h +@@ -35,8 +35,11 @@ typedef struct + * This guarantees that the bytes of element n don't overlap with any previous + * element. + * +- * This is both read and set by g_variant_serialised_get_child for arrays of +- * non-fixed-width types */ ++ * This is both read and set by g_variant_serialised_get_child() for arrays of ++ * non-fixed-width types, and for tuples. ++ * ++ * Even when dealing with tuples, @ordered_offsets_up_to is an element index, ++ * rather than an index into the frame offsets. */ + gsize ordered_offsets_up_to; + } GVariantSerialised; + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index df7caa0..54cb438 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -6010,6 +6010,7 @@ g_variant_byteswap (GVariant *value) + serialised.size = g_variant_get_size (trusted); + serialised.data = g_malloc (serialised.size); + serialised.depth = g_variant_get_depth (trusted); ++ serialised.ordered_offsets_up_to = G_MAXSIZE; /* operating on the normal form */ + g_variant_store (trusted, serialised.data); + g_variant_unref (trusted); + +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index ec426e1..a3721ce 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -1,6 +1,7 @@ + /* + * Copyright © 2010 Codethink Limited + * Copyright © 2020 William Manley ++ * Copyright © 2022 Endless OS Foundation, LLC + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -1451,6 +1452,7 @@ test_maybe (void) + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + serialised.depth = 0; ++ serialised.ordered_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, + random_instance_filler, +@@ -1574,6 +1576,7 @@ test_array (void) + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + serialised.depth = 0; ++ serialised.ordered_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); +@@ -1738,6 +1741,7 @@ test_tuple (void) + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + serialised.depth = 0; ++ serialised.ordered_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); +@@ -1834,6 +1838,7 @@ test_variant (void) + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + serialised.depth = 0; ++ serialised.ordered_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) &instance, 1); +@@ -5212,6 +5217,176 @@ test_normal_checking_tuple_offsets (void) + g_variant_unref (variant); + } + ++/* This is a regression test that we can't have non-normal values that take up ++ * significantly more space than the normal equivalent, by specifying the ++ * offset table entries so that tuple elements overlap. ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2121#note_838503 and ++ * https://gitlab.gnome.org/GNOME/glib/-/issues/2121#note_838513 */ ++static void ++test_normal_checking_tuple_offsets2 (void) ++{ ++ const GVariantType *data_type = G_VARIANT_TYPE ("(yyaiyyaiyy)"); ++ const guint8 data[] = { ++ 0x12, 0x34, 0x56, 0x78, 0x01, ++ /* ++ ^───────────────────┘ ++ ++ ^^^^^^^^^^ 1st yy ++ ^^^^^^^^^^ 2nd yy ++ ^^^^^^^^^^ 3rd yy ++ ^^^^ Framing offsets ++ */ ++ ++ /* If this variant was encoded normally, it would be something like this: ++ * 0x12, 0x34, pad, pad, [array bytes], 0x56, 0x78, pad, pad, [array bytes], 0x9A, 0xBC, 0xXX ++ * ^─────────────────────────────────────────────────────┘ ++ * ++ * ^^^^^^^^^^ 1st yy ++ * ^^^^^^^^^^ 2nd yy ++ * ^^^^^^^^^^ 3rd yy ++ * ^^^^ Framing offsets ++ */ ++ }; ++ gsize size = sizeof (data); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected = NULL; ++ ++ variant = g_variant_new_from_data (data_type, data, size, FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ g_assert_cmpuint (g_variant_get_size (normal_variant), <=, size * 3); ++ ++ expected = g_variant_new_parsed ( ++ "@(yyaiyyaiyy) (0x12, 0x34, [], 0x00, 0x00, [], 0x00, 0x00)"); ++ g_assert_cmpvariant (expected, variant); ++ g_assert_cmpvariant (expected, normal_variant); ++ ++ g_variant_unref (expected); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ ++/* This is a regression test that overlapping entries in the offset table are ++ * decoded consistently, even though they’re non-normal. ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2121#note_910935 */ ++static void ++test_normal_checking_tuple_offsets3 (void) ++{ ++ /* The expected decoding of this non-normal byte stream is complex. See ++ * section 2.7.3 (Handling Non-Normal Serialised Data) of the GVariant ++ * specification. ++ * ++ * The rule “Child Values Overlapping Framing Offsets” from the specification ++ * says that the first `ay` must be decoded as `[0x01]` even though it ++ * overlaps the first byte of the offset table. However, since commit ++ * 7eedcd76f7d5b8c98fa60013e1fe6e960bf19df3, GLib explicitly doesn’t allow ++ * this as it’s exploitable. So the first `ay` must be given a default value. ++ * ++ * The second and third `ay`s must be given default values because of rule ++ * “End Boundary Precedes Start Boundary”. ++ * ++ * The `i` must be given a default value because of rule “Start or End ++ * Boundary of a Child Falls Outside the Container”. ++ */ ++ const GVariantType *data_type = G_VARIANT_TYPE ("(ayayiay)"); ++ const guint8 data[] = { ++ 0x01, 0x00, 0x02, ++ /* ++ ^──┘ ++ ++ ^^^^^^^^^^ 1st ay, bytes 0-2 (but given a default value anyway, see above) ++ 2nd ay, bytes 2-0 ++ i, bytes 0-4 ++ 3rd ay, bytes 4-1 ++ ^^^^^^^^^^ Framing offsets ++ */ ++ }; ++ gsize size = sizeof (data); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected = NULL; ++ ++ variant = g_variant_new_from_data (data_type, data, size, FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ g_assert_false (g_variant_is_normal_form (variant)); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ g_assert_cmpuint (g_variant_get_size (normal_variant), <=, size * 3); ++ ++ expected = g_variant_new_parsed ("@(ayayiay) ([], [], 0, [])"); ++ g_assert_cmpvariant (expected, variant); ++ g_assert_cmpvariant (expected, normal_variant); ++ ++ g_variant_unref (expected); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ ++/* This is a regression test that overlapping entries in the offset table are ++ * decoded consistently, even though they’re non-normal. ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2121#note_910935 */ ++static void ++test_normal_checking_tuple_offsets4 (void) ++{ ++ /* The expected decoding of this non-normal byte stream is complex. See ++ * section 2.7.3 (Handling Non-Normal Serialised Data) of the GVariant ++ * specification. ++ * ++ * The rule “Child Values Overlapping Framing Offsets” from the specification ++ * says that the first `ay` must be decoded as `[0x01]` even though it ++ * overlaps the first byte of the offset table. However, since commit ++ * 7eedcd76f7d5b8c98fa60013e1fe6e960bf19df3, GLib explicitly doesn’t allow ++ * this as it’s exploitable. So the first `ay` must be given a default value. ++ * ++ * The second `ay` must be given a default value because of rule “End Boundary ++ * Precedes Start Boundary”. ++ * ++ * The third `ay` must be given a default value because its framing offsets ++ * overlap that of the first `ay`. ++ */ ++ const GVariantType *data_type = G_VARIANT_TYPE ("(ayayay)"); ++ const guint8 data[] = { ++ 0x01, 0x00, 0x02, ++ /* ++ ^──┘ ++ ++ ^^^^^^^^^^ 1st ay, bytes 0-2 (but given a default value anyway, see above) ++ 2nd ay, bytes 2-0 ++ 3rd ay, bytes 0-1 ++ ^^^^^^^^^^ Framing offsets ++ */ ++ }; ++ gsize size = sizeof (data); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected = NULL; ++ ++ variant = g_variant_new_from_data (data_type, data, size, FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ g_assert_false (g_variant_is_normal_form (variant)); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ g_assert_cmpuint (g_variant_get_size (normal_variant), <=, size * 3); ++ ++ expected = g_variant_new_parsed ("@(ayayay) ([], [], [])"); ++ g_assert_cmpvariant (expected, variant); ++ g_assert_cmpvariant (expected, normal_variant); ++ ++ g_variant_unref (expected); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ + /* Test that an empty object path is normalised successfully to the base object + * path, ‘/’. */ + static void +@@ -5361,6 +5536,12 @@ main (int argc, char **argv) + test_normal_checking_array_offsets2); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets", + test_normal_checking_tuple_offsets); ++ g_test_add_func ("/gvariant/normal-checking/tuple-offsets2", ++ test_normal_checking_tuple_offsets2); ++ g_test_add_func ("/gvariant/normal-checking/tuple-offsets3", ++ test_normal_checking_tuple_offsets3); ++ g_test_add_func ("/gvariant/normal-checking/tuple-offsets4", ++ test_normal_checking_tuple_offsets4); + g_test_add_func ("/gvariant/normal-checking/empty-object-path", + test_normal_checking_empty_object_path); + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch --- glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,414 @@ +From: William Manley +Date: Mon, 29 Jun 2020 16:59:44 +0100 +Subject: =?utf-8?q?gvariant=3A_Don=E2=80=99t_allow_child_elements_to_overla?= + =?utf-8?q?p_with_each_other?= +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +If different elements of a variable sized array can overlap with each +other then we can cause a `GVariant` to normalise to a much larger type. + +This commit changes the behaviour of `GVariant` with non-normal form data. If +an invalid frame offset is found all subsequent elements are given their +default value. + +When retrieving an element at index `n` we scan the frame offsets up to index +`n` and if they are not in order we return an element with the default value +for that type. This guarantees that elements don't overlap with each +other. We remember the offset we've scanned up to so we don't need to +repeat this work on subsequent accesses. We skip these checks for trusted +data. + +Unfortunately this makes random access of untrusted data O(n) — at least +on first access. It doesn't affect the algorithmic complexity of accessing +elements in order, such as when using the `GVariantIter` interface. Also: +the cost of validation will be amortised as the `GVariant` instance is +continued to be used. + +I've implemented this with 4 different functions, 1 for each element size, +rather than looping calling `gvs_read_unaligned_le` in the hope that the +compiler will find it easy to optimise and should produce fairly tight +code. + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:c8067857f7c8fb369ecb30bb534b018b2e2b8f87 +--- + glib/gvariant-core.c | 35 +++++++++++++++++++ + glib/gvariant-serialiser.c | 86 ++++++++++++++++++++++++++++++++++++++++++++-- + glib/gvariant-serialiser.h | 9 +++++ + glib/tests/gvariant.c | 45 ++++++++++++++++++++++++ + 4 files changed, 172 insertions(+), 3 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index cd6a887..4bd7d05 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -65,6 +65,7 @@ struct _GVariant + { + GBytes *bytes; + gconstpointer data; ++ gsize ordered_offsets_up_to; + } serialised; + + struct +@@ -162,6 +163,24 @@ struct _GVariant + * if .data pointed to the appropriate number of nul + * bytes. + * ++ * .ordered_offsets_up_to: If ordered_offsets_up_to == n this means that all ++ * the frame offsets up to and including the frame ++ * offset determining the end of element n are in ++ * order. This guarantees that the bytes of element ++ * n don't overlap with any previous element. ++ * ++ * For trusted data this is set to G_MAXSIZE and we ++ * don't check that the frame offsets are in order. ++ * ++ * Note: This doesn't imply the offsets are good in ++ * any way apart from their ordering. In particular ++ * offsets may be out of bounds for this value or ++ * may imply that the data overlaps the frame ++ * offsets themselves. ++ * ++ * This field is only relevant for arrays of non ++ * fixed width types. ++ * + * .tree: Only valid when the instance is in tree form. + * + * Note that accesses from other threads could result in +@@ -365,6 +384,7 @@ g_variant_to_serialised (GVariant *value) + (gpointer) value->contents.serialised.data, + value->size, + value->depth, ++ value->contents.serialised.ordered_offsets_up_to, + }; + return serialised; + } +@@ -396,6 +416,7 @@ g_variant_serialise (GVariant *value, + serialised.size = value->size; + serialised.data = data; + serialised.depth = value->depth; ++ serialised.ordered_offsets_up_to = 0; + + children = (gpointer *) value->contents.tree.children; + n_children = value->contents.tree.n_children; +@@ -439,6 +460,15 @@ g_variant_fill_gvs (GVariantSerialised *serialised, + g_assert (serialised->size == value->size); + serialised->depth = value->depth; + ++ if (value->state & STATE_SERIALISED) ++ { ++ serialised->ordered_offsets_up_to = value->contents.serialised.ordered_offsets_up_to; ++ } ++ else ++ { ++ serialised->ordered_offsets_up_to = 0; ++ } ++ + if (serialised->data) + /* g_variant_store() is a public API, so it + * it will reacquire the lock if it needs to. +@@ -481,6 +511,7 @@ g_variant_ensure_serialised (GVariant *value) + bytes = g_bytes_new_take (data, value->size); + value->contents.serialised.data = g_bytes_get_data (bytes, NULL); + value->contents.serialised.bytes = bytes; ++ value->contents.serialised.ordered_offsets_up_to = G_MAXSIZE; + value->state |= STATE_SERIALISED; + } + } +@@ -561,6 +592,7 @@ g_variant_new_from_bytes (const GVariantType *type, + serialised.type_info = value->type_info; + serialised.data = (guchar *) g_bytes_get_data (bytes, &serialised.size); + serialised.depth = 0; ++ serialised.ordered_offsets_up_to = trusted ? G_MAXSIZE : 0; + + if (!g_variant_serialised_check (serialised)) + { +@@ -611,6 +643,8 @@ g_variant_new_from_bytes (const GVariantType *type, + value->contents.serialised.data = g_bytes_get_data (bytes, &value->size); + } + ++ value->contents.serialised.ordered_offsets_up_to = trusted ? G_MAXSIZE : 0; ++ + g_clear_pointer (&owned_bytes, g_bytes_unref); + + return value; +@@ -1130,6 +1164,7 @@ g_variant_get_child_value (GVariant *value, + child->contents.serialised.bytes = + g_bytes_ref (value->contents.serialised.bytes); + child->contents.serialised.data = s_child.data; ++ child->contents.serialised.ordered_offsets_up_to = s_child.ordered_offsets_up_to; + + return child; + } +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 6357cc7..bfcb946 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -1,6 +1,7 @@ + /* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited ++ * Copyright © 2020 William Manley + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -264,6 +265,7 @@ gvs_fixed_sized_maybe_get_child (GVariantSerialised value, + value.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_ref (value.type_info); + value.depth++; ++ value.ordered_offsets_up_to = 0; + + return value; + } +@@ -295,7 +297,7 @@ gvs_fixed_sized_maybe_serialise (GVariantSerialised value, + { + if (n_children) + { +- GVariantSerialised child = { NULL, value.data, value.size, value.depth + 1 }; ++ GVariantSerialised child = { NULL, value.data, value.size, value.depth + 1, 0 }; + + gvs_filler (&child, children[0]); + } +@@ -317,6 +319,7 @@ gvs_fixed_sized_maybe_is_normal (GVariantSerialised value) + /* proper element size: "Just". recurse to the child. */ + value.type_info = g_variant_type_info_element (value.type_info); + value.depth++; ++ value.ordered_offsets_up_to = 0; + + return g_variant_serialised_is_normal (value); + } +@@ -358,6 +361,7 @@ gvs_variable_sized_maybe_get_child (GVariantSerialised value, + value.data = NULL; + + value.depth++; ++ value.ordered_offsets_up_to = 0; + + return value; + } +@@ -388,7 +392,7 @@ gvs_variable_sized_maybe_serialise (GVariantSerialised value, + { + if (n_children) + { +- GVariantSerialised child = { NULL, value.data, value.size - 1, value.depth + 1 }; ++ GVariantSerialised child = { NULL, value.data, value.size - 1, value.depth + 1, 0 }; + + /* write the data for the child. */ + gvs_filler (&child, children[0]); +@@ -408,6 +412,7 @@ gvs_variable_sized_maybe_is_normal (GVariantSerialised value) + value.type_info = g_variant_type_info_element (value.type_info); + value.size--; + value.depth++; ++ value.ordered_offsets_up_to = 0; + + return g_variant_serialised_is_normal (value); + } +@@ -691,6 +696,32 @@ gvs_variable_sized_array_n_children (GVariantSerialised value) + return gvs_variable_sized_array_get_frame_offsets (value).length; + } + ++/* Find the index of the first out-of-order element in @data, assuming that ++ * @data is an array of elements of given @type, starting at index @start and ++ * containing a further @len-@start elements. */ ++#define DEFINE_FIND_UNORDERED(type) \ ++ static gsize \ ++ find_unordered_##type (const guint8 *data, gsize start, gsize len) \ ++ { \ ++ gsize off; \ ++ type current, previous; \ ++ \ ++ memcpy (&previous, data + start * sizeof (current), sizeof (current)); \ ++ for (off = (start + 1) * sizeof (current); off < len * sizeof (current); off += sizeof (current)) \ ++ { \ ++ memcpy (¤t, data + off, sizeof (current)); \ ++ if (current < previous) \ ++ break; \ ++ previous = current; \ ++ } \ ++ return off / sizeof (current) - 1; \ ++ } ++ ++DEFINE_FIND_UNORDERED (guint8); ++DEFINE_FIND_UNORDERED (guint16); ++DEFINE_FIND_UNORDERED (guint32); ++DEFINE_FIND_UNORDERED (guint64); ++ + static GVariantSerialised + gvs_variable_sized_array_get_child (GVariantSerialised value, + gsize index_) +@@ -706,6 +737,49 @@ gvs_variable_sized_array_get_child (GVariantSerialised value, + g_variant_type_info_ref (child.type_info); + child.depth = value.depth + 1; + ++ /* If the requested @index_ is beyond the set of indices whose framing offsets ++ * have been checked, check the remaining offsets to see whether they’re ++ * normal (in order, no overlapping array elements). */ ++ if (index_ > value.ordered_offsets_up_to) ++ { ++ switch (offsets.offset_size) ++ { ++ case 1: ++ { ++ value.ordered_offsets_up_to = find_unordered_guint8 ( ++ offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ break; ++ } ++ case 2: ++ { ++ value.ordered_offsets_up_to = find_unordered_guint16 ( ++ offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ break; ++ } ++ case 4: ++ { ++ value.ordered_offsets_up_to = find_unordered_guint32 ( ++ offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ break; ++ } ++ case 8: ++ { ++ value.ordered_offsets_up_to = find_unordered_guint64 ( ++ offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ break; ++ } ++ default: ++ /* gvs_get_offset_size() only returns maximum 8 */ ++ g_assert_not_reached (); ++ } ++ } ++ ++ if (index_ > value.ordered_offsets_up_to) ++ { ++ /* Offsets are invalid somewhere, so return an empty child. */ ++ return child; ++ } ++ + if (index_ > 0) + { + guint alignment; +@@ -840,6 +914,9 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + + g_assert (offset == offsets.data_size); + ++ /* All offsets have now been checked. */ ++ value.ordered_offsets_up_to = G_MAXSIZE; ++ + return TRUE; + } + +@@ -1072,7 +1149,7 @@ gvs_tuple_is_normal (GVariantSerialised value) + for (i = 0; i < length; i++) + { + const GVariantMemberInfo *member_info; +- GVariantSerialised child; ++ GVariantSerialised child = { 0, }; + gsize fixed_size; + guint alignment; + gsize end; +@@ -1132,6 +1209,9 @@ gvs_tuple_is_normal (GVariantSerialised value) + offset = end; + } + ++ /* All element bounds have been checked above. */ ++ value.ordered_offsets_up_to = G_MAXSIZE; ++ + { + gsize fixed_size; + guint alignment; +diff --git a/glib/gvariant-serialiser.h b/glib/gvariant-serialiser.h +index 81343e9..bc63600 100644 +--- a/glib/gvariant-serialiser.h ++++ b/glib/gvariant-serialiser.h +@@ -29,6 +29,15 @@ typedef struct + guchar *data; + gsize size; + gsize depth; /* same semantics as GVariant.depth */ ++ ++ /* If ordered_offsets_up_to == n this means that all the frame offsets up to and ++ * including the frame offset determining the end of element n are in order. ++ * This guarantees that the bytes of element n don't overlap with any previous ++ * element. ++ * ++ * This is both read and set by g_variant_serialised_get_child for arrays of ++ * non-fixed-width types */ ++ gsize ordered_offsets_up_to; + } GVariantSerialised; + + /* deserialisation */ +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 2224f21..ec426e1 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -1,5 +1,6 @@ + /* + * Copyright © 2010 Codethink Limited ++ * Copyright © 2020 William Manley + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -1283,6 +1284,7 @@ random_instance_filler (GVariantSerialised *serialised, + serialised->size = instance->size; + + serialised->depth = 0; ++ serialised->ordered_offsets_up_to = 0; + + g_assert_true (serialised->type_info == instance->type_info); + g_assert_cmpuint (serialised->size, ==, instance->size); +@@ -5145,6 +5147,47 @@ test_normal_checking_array_offsets (void) + g_variant_unref (variant); + } + ++/* This is a regression test that we can't have non-normal values that take up ++ * significantly more space than the normal equivalent, by specifying the ++ * offset table entries so that array elements overlap. ++ * ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2121#note_832242 */ ++static void ++test_normal_checking_array_offsets2 (void) ++{ ++ const guint8 data[] = { ++ 'h', 'i', '\0', ++ 0x03, 0x00, 0x03, ++ 0x06, 0x00, 0x06, ++ 0x09, 0x00, 0x09, ++ 0x0c, 0x00, 0x0c, ++ 0x0f, 0x00, 0x0f, ++ 0x12, 0x00, 0x12, ++ 0x15, 0x00, 0x15, ++ }; ++ gsize size = sizeof (data); ++ const GVariantType *aaaaaaas = G_VARIANT_TYPE ("aaaaaaas"); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected = NULL; ++ ++ variant = g_variant_new_from_data (aaaaaaas, data, size, FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ g_assert_cmpuint (g_variant_get_size (normal_variant), <=, size * 2); ++ ++ expected = g_variant_new_parsed ( ++ "[[[[[[['hi', '', ''], [], []], [], []], [], []], [], []], [], []], [], []]"); ++ g_assert_cmpvariant (expected, variant); ++ g_assert_cmpvariant (expected, normal_variant); ++ ++ g_variant_unref (expected); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ + /* Test that a tuple with invalidly large values in its offset table is + * normalised successfully without looping infinitely. */ + static void +@@ -5314,6 +5357,8 @@ main (int argc, char **argv) + test_normal_checking_tuples); + g_test_add_func ("/gvariant/normal-checking/array-offsets", + test_normal_checking_array_offsets); ++ g_test_add_func ("/gvariant/normal-checking/array-offsets2", ++ test_normal_checking_array_offsets2); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets", + test_normal_checking_tuple_offsets); + g_test_add_func ("/gvariant/normal-checking/empty-object-path", diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch glib2.0-2.66.8/debian/patches/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch --- glib2.0-2.66.8/debian/patches/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,78 @@ +From: Philip Withnall +Date: Thu, 29 Dec 2022 17:38:04 +0000 +Subject: gvariant: Factor out some common calls to + g_variant_get_type_string() + +When printing a `GVariant`. + +This introduces no functional changes, but should speed things up a +little bit when printing out arrays. + +Signed-off-by: Philip Withnall +Origin: upstream, 2.74.5, commit:f068347b1419213be20e3647f5d4f1d505bdcba4 +--- + glib/gvariant.c | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index dc9d696..17a75d0 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -2213,15 +2213,16 @@ g_variant_print_string (GVariant *value, + GString *string, + gboolean type_annotate) + { ++ const gchar *value_type_string = g_variant_get_type_string (value); ++ + if G_UNLIKELY (string == NULL) + string = g_string_new (NULL); + +- switch (g_variant_classify (value)) ++ switch (value_type_string[0]) + { + case G_VARIANT_CLASS_MAYBE: + if (type_annotate) +- g_string_append_printf (string, "@%s ", +- g_variant_get_type_string (value)); ++ g_string_append_printf (string, "@%s ", value_type_string); + + if (g_variant_n_children (value)) + { +@@ -2265,7 +2266,7 @@ g_variant_print_string (GVariant *value, + * if the first two characters are 'ay' then it's a bytestring. + * under certain conditions we print those as strings. + */ +- if (g_variant_get_type_string (value)[1] == 'y') ++ if (value_type_string[1] == 'y') + { + const gchar *str; + gsize size; +@@ -2307,7 +2308,7 @@ g_variant_print_string (GVariant *value, + * dictionary entries (ie: a dictionary) so we print that + * differently. + */ +- if (g_variant_get_type_string (value)[1] == '{') ++ if (value_type_string[1] == '{') + /* dictionary */ + { + const gchar *comma = ""; +@@ -2316,8 +2317,7 @@ g_variant_print_string (GVariant *value, + if ((n = g_variant_n_children (value)) == 0) + { + if (type_annotate) +- g_string_append_printf (string, "@%s ", +- g_variant_get_type_string (value)); ++ g_string_append_printf (string, "@%s ", value_type_string); + g_string_append (string, "{}"); + break; + } +@@ -2353,8 +2353,7 @@ g_variant_print_string (GVariant *value, + if ((n = g_variant_n_children (value)) == 0) + { + if (type_annotate) +- g_string_append_printf (string, "@%s ", +- g_variant_get_type_string (value)); ++ g_string_append_printf (string, "@%s ", value_type_string); + g_string_append (string, "[]"); + break; + } diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Factor-out-type-check.patch glib2.0-2.66.8/debian/patches/gvariant-Factor-out-type-check.patch --- glib2.0-2.66.8/debian/patches/gvariant-Factor-out-type-check.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Factor-out-type-check.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,34 @@ +From: Philip Withnall +Date: Tue, 10 May 2022 16:29:22 +0100 +Subject: gvariant: Factor out type check + +This will help static analysers, similarly to with the previous commit. + +This introduces no functional changes. + +Signed-off-by: Philip Withnall +Origin: upstream, 2.73.0, commit:e0fe616dbc45ebf5270e788b3b344d04a1157a70 +--- + glib/gvariant.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 917b7c6..773a76c 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -801,12 +801,13 @@ g_variant_new_array (const GVariantType *child_type, + + for (i = 0; i < n_children; i++) + { +- if G_UNLIKELY (!g_variant_is_of_type (children[i], child_type)) ++ gboolean is_of_child_type = g_variant_is_of_type (children[i], child_type); ++ if G_UNLIKELY (!is_of_child_type) + { + while (i != 0) + g_variant_unref (my_children[--i]); + g_free (my_children); +- g_return_val_if_fail (g_variant_is_of_type (children[i], child_type), NULL); ++ g_return_val_if_fail (is_of_child_type, NULL); + } + my_children[i] = g_variant_ref_sink (children[i]); + trusted &= g_variant_is_trusted (children[i]); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch glib2.0-2.66.8/debian/patches/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch --- glib2.0-2.66.8/debian/patches/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,22 @@ +From: Philip Withnall +Date: Tue, 25 Oct 2022 18:03:56 +0100 +Subject: gvariant: Fix a leak of a GVariantTypeInfo on an error handling path + +Signed-off-by: Philip Withnall +Origin: upstream, 2.74.4, commit:935f1c200789c76ad5b51b1f403f611e3cc75318 +--- + glib/gvariant-core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 4d604c4..769c3c9 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1181,6 +1181,7 @@ g_variant_get_child_value (GVariant *value, + G_VARIANT_MAX_RECURSION_DEPTH - value->depth) + { + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE_VARIANT)); ++ g_variant_type_info_unref (s_child.type_info); + return g_variant_new_tuple (NULL, 0); + } + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch glib2.0-2.66.8/debian/patches/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch --- glib2.0-2.66.8/debian/patches/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,92 @@ +From: Philip Withnall +Date: Thu, 27 Oct 2022 16:13:54 +0100 +Subject: gvariant: Fix g_variant_byteswap() returning non-normal data + sometimes +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +If `g_variant_byteswap()` was called on a non-normal variant of a type +which doesn’t need byteswapping, it would return a non-normal output. + +That contradicts the documentation, which says that the return value is +always in normal form. + +Fix the code so it matches the documentation. + +Includes a unit test. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2797 +Origin: upstream, 2.74.4, commit:781f05a22ef11d8a2177b4e9078978decec36dd0 +--- + glib/gvariant.c | 8 +++++--- + glib/tests/gvariant.c | 24 ++++++++++++++++++++++++ + 2 files changed, 29 insertions(+), 3 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 92f6abd..d1764f7 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -6083,14 +6083,16 @@ g_variant_byteswap (GVariant *value) + g_variant_serialised_byteswap (serialised); + + bytes = g_bytes_new_take (serialised.data, serialised.size); +- new = g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE); ++ new = g_variant_ref_sink (g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE)); + g_bytes_unref (bytes); + } + else + /* contains no multi-byte data */ +- new = value; ++ new = g_variant_get_normal_form (value); + +- return g_variant_ref_sink (new); ++ g_assert (g_variant_is_trusted (new)); ++ ++ return g_steal_pointer (&new); + } + + /** +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 0c86fb4..0442b0a 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -3840,6 +3840,29 @@ test_gv_byteswap (void) + g_free (string); + } + ++static void ++test_gv_byteswap_non_normal_non_aligned (void) ++{ ++ const guint8 data[] = { 0x02 }; ++ GVariant *v = NULL; ++ GVariant *v_byteswapped = NULL; ++ ++ g_test_summary ("Test that calling g_variant_byteswap() on a variant which " ++ "is in non-normal form and doesn’t need byteswapping returns " ++ "the same variant in normal form."); ++ ++ v = g_variant_new_from_data (G_VARIANT_TYPE_BOOLEAN, data, sizeof (data), FALSE, NULL, NULL); ++ g_assert_false (g_variant_is_normal_form (v)); ++ ++ v_byteswapped = g_variant_byteswap (v); ++ g_assert_true (g_variant_is_normal_form (v_byteswapped)); ++ ++ g_assert_cmpvariant (v, v_byteswapped); ++ ++ g_variant_unref (v); ++ g_variant_unref (v_byteswapped); ++} ++ + static void + test_parser (void) + { +@@ -5714,6 +5737,7 @@ main (int argc, char **argv) + g_test_add_func ("/gvariant/builder-memory", test_builder_memory); + g_test_add_func ("/gvariant/hashing", test_hashing); + g_test_add_func ("/gvariant/byteswap", test_gv_byteswap); ++ g_test_add_func ("/gvariant/byteswap/non-normal-non-aligned", test_gv_byteswap_non_normal_non_aligned); + g_test_add_func ("/gvariant/parser", test_parses); + g_test_add_func ("/gvariant/parser/integer-bounds", test_parser_integer_bounds); + g_test_add_func ("/gvariant/parser/recursion", test_parser_recursion); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch glib2.0-2.66.8/debian/patches/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch --- glib2.0-2.66.8/debian/patches/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,28 @@ +From: Egor Bychin +Date: Mon, 11 Oct 2021 14:20:26 +0300 +Subject: gvariant: Fix memory leak on a TYPE_CHECK failure + +Origin: upstream, 2.71.0, commit:05dffc1a7f562e9c8c6c21b67f99204f7a7b4e27 +--- + glib/gvariant.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index bf2c406..199a433 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -801,7 +801,13 @@ g_variant_new_array (const GVariantType *child_type, + + for (i = 0; i < n_children; i++) + { +- TYPE_CHECK (children[i], child_type, NULL); ++ if G_UNLIKELY (!g_variant_is_of_type (children[i], child_type)) ++ { ++ while (i != 0) ++ g_variant_unref (my_children[--i]); ++ g_free (my_children); ++ g_return_val_if_fail (g_variant_is_of_type (children[i], child_type), NULL); ++ } + my_children[i] = g_variant_ref_sink (children[i]); + trusted &= g_variant_is_trusted (children[i]); + } diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch glib2.0-2.66.8/debian/patches/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch --- glib2.0-2.66.8/debian/patches/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,55 @@ +From: Egor Bychin +Date: Mon, 11 Oct 2021 14:24:12 +0300 +Subject: gvariant: Fix pointers being dereferenced despite NULL checks + +Origin: upstream, 2.71.0, commit:7f6ce4d8d234996b523b71abef139f1c80c88254 +--- + glib/gvariant.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 199a433..f8c1001 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -3197,8 +3197,7 @@ struct heap_builder + #define GVSB_MAGIC ((gsize) 1033660112u) + #define GVSB_MAGIC_PARTIAL ((gsize) 2942751021u) + #define GVHB_MAGIC ((gsize) 3087242682u) +-#define is_valid_builder(b) (b != NULL && \ +- GVSB(b)->magic == GVSB_MAGIC) ++#define is_valid_builder(b) (GVSB(b)->magic == GVSB_MAGIC) + #define is_valid_heap_builder(b) (GVHB(b)->magic == GVHB_MAGIC) + + /* Just to make sure that by adding a union to GVariantBuilder, we +@@ -3208,7 +3207,9 @@ G_STATIC_ASSERT (sizeof (GVariantBuilder) == sizeof (gsize[16])); + static gboolean + ensure_valid_builder (GVariantBuilder *builder) + { +- if (is_valid_builder (builder)) ++ if (builder == NULL) ++ return FALSE; ++ else if (is_valid_builder (builder)) + return TRUE; + if (builder->u.s.partial_magic == GVSB_MAGIC_PARTIAL) + { +@@ -3854,8 +3855,7 @@ struct heap_dict + #define GVSD_MAGIC ((gsize) 2579507750u) + #define GVSD_MAGIC_PARTIAL ((gsize) 3488698669u) + #define GVHD_MAGIC ((gsize) 2450270775u) +-#define is_valid_dict(d) (d != NULL && \ +- GVSD(d)->magic == GVSD_MAGIC) ++#define is_valid_dict(d) (GVSD(d)->magic == GVSD_MAGIC) + #define is_valid_heap_dict(d) (GVHD(d)->magic == GVHD_MAGIC) + + /* Just to make sure that by adding a union to GVariantDict, we didn't +@@ -3865,7 +3865,9 @@ G_STATIC_ASSERT (sizeof (GVariantDict) == sizeof (gsize[16])); + static gboolean + ensure_valid_dict (GVariantDict *dict) + { +- if (is_valid_dict (dict)) ++ if (dict == NULL) ++ return FALSE; ++ else if (is_valid_dict (dict)) + return TRUE; + if (dict->u.s.partial_magic == GVSD_MAGIC_PARTIAL) + { diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Optimise-g_variant_print-for-nested-maybes.patch glib2.0-2.66.8/debian/patches/gvariant-Optimise-g_variant_print-for-nested-maybes.patch --- glib2.0-2.66.8/debian/patches/gvariant-Optimise-g_variant_print-for-nested-maybes.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Optimise-g_variant_print-for-nested-maybes.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,84 @@ +From: Philip Withnall +Date: Thu, 29 Dec 2022 18:42:44 +0000 +Subject: gvariant: Optimise g_variant_print() for nested maybes + +As with commit 9ae59bd647882bcb33103331255a5149d2fb90d2, deeply nested +maybes in an array can be exploited by a malicious caller to cause a +geometric increase in processing time and number of `GVariant` instances +handled by the `g_variant_print()` code. + +Optimise this by skipping recursing through most of the chain of maybes, +thus avoiding all the setup checks in each recursive call. + +Signed-off-by: Philip Withnall +Bug-oss-fuzz: #54577 +Origin: upstream, 2.74.5, commit:53702d68c4ee7b939a725ec4a5d707a2bdead1e9 +--- + glib/gvariant.c | 46 ++++++++++++++++++++++++++++++++-------------- + 1 file changed, 32 insertions(+), 14 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 17a75d0..4c4fd61 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -2226,8 +2226,9 @@ g_variant_print_string (GVariant *value, + + if (g_variant_n_children (value)) + { +- gchar *printed_child; +- GVariant *element; ++ const GVariantType *base_type; ++ guint i, depth; ++ GVariant *element = NULL; + + /* Nested maybes: + * +@@ -2241,19 +2242,36 @@ g_variant_print_string (GVariant *value, + * "just" is actually exactly the case where we have a nested + * Nothing. + * +- * Instead of searching for that nested Nothing, we just print +- * the contained value into a separate string and see if we +- * end up with "nothing" at the end of it. If so, we need to +- * add "just" at our level. ++ * Search for the nested Nothing, to save a lot of recursion if there ++ * are multiple levels of maybes. + */ +- element = g_variant_get_child_value (value, 0); +- printed_child = g_variant_print (element, FALSE); +- g_variant_unref (element); +- +- if (g_str_has_suffix (printed_child, "nothing")) +- g_string_append (string, "just "); +- g_string_append (string, printed_child); +- g_free (printed_child); ++ for (depth = 0, base_type = g_variant_get_type (value); ++ g_variant_type_is_maybe (base_type); ++ depth++, base_type = g_variant_type_element (base_type)); ++ ++ element = g_variant_ref (value); ++ for (i = 0; i < depth && element != NULL; i++) ++ { ++ GVariant *new_element = g_variant_n_children (element) ? g_variant_get_child_value (element, 0) : NULL; ++ g_variant_unref (element); ++ element = g_steal_pointer (&new_element); ++ } ++ ++ if (element == NULL) ++ { ++ /* One of the maybes was Nothing, so print out the right number of ++ * justs. */ ++ for (; i > 1; i--) ++ g_string_append (string, "just "); ++ g_string_append (string, "nothing"); ++ } ++ else ++ { ++ /* There are no Nothings, so print out the child with no prefixes. */ ++ g_variant_print_string (element, string, FALSE); ++ } ++ ++ g_clear_pointer (&element, g_variant_unref); + } + else + g_string_append (string, "nothing"); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch glib2.0-2.66.8/debian/patches/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch --- glib2.0-2.66.8/debian/patches/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,41 @@ +From: Philip Withnall +Date: Mon, 24 Oct 2022 18:43:55 +0100 +Subject: gvariant: Port g_variant_deep_copy() to count its iterations + directly + +This is equivalent to what `GVariantIter` does, but it means that +`g_variant_deep_copy()` is making its own `g_variant_get_child_value()` +calls. + +This will be useful in an upcoming commit, where those child values will +be inspected a little more deeply. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:b0ccb1616688290088e49dea2dc0d7fe723136e4 +--- + glib/gvariant.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index cb1685f..4566cd1 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -5863,14 +5863,13 @@ g_variant_deep_copy (GVariant *value) + case G_VARIANT_CLASS_VARIANT: + { + GVariantBuilder builder; +- GVariantIter iter; +- GVariant *child; ++ gsize i, n_children; + + g_variant_builder_init (&builder, g_variant_get_type (value)); +- g_variant_iter_init (&iter, value); + +- while ((child = g_variant_iter_next_value (&iter))) ++ for (i = 0, n_children = g_variant_n_children (value); i < n_children; i++) + { ++ GVariant *child = g_variant_get_child_value (value, i); + g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); + g_variant_unref (child); + } diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch glib2.0-2.66.8/debian/patches/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch --- glib2.0-2.66.8/debian/patches/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,41 @@ +From: Philip Withnall +Date: Thu, 15 Dec 2022 16:49:28 +0000 +Subject: gvariant: Propagate trust when getting a child of a serialised + variant + +If a variant is trusted, that means all its children are trusted, so +ensure that their checked offsets are set as such. + +This allows a lot of the offset table checks to be avoided when getting +children from trusted serialised tuples, which speeds things up. + +No unit test is included because this is just a performance fix. If +there are other slownesses, or regressions, in serialised `GVariant` +performance, the fuzzing setup will catch them like it did this one. + +This change does reduce the time to run the oss-fuzz reproducer from 80s +to about 0.7s on my machine. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2841 +Bug-oss-fuzz: #54314 +Origin: upstream, 2.74.4, commit:4d0bed8c4690f7a2692474ef6a570bd99ef45ef1 +--- + glib/gvariant-core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 769c3c9..8e42938 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1196,8 +1196,8 @@ g_variant_get_child_value (GVariant *value, + child->contents.serialised.bytes = + g_bytes_ref (value->contents.serialised.bytes); + child->contents.serialised.data = s_child.data; +- child->contents.serialised.ordered_offsets_up_to = s_child.ordered_offsets_up_to; +- child->contents.serialised.checked_offsets_up_to = s_child.checked_offsets_up_to; ++ child->contents.serialised.ordered_offsets_up_to = (value->state & STATE_TRUSTED) ? G_MAXSIZE : s_child.ordered_offsets_up_to; ++ child->contents.serialised.checked_offsets_up_to = (value->state & STATE_TRUSTED) ? G_MAXSIZE : s_child.checked_offsets_up_to; + + return child; + } diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Remove-redundant-g_variant_serialised_n_children.patch glib2.0-2.66.8/debian/patches/gvariant-Remove-redundant-g_variant_serialised_n_children.patch --- glib2.0-2.66.8/debian/patches/gvariant-Remove-redundant-g_variant_serialised_n_children.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Remove-redundant-g_variant_serialised_n_children.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,57 @@ +From: Philip Withnall +Date: Thu, 29 Dec 2022 18:53:35 +0000 +Subject: gvariant: Remove redundant g_variant_serialised_n_children() calls +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +These functions were previously calling +`g_variant_serialised_n_children()` twice just to validate the input, in +the case that the input was a serialised variant. + +That’s not necessary, and checking the number of children in a +serialised variant is not necessarily cheap. + +Move the checks around so that the number of children is only checked +once on each code path. This doesn’t introduce any functional changes. + +Signed-off-by: Philip Withnall +Origin: upstream, 2.74.5, commit:8373f328bd1e996a1521eed3f962af873cfa14a0 +--- + glib/gvariant-core.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 8e42938..02a8d30 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -1136,11 +1136,13 @@ GVariant * + g_variant_get_child_value (GVariant *value, + gsize index_) + { +- g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); + g_return_val_if_fail (value->depth < G_MAXSIZE, NULL); + + if (~g_atomic_int_get (&value->state) & STATE_SERIALISED) + { ++ /* g_variant_serialised_get_child() does its own checks on index_ */ ++ g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); ++ + g_variant_lock (value); + + if (~value->state & STATE_SERIALISED) +@@ -1229,11 +1231,13 @@ GVariant * + g_variant_maybe_get_child_value (GVariant *value, + gsize index_) + { +- g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); + g_return_val_if_fail (value->depth < G_MAXSIZE, NULL); + + if (~g_atomic_int_get (&value->state) & STATE_SERIALISED) + { ++ /* g_variant_serialised_get_child() does its own checks on index_ */ ++ g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); ++ + g_variant_lock (value); + + if (~value->state & STATE_SERIALISED) diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch glib2.0-2.66.8/debian/patches/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch --- glib2.0-2.66.8/debian/patches/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,37 @@ +From: Philip Withnall +Date: Thu, 29 Dec 2022 18:54:53 +0000 +Subject: gvariant: Remove some unnecessary type assertions on a hot path +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +While checking the validity of a `GVariantTypeInfo` is good, this code +path is very hot, and I’ve never seen these assertions catch a bug in +practice. + +Lean more towards the performance side of the performance/correctness +tradeoff in this case, by removing the assertions here. + +They remain in place in a number of other `GVariantTypeInfo` code paths, +so invalid `GVariantTypeInfo` pointers should hopefully still be caught +quickly. + +Signed-off-by: Philip Withnall +Origin: upstream, 2.74.5, commit:ab8cdb07dece52f0226a1d0346157b6f172ed1ba +--- + glib/gvarianttypeinfo.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/glib/gvarianttypeinfo.c b/glib/gvarianttypeinfo.c +index 087294a..4658273 100644 +--- a/glib/gvarianttypeinfo.c ++++ b/glib/gvarianttypeinfo.c +@@ -245,8 +245,6 @@ g_variant_type_info_query (GVariantTypeInfo *info, + guint *alignment, + gsize *fixed_size) + { +- g_variant_type_info_check (info, 0); +- + if (alignment) + *alignment = info->alignment; + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Track-checked-and-ordered-offsets-independently.patch glib2.0-2.66.8/debian/patches/gvariant-Track-checked-and-ordered-offsets-independently.patch --- glib2.0-2.66.8/debian/patches/gvariant-Track-checked-and-ordered-offsets-independently.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Track-checked-and-ordered-offsets-independently.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,386 @@ +From: Philip Withnall +Date: Tue, 25 Oct 2022 15:14:14 +0100 +Subject: gvariant: Track checked and ordered offsets independently + +The past few commits introduced the concept of known-good offsets in the +offset table (which is used for variable-width arrays and tuples). +Good offsets are ones which are non-overlapping with all the previous +offsets in the table. + +If a bad offset is encountered when indexing into the array or tuple, +the cached known-good offset index will not be increased. In this way, +all child variants at and beyond the first bad offset can be returned as +default values rather than dereferencing potentially invalid data. + +In this case, there was no information about the fact that the indexes +between the highest known-good index and the requested one had been +checked already. That could lead to a pathological case where an offset +table with an invalid first offset is repeatedly checked in full when +trying to access higher-indexed children. + +Avoid that by storing the index of the highest checked offset in the +table, as well as the index of the highest good/ordered offset. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:a6cb880af0a0932493ba096f01990e694e2c5b72 +--- + glib/gvariant-core.c | 28 ++++++++++++++++++++++++++++ + glib/gvariant-serialiser.c | 44 ++++++++++++++++++++++++++++++++------------ + glib/gvariant-serialiser.h | 9 +++++++++ + glib/gvariant.c | 1 + + glib/tests/gvariant.c | 5 +++++ + 5 files changed, 75 insertions(+), 12 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index 9b268d9..f0f2c62 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -67,6 +67,7 @@ struct _GVariant + GBytes *bytes; + gconstpointer data; + gsize ordered_offsets_up_to; ++ gsize checked_offsets_up_to; + } serialised; + + struct +@@ -182,6 +183,24 @@ struct _GVariant + * This field is only relevant for arrays of non + * fixed width types and for tuples. + * ++ * .checked_offsets_up_to: Similarly to .ordered_offsets_up_to, this stores ++ * the index of the highest element, n, whose frame ++ * offsets (and all the preceding frame offsets) ++ * have been checked for validity. ++ * ++ * It is always the case that ++ * .checked_offsets_up_to ≥ .ordered_offsets_up_to. ++ * ++ * If .checked_offsets_up_to == .ordered_offsets_up_to, ++ * then a bad offset has not been found so far. ++ * ++ * If .checked_offsets_up_to > .ordered_offsets_up_to, ++ * then a bad offset has been found at ++ * (.ordered_offsets_up_to + 1). ++ * ++ * This field is only relevant for arrays of non ++ * fixed width types and for tuples. ++ * + * .tree: Only valid when the instance is in tree form. + * + * Note that accesses from other threads could result in +@@ -386,6 +405,7 @@ g_variant_to_serialised (GVariant *value) + value->size, + value->depth, + value->contents.serialised.ordered_offsets_up_to, ++ value->contents.serialised.checked_offsets_up_to, + }; + return serialised; + } +@@ -418,6 +438,7 @@ g_variant_serialise (GVariant *value, + serialised.data = data; + serialised.depth = value->depth; + serialised.ordered_offsets_up_to = 0; ++ serialised.checked_offsets_up_to = 0; + + children = (gpointer *) value->contents.tree.children; + n_children = value->contents.tree.n_children; +@@ -464,10 +485,12 @@ g_variant_fill_gvs (GVariantSerialised *serialised, + if (value->state & STATE_SERIALISED) + { + serialised->ordered_offsets_up_to = value->contents.serialised.ordered_offsets_up_to; ++ serialised->checked_offsets_up_to = value->contents.serialised.checked_offsets_up_to; + } + else + { + serialised->ordered_offsets_up_to = 0; ++ serialised->checked_offsets_up_to = 0; + } + + if (serialised->data) +@@ -513,6 +536,7 @@ g_variant_ensure_serialised (GVariant *value) + value->contents.serialised.data = g_bytes_get_data (bytes, NULL); + value->contents.serialised.bytes = bytes; + value->contents.serialised.ordered_offsets_up_to = G_MAXSIZE; ++ value->contents.serialised.checked_offsets_up_to = G_MAXSIZE; + value->state |= STATE_SERIALISED; + } + } +@@ -594,6 +618,7 @@ g_variant_new_from_bytes (const GVariantType *type, + serialised.data = (guchar *) g_bytes_get_data (bytes, &serialised.size); + serialised.depth = 0; + serialised.ordered_offsets_up_to = trusted ? G_MAXSIZE : 0; ++ serialised.checked_offsets_up_to = trusted ? G_MAXSIZE : 0; + + if (!g_variant_serialised_check (serialised)) + { +@@ -645,6 +670,7 @@ g_variant_new_from_bytes (const GVariantType *type, + } + + value->contents.serialised.ordered_offsets_up_to = trusted ? G_MAXSIZE : 0; ++ value->contents.serialised.checked_offsets_up_to = trusted ? G_MAXSIZE : 0; + + g_clear_pointer (&owned_bytes, g_bytes_unref); + +@@ -1142,6 +1168,7 @@ g_variant_get_child_value (GVariant *value, + + /* Update the cached ordered_offsets_up_to, since @serialised will be thrown away when this function exits */ + value->contents.serialised.ordered_offsets_up_to = MAX (value->contents.serialised.ordered_offsets_up_to, serialised.ordered_offsets_up_to); ++ value->contents.serialised.checked_offsets_up_to = MAX (value->contents.serialised.checked_offsets_up_to, serialised.checked_offsets_up_to); + + /* Check whether this would cause nesting too deep. If so, return a fake + * child. The only situation we expect this to happen in is with a variant, +@@ -1169,6 +1196,7 @@ g_variant_get_child_value (GVariant *value, + g_bytes_ref (value->contents.serialised.bytes); + child->contents.serialised.data = s_child.data; + child->contents.serialised.ordered_offsets_up_to = s_child.ordered_offsets_up_to; ++ child->contents.serialised.checked_offsets_up_to = s_child.checked_offsets_up_to; + + return child; + } +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 812e0d9..88ba72a 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -120,6 +120,8 @@ + * + * @depth has no restrictions; the depth of a top-level serialised #GVariant is + * zero, and it increases for each level of nested child. ++ * ++ * @checked_offsets_up_to is always ≥ @ordered_offsets_up_to + */ + + /* < private > +@@ -147,6 +149,9 @@ g_variant_serialised_check (GVariantSerialised serialised) + !(serialised.size == 0 || serialised.data != NULL)) + return FALSE; + ++ if (serialised.ordered_offsets_up_to > serialised.checked_offsets_up_to) ++ return FALSE; ++ + /* Depending on the native alignment requirements of the machine, the + * compiler will insert either 3 or 7 padding bytes after the char. + * This will result in the sizeof() the struct being 12 or 16. +@@ -266,6 +271,7 @@ gvs_fixed_sized_maybe_get_child (GVariantSerialised value, + g_variant_type_info_ref (value.type_info); + value.depth++; + value.ordered_offsets_up_to = 0; ++ value.checked_offsets_up_to = 0; + + return value; + } +@@ -297,7 +303,7 @@ gvs_fixed_sized_maybe_serialise (GVariantSerialised value, + { + if (n_children) + { +- GVariantSerialised child = { NULL, value.data, value.size, value.depth + 1, 0 }; ++ GVariantSerialised child = { NULL, value.data, value.size, value.depth + 1, 0, 0 }; + + gvs_filler (&child, children[0]); + } +@@ -320,6 +326,7 @@ gvs_fixed_sized_maybe_is_normal (GVariantSerialised value) + value.type_info = g_variant_type_info_element (value.type_info); + value.depth++; + value.ordered_offsets_up_to = 0; ++ value.checked_offsets_up_to = 0; + + return g_variant_serialised_is_normal (value); + } +@@ -362,6 +369,7 @@ gvs_variable_sized_maybe_get_child (GVariantSerialised value, + + value.depth++; + value.ordered_offsets_up_to = 0; ++ value.checked_offsets_up_to = 0; + + return value; + } +@@ -392,7 +400,7 @@ gvs_variable_sized_maybe_serialise (GVariantSerialised value, + { + if (n_children) + { +- GVariantSerialised child = { NULL, value.data, value.size - 1, value.depth + 1, 0 }; ++ GVariantSerialised child = { NULL, value.data, value.size - 1, value.depth + 1, 0, 0 }; + + /* write the data for the child. */ + gvs_filler (&child, children[0]); +@@ -413,6 +421,7 @@ gvs_variable_sized_maybe_is_normal (GVariantSerialised value) + value.size--; + value.depth++; + value.ordered_offsets_up_to = 0; ++ value.checked_offsets_up_to = 0; + + return g_variant_serialised_is_normal (value); + } +@@ -739,39 +748,46 @@ gvs_variable_sized_array_get_child (GVariantSerialised value, + + /* If the requested @index_ is beyond the set of indices whose framing offsets + * have been checked, check the remaining offsets to see whether they’re +- * normal (in order, no overlapping array elements). */ +- if (index_ > value.ordered_offsets_up_to) ++ * normal (in order, no overlapping array elements). ++ * ++ * Don’t bother checking if the highest known-good offset is lower than the ++ * highest checked offset, as that means there’s an invalid element at that ++ * index, so there’s no need to check further. */ ++ if (index_ > value.checked_offsets_up_to && ++ value.ordered_offsets_up_to == value.checked_offsets_up_to) + { + switch (offsets.offset_size) + { + case 1: + { + value.ordered_offsets_up_to = find_unordered_guint8 ( +- offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ offsets.array, value.checked_offsets_up_to, index_ + 1); + break; + } + case 2: + { + value.ordered_offsets_up_to = find_unordered_guint16 ( +- offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ offsets.array, value.checked_offsets_up_to, index_ + 1); + break; + } + case 4: + { + value.ordered_offsets_up_to = find_unordered_guint32 ( +- offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ offsets.array, value.checked_offsets_up_to, index_ + 1); + break; + } + case 8: + { + value.ordered_offsets_up_to = find_unordered_guint64 ( +- offsets.array, value.ordered_offsets_up_to, index_ + 1); ++ offsets.array, value.checked_offsets_up_to, index_ + 1); + break; + } + default: + /* gvs_get_offset_size() only returns maximum 8 */ + g_assert_not_reached (); + } ++ ++ value.checked_offsets_up_to = index_; + } + + if (index_ > value.ordered_offsets_up_to) +@@ -916,6 +932,7 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + + /* All offsets have now been checked. */ + value.ordered_offsets_up_to = G_MAXSIZE; ++ value.checked_offsets_up_to = G_MAXSIZE; + + return TRUE; + } +@@ -1040,14 +1057,15 @@ gvs_tuple_get_child (GVariantSerialised value, + * all the tuple *elements* here, not just all the framing offsets, since + * tuples contain a mix of elements which use framing offsets and ones which + * don’t. None of them are allowed to overlap. */ +- if (index_ > value.ordered_offsets_up_to) ++ if (index_ > value.checked_offsets_up_to && ++ value.ordered_offsets_up_to == value.checked_offsets_up_to) + { + gsize i, prev_i_end = 0; + +- if (value.ordered_offsets_up_to > 0) +- gvs_tuple_get_member_bounds (value, value.ordered_offsets_up_to - 1, offset_size, NULL, &prev_i_end); ++ if (value.checked_offsets_up_to > 0) ++ gvs_tuple_get_member_bounds (value, value.checked_offsets_up_to - 1, offset_size, NULL, &prev_i_end); + +- for (i = value.ordered_offsets_up_to; i <= index_; i++) ++ for (i = value.checked_offsets_up_to; i <= index_; i++) + { + gsize i_start, i_end; + +@@ -1060,6 +1078,7 @@ gvs_tuple_get_child (GVariantSerialised value, + } + + value.ordered_offsets_up_to = i - 1; ++ value.checked_offsets_up_to = index_; + } + + if (index_ > value.ordered_offsets_up_to) +@@ -1257,6 +1276,7 @@ gvs_tuple_is_normal (GVariantSerialised value) + + /* All element bounds have been checked above. */ + value.ordered_offsets_up_to = G_MAXSIZE; ++ value.checked_offsets_up_to = G_MAXSIZE; + + { + gsize fixed_size; +diff --git a/glib/gvariant-serialiser.h b/glib/gvariant-serialiser.h +index 765bd43..113df2c 100644 +--- a/glib/gvariant-serialiser.h ++++ b/glib/gvariant-serialiser.h +@@ -41,6 +41,15 @@ typedef struct + * Even when dealing with tuples, @ordered_offsets_up_to is an element index, + * rather than an index into the frame offsets. */ + gsize ordered_offsets_up_to; ++ ++ /* Similar to @ordered_offsets_up_to. This gives the index of the child element ++ * whose frame offset is the highest in the offset table which has been ++ * checked so far. ++ * ++ * This is always ≥ @ordered_offsets_up_to. It is always an element index. ++ * ++ * See documentation in gvariant-core.c for `struct GVariant` for details. */ ++ gsize checked_offsets_up_to; + } GVariantSerialised; + + /* deserialisation */ +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 54cb438..9dbbab7 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -6011,6 +6011,7 @@ g_variant_byteswap (GVariant *value) + serialised.data = g_malloc (serialised.size); + serialised.depth = g_variant_get_depth (trusted); + serialised.ordered_offsets_up_to = G_MAXSIZE; /* operating on the normal form */ ++ serialised.checked_offsets_up_to = G_MAXSIZE; + g_variant_store (trusted, serialised.data); + g_variant_unref (trusted); + +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index a3721ce..db53a88 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -1286,6 +1286,7 @@ random_instance_filler (GVariantSerialised *serialised, + + serialised->depth = 0; + serialised->ordered_offsets_up_to = 0; ++ serialised->checked_offsets_up_to = 0; + + g_assert_true (serialised->type_info == instance->type_info); + g_assert_cmpuint (serialised->size, ==, instance->size); +@@ -1453,6 +1454,7 @@ test_maybe (void) + serialised.size = needed_size; + serialised.depth = 0; + serialised.ordered_offsets_up_to = 0; ++ serialised.checked_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, + random_instance_filler, +@@ -1577,6 +1579,7 @@ test_array (void) + serialised.size = needed_size; + serialised.depth = 0; + serialised.ordered_offsets_up_to = 0; ++ serialised.checked_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); +@@ -1742,6 +1745,7 @@ test_tuple (void) + serialised.size = needed_size; + serialised.depth = 0; + serialised.ordered_offsets_up_to = 0; ++ serialised.checked_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); +@@ -1839,6 +1843,7 @@ test_variant (void) + serialised.size = needed_size; + serialised.depth = 0; + serialised.ordered_offsets_up_to = 0; ++ serialised.checked_offsets_up_to = 0; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) &instance, 1); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch --- glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,50 @@ +From: Philip Withnall +Date: Tue, 7 Jun 2022 11:08:14 +0100 +Subject: gvariant: Zero-initialise GVariantBuilder children under static + analysis +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +scan-build can’t link the types used in `g_variant_builder_init()` with +the (same) types used in `g_variant_builder_end()`, so ends up assuming +that the children have not been initialised. + +At runtime, this is prevented by the precondition checks on +`GVSB()->offset` in `g_variant_builder_end()`. scan-build doesn’t notice +that though. + +Avoid a scan-build warning by zero-initialising the children array when +running static analysis. Doing this unconditionally would be an +unnecessary performance hit. + +Signed-off-by: Philip Withnall +Origin: upstream, 2.73.1, commit:504727c31750bbd88e375011e5596e06a4b2694a +--- + glib/gvariant.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 773a76c..01c1e53 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -3483,8 +3483,19 @@ g_variant_builder_init (GVariantBuilder *builder, + g_assert_not_reached (); + } + ++#ifdef G_ANALYZER_ANALYZING ++ /* Static analysers can’t couple the code in g_variant_builder_init() to the ++ * code in g_variant_builder_end() by GVariantType, so end up assuming that ++ * @offset and @children mismatch and that uninitialised memory is accessed ++ * from @children. At runtime, this is caught by the preconditions at the top ++ * of g_variant_builder_end(). Help the analyser by zero-initialising the ++ * memory to avoid a false positive. */ ++ GVSB(builder)->children = g_new0 (GVariant *, ++ GVSB(builder)->allocated_children); ++#else + GVSB(builder)->children = g_new (GVariant *, + GVSB(builder)->allocated_children); ++#endif + } + + static void diff -Nru glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch --- glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-Zero-initialise-various-GVariantSerialised-objec.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,90 @@ +From: Philip Withnall +Date: Tue, 25 Oct 2022 18:05:52 +0100 +Subject: gvariant: Zero-initialise various GVariantSerialised objects + +The following few commits will add a couple of new fields to +`GVariantSerialised`, and they should be zero-filled by default. + +Try and pre-empt that a bit by zero-filling `GVariantSerialised` by +default in a few places. + +Signed-off-by: Philip Withnall + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:5c27f22aff636766fbc5e49927fd28213629e840 +--- + glib/gvariant.c | 2 +- + glib/tests/gvariant.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/glib/gvariant.c b/glib/gvariant.c +index 01c1e53..df7caa0 100644 +--- a/glib/gvariant.c ++++ b/glib/gvariant.c +@@ -6001,7 +6001,7 @@ g_variant_byteswap (GVariant *value) + if (alignment) + /* (potentially) contains multi-byte numeric data */ + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + GVariant *trusted; + GBytes *bytes; + +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 448f9a2..2224f21 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -1442,7 +1442,7 @@ test_maybe (void) + + for (flavour = 0; flavour < 8; flavour += alignment) + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + GVariantSerialised child; + + serialised.type_info = type_info; +@@ -1566,7 +1566,7 @@ test_array (void) + + for (flavour = 0; flavour < 8; flavour += alignment) + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + + serialised.type_info = array_info; + serialised.data = flavoured_malloc (needed_size, flavour); +@@ -1730,7 +1730,7 @@ test_tuple (void) + + for (flavour = 0; flavour < 8; flavour += alignment) + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + + serialised.type_info = type_info; + serialised.data = flavoured_malloc (needed_size, flavour); +@@ -1825,7 +1825,7 @@ test_variant (void) + + for (flavour = 0; flavour < 8; flavour += alignment) + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + GVariantSerialised child; + + serialised.type_info = type_info; +@@ -2272,7 +2272,7 @@ serialise_tree (TreeInstance *tree, + static void + test_byteswap (void) + { +- GVariantSerialised one, two; ++ GVariantSerialised one = { 0, }, two = { 0, }; + TreeInstance *tree; + + tree = tree_instance_new (NULL, 3); +@@ -2346,7 +2346,7 @@ test_serialiser_children (void) + static void + test_fuzz (gdouble *fuzziness) + { +- GVariantSerialised serialised; ++ GVariantSerialised serialised = { 0, }; + TreeInstance *tree; + + /* make an instance */ diff -Nru glib2.0-2.66.8/debian/patches/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch glib2.0-2.66.8/debian/patches/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch --- glib2.0-2.66.8/debian/patches/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-core-Consolidate-construction-of-GVariantSeriali.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,95 @@ +From: William Manley +Date: Tue, 23 Jun 2020 22:59:58 +0100 +Subject: gvariant-core: Consolidate construction of `GVariantSerialised` + +So I only need to change it in one place. + +This introduces no functional changes. + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:590f7a6b76b5a3695aa562c9c3ab244433b6624b +--- + glib/gvariant-core.c | 49 +++++++++++++++++++++++++------------------------ + 1 file changed, 25 insertions(+), 24 deletions(-) + +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index b34ba8d..cd6a887 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -349,6 +349,27 @@ g_variant_ensure_size (GVariant *value) + } + } + ++/* < private > ++ * g_variant_to_serialised: ++ * @value: a #GVariant ++ * ++ * Gets a GVariantSerialised for a GVariant in state STATE_SERIALISED. ++ */ ++inline static GVariantSerialised ++g_variant_to_serialised (GVariant *value) ++{ ++ g_assert (value->state & STATE_SERIALISED); ++ { ++ GVariantSerialised serialised = { ++ value->type_info, ++ (gpointer) value->contents.serialised.data, ++ value->size, ++ value->depth, ++ }; ++ return serialised; ++ } ++} ++ + /* < private > + * g_variant_serialise: + * @value: a #GVariant +@@ -1007,16 +1028,8 @@ g_variant_n_children (GVariant *value) + g_variant_lock (value); + + if (value->state & STATE_SERIALISED) +- { +- GVariantSerialised serialised = { +- value->type_info, +- (gpointer) value->contents.serialised.data, +- value->size, +- value->depth, +- }; +- +- n_children = g_variant_serialised_n_children (serialised); +- } ++ n_children = g_variant_serialised_n_children ( ++ g_variant_to_serialised (value)); + else + n_children = value->contents.tree.n_children; + +@@ -1083,12 +1096,7 @@ g_variant_get_child_value (GVariant *value, + } + + { +- GVariantSerialised serialised = { +- value->type_info, +- (gpointer) value->contents.serialised.data, +- value->size, +- value->depth, +- }; ++ GVariantSerialised serialised = g_variant_to_serialised (value); + GVariantSerialised s_child; + GVariant *child; + +@@ -1201,14 +1209,7 @@ g_variant_is_normal_form (GVariant *value) + + if (value->state & STATE_SERIALISED) + { +- GVariantSerialised serialised = { +- value->type_info, +- (gpointer) value->contents.serialised.data, +- value->size, +- value->depth +- }; +- +- if (g_variant_serialised_is_normal (serialised)) ++ if (g_variant_serialised_is_normal (g_variant_to_serialised (value))) + value->state |= STATE_TRUSTED; + } + else diff -Nru glib2.0-2.66.8/debian/patches/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch glib2.0-2.66.8/debian/patches/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch --- glib2.0-2.66.8/debian/patches/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,93 @@ +From: Philip Withnall +Date: Tue, 18 Oct 2022 12:43:22 +0100 +Subject: gvariant-parser: Reject deeply-nested typedecls in text form + variants + +Return `G_VARIANT_PARSE_ERROR_RECURSION` from `g_variant_parse()` if a +typedecl is found within a text-form variant which would cause any part +of the variant to exceed the maximum allowed recursion/nesting depth. + +This fixes an oversight when `G_VARIANT_MAX_RECURSION_DEPTH` was +implemented, which allowed typedecls to effectively multiply the size of +an array if `g_variant_parse()` was parsing a text-form variant without +a top-level concrete type specified. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2782 +Bug-oss-fuzz: #49462 +Origin: upstream, 2.74.1, commit:777606419d943be6568e823b29f2d6e6b98b60af +--- + glib/gvariant-parser.c | 10 ++++++++++ + glib/tests/gvariant.c | 31 +++++++++++++++++++++++++++++++ + 2 files changed, 41 insertions(+) + +diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c +index 1b89259..d8abd5d 100644 +--- a/glib/gvariant-parser.c ++++ b/glib/gvariant-parser.c +@@ -2229,6 +2229,16 @@ typedecl_parse (TokenStream *stream, + return NULL; + } + ++ if (g_variant_type_string_get_depth_ (token + 1) > max_depth) ++ { ++ token_stream_set_error (stream, error, TRUE, ++ G_VARIANT_PARSE_ERROR_RECURSION, ++ "type declaration recurses too deeply"); ++ g_free (token); ++ ++ return NULL; ++ } ++ + type = g_variant_type_new (token + 1); + + if (!g_variant_type_is_definite (type)) +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 3905e20..9c9fd35 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -4203,6 +4203,36 @@ test_parser_recursion (void) + g_free (silly_dict); + } + ++/* Test that #GVariants which recurse too deeply through use of typedecls are ++ * rejected. This is a sneaky way to multiply the number of objects in a text ++ * representation of a #GVariant without making the text-form proportionately ++ * long. It uses a typedecl to nest one of the elements deeply within nested ++ * maybes, while keeping all the other elements un-nested in the text form. It ++ * relies on g_variant_parse() not being provided with a concrete type for the ++ * top-level #GVariant. */ ++static void ++test_parser_recursion_typedecls (void) ++{ ++ GVariant *value = NULL; ++ GError *local_error = NULL; ++ const guint recursion_depth = G_VARIANT_MAX_RECURSION_DEPTH - 1; ++ gchar *silly_type = g_malloc0 (recursion_depth + 2 /* trailing `u` and then nul */); ++ gchar *silly_array = NULL; ++ gsize i; ++ ++ for (i = 0; i < recursion_depth; i++) ++ silly_type[i] = 'm'; ++ silly_type[recursion_depth] = 'u'; ++ ++ silly_array = g_strdup_printf ("[1,2,3,@%s 0]", silly_type); ++ ++ value = g_variant_parse (NULL, silly_array, NULL, NULL, &local_error); ++ g_assert_error (local_error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_RECURSION); ++ g_assert_null (value); ++ g_error_free (local_error); ++ g_free (silly_array); ++} ++ + static void + test_parse_bad_format_char (void) + { +@@ -5178,6 +5208,7 @@ main (int argc, char **argv) + g_test_add_func ("/gvariant/parser", test_parses); + g_test_add_func ("/gvariant/parser/integer-bounds", test_parser_integer_bounds); + g_test_add_func ("/gvariant/parser/recursion", test_parser_recursion); ++ g_test_add_func ("/gvariant/parser/recursion/typedecls", test_parser_recursion_typedecls); + g_test_add_func ("/gvariant/parse-failures", test_parse_failures); + g_test_add_func ("/gvariant/parse-positional", test_parse_positional); + g_test_add_func ("/gvariant/parse/subprocess/bad-format-char", test_parse_bad_format_char); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch glib2.0-2.66.8/debian/patches/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch --- glib2.0-2.66.8/debian/patches/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,236 @@ +From: Philip Withnall +Date: Mon, 7 Nov 2022 15:09:30 +0000 +Subject: gvariant-parser: Speed up maybe_wrapper() by an order of magnitude +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This further helps with the potential denial of service problem in +issue #2782 / oss-fuzz#49462 / oss-fuzz#20177. + +Instead of allocating a new `GVariant` for each nesting level of +maybe-types, allocate a single `GVariant` and give it the fully-nested +maybe type as its type. This has to be done in serialised form. + +This prevents attackers from triggering O(size of container × typedecl +depth) allocations. + +This is a follow up to commit 3e313438f1900a620485ba88aad64c4e857f6ad1, +and includes a test. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2782 +Bug-oss-fuzz: #20177 +Bug-oss-fuzz: #49462 +Origin: upstream, 2.74.2, commit:64c2f5f3bb339471278f560f5597ed35d65427b9 +--- + glib/gvariant-parser.c | 88 +++++++++++++++++++++++++++++++++++++++++++------- + glib/tests/gvariant.c | 77 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 153 insertions(+), 12 deletions(-) + +diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c +index d8abd5d..f01a518 100644 +--- a/glib/gvariant-parser.c ++++ b/glib/gvariant-parser.c +@@ -29,6 +29,7 @@ + #include "gstrfuncs.h" + #include "gtestutils.h" + #include "gvariant.h" ++#include "glib/gvariant-core.h" + #include "gvariant-internal.h" + #include "gvarianttype.h" + #include "gslice.h" +@@ -867,23 +868,86 @@ maybe_wrapper (AST *ast, + const GVariantType *type, + GError **error) + { +- const GVariantType *t; +- GVariant *value; +- int depth; ++ const GVariantType *base_type; ++ GVariant *base_value; ++ GVariant *value = NULL; ++ unsigned int depth; ++ gboolean trusted; ++ GVariantTypeInfo *base_type_info = NULL; ++ gsize base_serialised_fixed_size, base_serialised_size, serialised_size, n_suffix_zeros; ++ guint8 *serialised = NULL; ++ GBytes *bytes = NULL; ++ gsize i; ++ ++ for (depth = 0, base_type = type; ++ g_variant_type_is_maybe (base_type); ++ depth++, base_type = g_variant_type_element (base_type)); ++ ++ base_value = ast->class->get_base_value (ast, base_type, error); ++ ++ if (base_value == NULL || depth == 0) ++ return g_steal_pointer (&base_value); ++ ++ /* This is the equivalent of calling g_variant_new_maybe() in a loop enough ++ * times to match the number of nested maybe types in @type. It does the same ++ * in a single `GVariant` allocation, though. ++ * ++ * This avoids maybe_wrapper() becoming an attack vector where a malicious ++ * text-form variant can create a long array, and insert a typedecl for a ++ * deeply nested maybe type on one of its elements. This is achievable with a ++ * relatively short text form, but results in O(array length × typedecl depth) ++ * allocations. This is a denial of service attack. ++ * ++ * Instead of constructing a tree of `GVariant`s in tree-form to match the ++ * @ast, construct a single `GVariant` containing the serialised form of the ++ * maybe-wrappers and the base value that they contain. This is relatively ++ * straightforward: serialise the base value, and then append the correct ++ * number of zero bytes for the maybe-wrappers. ++ * ++ * This is a bit of a layering violation, unfortunately. ++ * ++ * By doing this, the typedecl depth variable is reduced to O(1). ++ */ ++ trusted = g_variant_is_trusted (base_value); ++ ++ /* See https://developer.gnome.org/documentation/specifications/gvariant-specification-1.0.html#maybes ++ * ++ * The serialised form of a `Just x` is the serialised form of `x` if `x` is ++ * fixed-size, and the serialised form of `x` plus a trailing zero byte if `x` ++ * is variable-size. A `Maybe` variant is always variable-size, even if its ++ * child element is fixed-size, because it might be `Nothing`. This means that ++ * all the maybe-wrappers which are not the innermost are always serialised ++ * with one trailing zero byte each. ++ * ++ * The serialised form of a `Nothing` is an empty byte sequence, but that’s ++ * already handled above in the `base_value == NULL` case. ++ */ ++ base_type_info = g_variant_type_info_get (base_type); ++ g_variant_type_info_query (base_type_info, NULL, &base_serialised_fixed_size); ++ g_variant_type_info_unref (base_type_info); + +- for (depth = 0, t = type; +- g_variant_type_is_maybe (t); +- depth++, t = g_variant_type_element (t)); ++ base_serialised_size = g_variant_get_size (base_value); ++ n_suffix_zeros = (base_serialised_fixed_size > 0) ? depth - 1 : depth; ++ g_assert (base_serialised_size <= G_MAXSIZE - n_suffix_zeros); ++ serialised_size = base_serialised_size + n_suffix_zeros; + +- value = ast->class->get_base_value (ast, t, error); ++ g_assert (serialised_size >= base_serialised_size); + +- if (value == NULL) +- return NULL; ++ /* Serialise the base value. */ ++ serialised = g_malloc (serialised_size); ++ g_variant_store (base_value, serialised); + +- while (depth--) +- value = g_variant_new_maybe (NULL, value); ++ /* Zero-out the suffix zeros to complete the serialisation of the maybe wrappers. */ ++ for (i = base_serialised_size; i < serialised_size; i++) ++ serialised[i] = 0; + +- return value; ++ bytes = g_bytes_new_take (g_steal_pointer (&serialised), serialised_size); ++ value = g_variant_new_from_bytes (type, bytes, trusted); ++ g_bytes_unref (bytes); ++ ++ g_variant_unref (base_value); ++ ++ return g_steal_pointer (&value); + } + + typedef struct +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 9c9fd35..448f9a2 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -4233,6 +4233,82 @@ test_parser_recursion_typedecls (void) + g_free (silly_array); + } + ++static void ++test_parser_recursion_maybes (void) ++{ ++ const gchar *hello = "hello"; ++ struct ++ { ++ const gchar *text_form; /* (not nullable) */ ++ GVariant *expected_variant; /* (not nullable) (owned) */ ++ } ++ vectors[] = ++ { ++ { ++ /* fixed size base value */ ++ "@mmmu 5", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_uint32 (5))))) ++ }, ++ { ++ /* variable size base value */ ++ "@mmmas ['hello']", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_strv (&hello, 1))))) ++ }, ++ { ++ /* fixed size base value, unset */ ++ "@mmmu just just nothing", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_maybe (G_VARIANT_TYPE_UINT32, NULL)))) ++ }, ++ { ++ /* variable size base value, unset */ ++ "@mmmas just just nothing", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (NULL, g_variant_new_maybe (G_VARIANT_TYPE_STRING_ARRAY, NULL)))) ++ }, ++ { ++ /* fixed size base value, unset */ ++ "@mmmu just nothing", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (G_VARIANT_TYPE ("mu"), NULL))) ++ }, ++ { ++ /* variable size base value, unset */ ++ "@mmmas just nothing", ++ g_variant_ref_sink (g_variant_new_maybe (NULL, g_variant_new_maybe (G_VARIANT_TYPE ("mas"), NULL))) ++ }, ++ { ++ /* fixed size base value, unset */ ++ "@mmmu nothing", ++ g_variant_ref_sink (g_variant_new_maybe (G_VARIANT_TYPE ("mmu"), NULL)) ++ }, ++ { ++ /* variable size base value, unset */ ++ "@mmmas nothing", ++ g_variant_ref_sink (g_variant_new_maybe (G_VARIANT_TYPE ("mmas"), NULL)) ++ }, ++ }; ++ gsize i; ++ ++ g_test_summary ("Test that nested maybes are handled correctly when parsing text-form variants"); ++ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2782"); ++ ++ for (i = 0; i < G_N_ELEMENTS (vectors); i++) ++ { ++ GVariant *value = NULL; ++ GError *local_error = NULL; ++ ++ g_test_message ("Text form %" G_GSIZE_FORMAT ": %s", i, vectors[i].text_form); ++ ++ value = g_variant_parse (NULL, vectors[i].text_form, NULL, NULL, &local_error); ++ g_assert_no_error (local_error); ++ g_assert_nonnull (value); ++ ++ g_assert_cmpvariant (value, vectors[i].expected_variant); ++ ++ g_variant_unref (value); ++ ++ g_clear_pointer (&vectors[i].expected_variant, g_variant_unref); ++ } ++} ++ + static void + test_parse_bad_format_char (void) + { +@@ -5209,6 +5285,7 @@ main (int argc, char **argv) + g_test_add_func ("/gvariant/parser/integer-bounds", test_parser_integer_bounds); + g_test_add_func ("/gvariant/parser/recursion", test_parser_recursion); + g_test_add_func ("/gvariant/parser/recursion/typedecls", test_parser_recursion_typedecls); ++ g_test_add_func ("/gvariant/parser/recursion/maybes", test_parser_recursion_maybes); + g_test_add_func ("/gvariant/parse-failures", test_parse_failures); + g_test_add_func ("/gvariant/parse-positional", test_parse_positional); + g_test_add_func ("/gvariant/parse/subprocess/bad-format-char", test_parse_bad_format_char); diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,282 @@ +From: Philip Withnall +Date: Thu, 27 Oct 2022 12:00:04 +0100 +Subject: gvariant-serialiser: Check offset table entry size is minimal + +The entries in an offset table (which is used for variable sized arrays +and tuples containing variable sized members) are sized so that they can +address every byte in the overall variant. + +The specification requires that for a variant to be in normal form, its +offset table entries must be the minimum width such that they can +address every byte in the variant. + +That minimality requirement was not checked in +`g_variant_is_normal_form()`, leading to two different byte arrays being +interpreted as the normal form of a given variant tree. That kind of +confusion could potentially be exploited, and is certainly a bug. + +Fix it by adding the necessary checks on offset table entry width, and +unit tests. + +Spotted by William Manley. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2794 +Origin: upstream, 2.74.4, commit:f1dfc5d0c5c0486b5fccb2ceddf1db1162c7033c +--- + glib/gvariant-serialiser.c | 19 ++++- + glib/tests/gvariant.c | 176 +++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 194 insertions(+), 1 deletion(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 88ba72a..f8ba4dd 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -694,6 +694,10 @@ gvs_variable_sized_array_get_frame_offsets (GVariantSerialised value) + out.data_size = last_end; + out.array = value.data + last_end; + out.length = offsets_array_size / out.offset_size; ++ ++ if (out.length > 0 && gvs_calculate_total_size (last_end, out.length) != value.size) ++ return out; /* offset size not minimal */ ++ + out.is_normal = TRUE; + + return out; +@@ -1201,6 +1205,7 @@ gvs_tuple_is_normal (GVariantSerialised value) + gsize length; + gsize offset; + gsize i; ++ gsize offset_table_size; + + /* as per the comment in gvs_tuple_get_child() */ + if G_UNLIKELY (value.data == NULL && value.size != 0) +@@ -1305,7 +1310,19 @@ gvs_tuple_is_normal (GVariantSerialised value) + } + } + +- return offset_ptr == offset; ++ /* @offset_ptr has been counting backwards from the end of the variant, to ++ * find the beginning of the offset table. @offset has been counting forwards ++ * from the beginning of the variant to find the end of the data. They should ++ * have met in the middle. */ ++ if (offset_ptr != offset) ++ return FALSE; ++ ++ offset_table_size = value.size - offset_ptr; ++ if (value.size > 0 && ++ gvs_calculate_total_size (offset, offset_table_size / offset_size) != value.size) ++ return FALSE; /* offset size not minimal */ ++ ++ return TRUE; + } + + /* Variants {{{2 +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 6f412df..0c86fb4 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -5236,6 +5236,86 @@ test_normal_checking_array_offsets2 (void) + g_variant_unref (variant); + } + ++/* Test that an otherwise-valid serialised GVariant is considered non-normal if ++ * its offset table entries are too wide. ++ * ++ * See §2.3.6 (Framing Offsets) of the GVariant specification. */ ++static void ++test_normal_checking_array_offsets_minimal_sized (void) ++{ ++ GVariantBuilder builder; ++ gsize i; ++ GVariant *aay_constructed = NULL; ++ const guint8 *data = NULL; ++ guint8 *data_owned = NULL; ++ GVariant *aay_deserialised = NULL; ++ GVariant *aay_normalised = NULL; ++ ++ /* Construct an array of type aay, consisting of 128 elements which are each ++ * an empty array, i.e. `[[] * 128]`. This is chosen because the inner ++ * elements are variable sized (making the outer array variable sized, so it ++ * must have an offset table), but they are also zero-sized when serialised. ++ * So the serialised representation of @aay_constructed consists entirely of ++ * its offset table, which is entirely zeroes. ++ * ++ * The array is chosen to be 128 elements long because that means offset ++ * table entries which are 1 byte long. If the elements in the array were ++ * non-zero-sized (to the extent that the overall array is ≥256 bytes long), ++ * the offset table entries would end up being 2 bytes long. */ ++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay")); ++ ++ for (i = 0; i < 128; i++) ++ g_variant_builder_add_value (&builder, g_variant_new_array (G_VARIANT_TYPE_BYTE, NULL, 0)); ++ ++ aay_constructed = g_variant_builder_end (&builder); ++ ++ /* Verify that the constructed array is in normal form, and its serialised ++ * form is `b'\0' * 128`. */ ++ g_assert_true (g_variant_is_normal_form (aay_constructed)); ++ g_assert_cmpuint (g_variant_n_children (aay_constructed), ==, 128); ++ g_assert_cmpuint (g_variant_get_size (aay_constructed), ==, 128); ++ ++ data = g_variant_get_data (aay_constructed); ++ for (i = 0; i < g_variant_get_size (aay_constructed); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ /* Construct a serialised `aay` GVariant which is `b'\0' * 256`. This has to ++ * be a non-normal form of `[[] * 128]`, with 2-byte-long offset table ++ * entries, because each offset table entry has to be able to reference all of ++ * the byte boundaries in the container. All the entries in the offset table ++ * are zero, so all the elements of the array are zero-sized. */ ++ data = data_owned = g_malloc0 (256); ++ aay_deserialised = g_variant_new_from_data (G_VARIANT_TYPE ("aay"), ++ data, ++ 256, ++ FALSE, ++ g_free, ++ g_steal_pointer (&data_owned)); ++ ++ g_assert_false (g_variant_is_normal_form (aay_deserialised)); ++ g_assert_cmpuint (g_variant_n_children (aay_deserialised), ==, 128); ++ g_assert_cmpuint (g_variant_get_size (aay_deserialised), ==, 256); ++ ++ data = g_variant_get_data (aay_deserialised); ++ for (i = 0; i < g_variant_get_size (aay_deserialised); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ /* Get its normal form. That should change the serialised size. */ ++ aay_normalised = g_variant_get_normal_form (aay_deserialised); ++ ++ g_assert_true (g_variant_is_normal_form (aay_normalised)); ++ g_assert_cmpuint (g_variant_n_children (aay_normalised), ==, 128); ++ g_assert_cmpuint (g_variant_get_size (aay_normalised), ==, 128); ++ ++ data = g_variant_get_data (aay_normalised); ++ for (i = 0; i < g_variant_get_size (aay_normalised); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ g_variant_unref (aay_normalised); ++ g_variant_unref (aay_deserialised); ++ g_variant_unref (aay_constructed); ++} ++ + /* Test that a tuple with invalidly large values in its offset table is + * normalised successfully without looping infinitely. */ + static void +@@ -5430,6 +5510,98 @@ test_normal_checking_tuple_offsets4 (void) + g_variant_unref (variant); + } + ++/* Test that an otherwise-valid serialised GVariant is considered non-normal if ++ * its offset table entries are too wide. ++ * ++ * See §2.3.6 (Framing Offsets) of the GVariant specification. */ ++static void ++test_normal_checking_tuple_offsets_minimal_sized (void) ++{ ++ GString *type_string = NULL; ++ GVariantBuilder builder; ++ gsize i; ++ GVariant *ray_constructed = NULL; ++ const guint8 *data = NULL; ++ guint8 *data_owned = NULL; ++ GVariant *ray_deserialised = NULL; ++ GVariant *ray_normalised = NULL; ++ ++ /* Construct a tuple of type (ay…ay), consisting of 129 members which are each ++ * an empty array, i.e. `([] * 129)`. This is chosen because the inner ++ * members are variable sized, so the outer tuple must have an offset table, ++ * but they are also zero-sized when serialised. So the serialised ++ * representation of @ray_constructed consists entirely of its offset table, ++ * which is entirely zeroes. ++ * ++ * The tuple is chosen to be 129 members long because that means it has 128 ++ * offset table entries which are 1 byte long each. If the members in the ++ * tuple were non-zero-sized (to the extent that the overall tuple is ≥256 ++ * bytes long), the offset table entries would end up being 2 bytes long. ++ * ++ * 129 members are used unlike 128 array elements in ++ * test_normal_checking_array_offsets_minimal_sized(), because the last member ++ * in a tuple never needs an offset table entry. */ ++ type_string = g_string_new (""); ++ g_string_append_c (type_string, '('); ++ for (i = 0; i < 129; i++) ++ g_string_append (type_string, "ay"); ++ g_string_append_c (type_string, ')'); ++ ++ g_variant_builder_init (&builder, G_VARIANT_TYPE (type_string->str)); ++ ++ for (i = 0; i < 129; i++) ++ g_variant_builder_add_value (&builder, g_variant_new_array (G_VARIANT_TYPE_BYTE, NULL, 0)); ++ ++ ray_constructed = g_variant_builder_end (&builder); ++ ++ /* Verify that the constructed tuple is in normal form, and its serialised ++ * form is `b'\0' * 128`. */ ++ g_assert_true (g_variant_is_normal_form (ray_constructed)); ++ g_assert_cmpuint (g_variant_n_children (ray_constructed), ==, 129); ++ g_assert_cmpuint (g_variant_get_size (ray_constructed), ==, 128); ++ ++ data = g_variant_get_data (ray_constructed); ++ for (i = 0; i < g_variant_get_size (ray_constructed); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ /* Construct a serialised `(ay…ay)` GVariant which is `b'\0' * 256`. This has ++ * to be a non-normal form of `([] * 129)`, with 2-byte-long offset table ++ * entries, because each offset table entry has to be able to reference all of ++ * the byte boundaries in the container. All the entries in the offset table ++ * are zero, so all the members of the tuple are zero-sized. */ ++ data = data_owned = g_malloc0 (256); ++ ray_deserialised = g_variant_new_from_data (G_VARIANT_TYPE (type_string->str), ++ data, ++ 256, ++ FALSE, ++ g_free, ++ g_steal_pointer (&data_owned)); ++ ++ g_assert_false (g_variant_is_normal_form (ray_deserialised)); ++ g_assert_cmpuint (g_variant_n_children (ray_deserialised), ==, 129); ++ g_assert_cmpuint (g_variant_get_size (ray_deserialised), ==, 256); ++ ++ data = g_variant_get_data (ray_deserialised); ++ for (i = 0; i < g_variant_get_size (ray_deserialised); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ /* Get its normal form. That should change the serialised size. */ ++ ray_normalised = g_variant_get_normal_form (ray_deserialised); ++ ++ g_assert_true (g_variant_is_normal_form (ray_normalised)); ++ g_assert_cmpuint (g_variant_n_children (ray_normalised), ==, 129); ++ g_assert_cmpuint (g_variant_get_size (ray_normalised), ==, 128); ++ ++ data = g_variant_get_data (ray_normalised); ++ for (i = 0; i < g_variant_get_size (ray_normalised); i++) ++ g_assert_cmpuint (data[i], ==, 0); ++ ++ g_variant_unref (ray_normalised); ++ g_variant_unref (ray_deserialised); ++ g_variant_unref (ray_constructed); ++ g_string_free (type_string, TRUE); ++} ++ + /* Test that an empty object path is normalised successfully to the base object + * path, ‘/’. */ + static void +@@ -5579,6 +5751,8 @@ main (int argc, char **argv) + test_normal_checking_array_offsets); + g_test_add_func ("/gvariant/normal-checking/array-offsets2", + test_normal_checking_array_offsets2); ++ g_test_add_func ("/gvariant/normal-checking/array-offsets/minimal-sized", ++ test_normal_checking_array_offsets_minimal_sized); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets", + test_normal_checking_tuple_offsets); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets2", +@@ -5587,6 +5761,8 @@ main (int argc, char **argv) + test_normal_checking_tuple_offsets3); + g_test_add_func ("/gvariant/normal-checking/tuple-offsets4", + test_normal_checking_tuple_offsets4); ++ g_test_add_func ("/gvariant/normal-checking/tuple-offsets/minimal-sized", ++ test_normal_checking_tuple_offsets_minimal_sized); + g_test_add_func ("/gvariant/normal-checking/empty-object-path", + test_normal_checking_empty_object_path); + diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Convert-endianness-of-offsets.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Convert-endianness-of-offsets.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Convert-endianness-of-offsets.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Convert-endianness-of-offsets.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,62 @@ +From: Simon McVittie +Date: Thu, 15 Dec 2022 12:51:37 +0000 +Subject: gvariant-serialiser: Convert endianness of offsets +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +The array of offsets is little-endian, even on big-endian architectures +like s390x. + +Fixes: ade71fb5 "gvariant: Don’t allow child elements to overlap with each other" +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2839 +Signed-off-by: Simon McVittie +Origin: upstream, 2.74.4, commit:dc16dffed0480d0c8cdd6a05ede68263fc8723a9 +--- + glib/gvariant-serialiser.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index f8ba4dd..662aa84 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -712,17 +712,19 @@ gvs_variable_sized_array_n_children (GVariantSerialised value) + /* Find the index of the first out-of-order element in @data, assuming that + * @data is an array of elements of given @type, starting at index @start and + * containing a further @len-@start elements. */ +-#define DEFINE_FIND_UNORDERED(type) \ ++#define DEFINE_FIND_UNORDERED(type, le_to_native) \ + static gsize \ + find_unordered_##type (const guint8 *data, gsize start, gsize len) \ + { \ + gsize off; \ +- type current, previous; \ ++ type current_le, previous_le, current, previous; \ + \ +- memcpy (&previous, data + start * sizeof (current), sizeof (current)); \ ++ memcpy (&previous_le, data + start * sizeof (current), sizeof (current)); \ ++ previous = le_to_native (previous_le); \ + for (off = (start + 1) * sizeof (current); off < len * sizeof (current); off += sizeof (current)) \ + { \ +- memcpy (¤t, data + off, sizeof (current)); \ ++ memcpy (¤t_le, data + off, sizeof (current)); \ ++ current = le_to_native (current_le); \ + if (current < previous) \ + break; \ + previous = current; \ +@@ -730,10 +732,11 @@ gvs_variable_sized_array_n_children (GVariantSerialised value) + return off / sizeof (current) - 1; \ + } + +-DEFINE_FIND_UNORDERED (guint8); +-DEFINE_FIND_UNORDERED (guint16); +-DEFINE_FIND_UNORDERED (guint32); +-DEFINE_FIND_UNORDERED (guint64); ++#define NO_CONVERSION(x) (x) ++DEFINE_FIND_UNORDERED (guint8, NO_CONVERSION); ++DEFINE_FIND_UNORDERED (guint16, GUINT16_FROM_LE); ++DEFINE_FIND_UNORDERED (guint32, GUINT32_FROM_LE); ++DEFINE_FIND_UNORDERED (guint64, GUINT64_FROM_LE); + + static GVariantSerialised + gvs_variable_sized_array_get_child (GVariantSerialised value, diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,105 @@ +From: Philip Withnall +Date: Fri, 7 Jan 2022 15:03:52 +0000 +Subject: gvariant-serialiser: Factor out code to get bounds of a tuple member + +This introduces no functional changes. + +Signed-off-by: Philip Withnall + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:66e7c10aa1ec3102c49186f83671a5f0461ffbc0 +--- + glib/gvariant-serialiser.c | 73 +++++++++++++++++++++++++++++----------------- + 1 file changed, 46 insertions(+), 27 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index bfcb946..2614dd4 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -942,6 +942,51 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + * for the tuple. See the notes in gvarianttypeinfo.h. + */ + ++static void ++gvs_tuple_get_member_bounds (GVariantSerialised value, ++ gsize index_, ++ gsize offset_size, ++ gsize *out_member_start, ++ gsize *out_member_end) ++{ ++ const GVariantMemberInfo *member_info; ++ gsize member_start, member_end; ++ ++ member_info = g_variant_type_info_member_info (value.type_info, index_); ++ ++ if (member_info->i + 1) ++ member_start = gvs_read_unaligned_le (value.data + value.size - ++ offset_size * (member_info->i + 1), ++ offset_size); ++ else ++ member_start = 0; ++ ++ member_start += member_info->a; ++ member_start &= member_info->b; ++ member_start |= member_info->c; ++ ++ if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST) ++ member_end = value.size - offset_size * (member_info->i + 1); ++ ++ else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) ++ { ++ gsize fixed_size; ++ ++ g_variant_type_info_query (member_info->type_info, NULL, &fixed_size); ++ member_end = member_start + fixed_size; ++ } ++ ++ else /* G_VARIANT_MEMBER_ENDING_OFFSET */ ++ member_end = gvs_read_unaligned_le (value.data + value.size - ++ offset_size * (member_info->i + 2), ++ offset_size); ++ ++ if (out_member_start != NULL) ++ *out_member_start = member_start; ++ if (out_member_end != NULL) ++ *out_member_end = member_end; ++} ++ + static gsize + gvs_tuple_n_children (GVariantSerialised value) + { +@@ -997,33 +1042,7 @@ gvs_tuple_get_child (GVariantSerialised value, + } + } + +- if (member_info->i + 1) +- start = gvs_read_unaligned_le (value.data + value.size - +- offset_size * (member_info->i + 1), +- offset_size); +- else +- start = 0; +- +- start += member_info->a; +- start &= member_info->b; +- start |= member_info->c; +- +- if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST) +- end = value.size - offset_size * (member_info->i + 1); +- +- else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) +- { +- gsize fixed_size; +- +- g_variant_type_info_query (child.type_info, NULL, &fixed_size); +- end = start + fixed_size; +- child.size = fixed_size; +- } +- +- else /* G_VARIANT_MEMBER_ENDING_OFFSET */ +- end = gvs_read_unaligned_le (value.data + value.size - +- offset_size * (member_info->i + 2), +- offset_size); ++ gvs_tuple_get_member_bounds (value, index_, offset_size, &start, &end); + + /* The child should not extend into the offset table. */ + if (index_ != g_variant_type_info_n_members (value.type_info) - 1) diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Factor-out-functions-for-dealing-with.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,203 @@ +From: William Manley +Date: Thu, 25 Jun 2020 17:08:21 +0100 +Subject: gvariant-serialiser: Factor out functions for dealing with framing + offsets + +This introduces no functional changes. + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:f8f5d8eefa06008aa8fe684069193dc3b1ae1b58 +--- + glib/gvariant-serialiser.c | 108 ++++++++++++++++++++++++--------------------- + 1 file changed, 57 insertions(+), 51 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index f62d85b..6357cc7 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -633,30 +633,62 @@ gvs_calculate_total_size (gsize body_size, + return body_size + 8 * offsets; + } + ++struct Offsets ++{ ++ gsize data_size; ++ ++ guchar *array; ++ gsize length; ++ guint offset_size; ++ ++ gboolean is_normal; ++}; ++ + static gsize +-gvs_variable_sized_array_n_children (GVariantSerialised value) ++gvs_offsets_get_offset_n (struct Offsets *offsets, ++ gsize n) ++{ ++ return gvs_read_unaligned_le ( ++ offsets->array + (offsets->offset_size * n), offsets->offset_size); ++} ++ ++static struct Offsets ++gvs_variable_sized_array_get_frame_offsets (GVariantSerialised value) + { ++ struct Offsets out = { 0, }; + gsize offsets_array_size; +- gsize offset_size; + gsize last_end; + + if (value.size == 0) +- return 0; +- +- offset_size = gvs_get_offset_size (value.size); ++ { ++ out.is_normal = TRUE; ++ return out; ++ } + +- last_end = gvs_read_unaligned_le (value.data + value.size - +- offset_size, offset_size); ++ out.offset_size = gvs_get_offset_size (value.size); ++ last_end = gvs_read_unaligned_le (value.data + value.size - out.offset_size, ++ out.offset_size); + + if (last_end > value.size) +- return 0; ++ return out; /* offsets not normal */ + + offsets_array_size = value.size - last_end; + +- if (offsets_array_size % offset_size) +- return 0; ++ if (offsets_array_size % out.offset_size) ++ return out; /* offsets not normal */ ++ ++ out.data_size = last_end; ++ out.array = value.data + last_end; ++ out.length = offsets_array_size / out.offset_size; ++ out.is_normal = TRUE; + +- return offsets_array_size / offset_size; ++ return out; ++} ++ ++static gsize ++gvs_variable_sized_array_n_children (GVariantSerialised value) ++{ ++ return gvs_variable_sized_array_get_frame_offsets (value).length; + } + + static GVariantSerialised +@@ -664,8 +696,9 @@ gvs_variable_sized_array_get_child (GVariantSerialised value, + gsize index_) + { + GVariantSerialised child = { 0, }; +- gsize offset_size; +- gsize last_end; ++ ++ struct Offsets offsets = gvs_variable_sized_array_get_frame_offsets (value); ++ + gsize start; + gsize end; + +@@ -673,18 +706,11 @@ gvs_variable_sized_array_get_child (GVariantSerialised value, + g_variant_type_info_ref (child.type_info); + child.depth = value.depth + 1; + +- offset_size = gvs_get_offset_size (value.size); +- +- last_end = gvs_read_unaligned_le (value.data + value.size - +- offset_size, offset_size); +- + if (index_ > 0) + { + guint alignment; + +- start = gvs_read_unaligned_le (value.data + last_end + +- (offset_size * (index_ - 1)), +- offset_size); ++ start = gvs_offsets_get_offset_n (&offsets, index_ - 1); + + g_variant_type_info_query (child.type_info, &alignment, NULL); + start += (-start) & alignment; +@@ -692,11 +718,9 @@ gvs_variable_sized_array_get_child (GVariantSerialised value, + else + start = 0; + +- end = gvs_read_unaligned_le (value.data + last_end + +- (offset_size * index_), +- offset_size); ++ end = gvs_offsets_get_offset_n (&offsets, index_); + +- if (start < end && end <= value.size && end <= last_end) ++ if (start < end && end <= value.size && end <= offsets.data_size) + { + child.data = value.data + start; + child.size = end - start; +@@ -768,34 +792,16 @@ static gboolean + gvs_variable_sized_array_is_normal (GVariantSerialised value) + { + GVariantSerialised child = { 0, }; +- gsize offsets_array_size; +- guchar *offsets_array; +- guint offset_size; + guint alignment; +- gsize last_end; +- gsize length; + gsize offset; + gsize i; + +- if (value.size == 0) +- return TRUE; +- +- offset_size = gvs_get_offset_size (value.size); +- last_end = gvs_read_unaligned_le (value.data + value.size - +- offset_size, offset_size); ++ struct Offsets offsets = gvs_variable_sized_array_get_frame_offsets (value); + +- if (last_end > value.size) ++ if (!offsets.is_normal) + return FALSE; + +- offsets_array_size = value.size - last_end; +- +- if (offsets_array_size % offset_size) +- return FALSE; +- +- offsets_array = value.data + value.size - offsets_array_size; +- length = offsets_array_size / offset_size; +- +- if (length == 0) ++ if (value.size != 0 && offsets.length == 0) + return FALSE; + + child.type_info = g_variant_type_info_element (value.type_info); +@@ -803,14 +809,14 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + child.depth = value.depth + 1; + offset = 0; + +- for (i = 0; i < length; i++) ++ for (i = 0; i < offsets.length; i++) + { + gsize this_end; + +- this_end = gvs_read_unaligned_le (offsets_array + offset_size * i, +- offset_size); ++ this_end = gvs_read_unaligned_le (offsets.array + offsets.offset_size * i, ++ offsets.offset_size); + +- if (this_end < offset || this_end > last_end) ++ if (this_end < offset || this_end > offsets.data_size) + return FALSE; + + while (offset & alignment) +@@ -832,7 +838,7 @@ gvs_variable_sized_array_is_normal (GVariantSerialised value) + offset = this_end; + } + +- g_assert (offset == last_end); ++ g_assert (offset == offsets.data_size); + + return TRUE; + } diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,47 @@ +From: Sebastian Wilhelmi +Date: Thu, 6 Jan 2022 20:50:34 +0000 +Subject: gvariant-serialiser: Prevent unbounded recursion in is_normal() +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This fixes a bug in 7c4e6e9fbe473de0401c778c6b0c4aad27d5145a. + +The original approach in that commit accidentally only checked the depth +at the leaf nodes in the variant tree, whereas actually the depth should +be checked before recursing to avoid stack overflow. + +It neglected to consider that `g_variant_serialised_is_normal()` would +be recursed into by some of the `DISPATCH(_is_normal)` cases. When that +happened, the depth check was after the recursion so couldn’t prevent a +stack overflow. + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2572 +Origin: upstream, 2.71.1, commit:77233f6f0779fe0c1cb48861d7deded4ae413567 +--- + glib/gvariant-serialiser.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 83e9d85..f62d85b 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -1587,6 +1587,9 @@ g_variant_serialised_byteswap (GVariantSerialised serialised) + gboolean + g_variant_serialised_is_normal (GVariantSerialised serialised) + { ++ if (serialised.depth >= G_VARIANT_MAX_RECURSION_DEPTH) ++ return FALSE; ++ + DISPATCH_CASES (serialised.type_info, + + return gvs_/**/,/**/_is_normal (serialised); +@@ -1595,8 +1598,6 @@ g_variant_serialised_is_normal (GVariantSerialised serialised) + + if (serialised.data == NULL) + return FALSE; +- if (serialised.depth >= G_VARIANT_MAX_RECURSION_DEPTH) +- return FALSE; + + /* some hard-coded terminal cases */ + switch (g_variant_type_info_get_type_char (serialised.type_info)) diff -Nru glib2.0-2.66.8/debian/patches/gvariant-serialiser-Rework-child-size-calculation.patch glib2.0-2.66.8/debian/patches/gvariant-serialiser-Rework-child-size-calculation.patch --- glib2.0-2.66.8/debian/patches/gvariant-serialiser-Rework-child-size-calculation.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/gvariant-serialiser-Rework-child-size-calculation.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,76 @@ +From: Philip Withnall +Date: Fri, 7 Jan 2022 16:37:29 +0000 +Subject: gvariant-serialiser: Rework child size calculation +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +This reduces a few duplicate calls to `g_variant_type_info_query()` and +explains why they’re needed. + +Signed-off-by: Philip Withnall + +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:a62a6b5d3e53b30a4628db2a077ab9ed03605748 +--- + glib/gvariant-serialiser.c | 31 +++++++++---------------------- + 1 file changed, 9 insertions(+), 22 deletions(-) + +diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c +index 2614dd4..eef1a53 100644 +--- a/glib/gvariant-serialiser.c ++++ b/glib/gvariant-serialiser.c +@@ -1007,14 +1007,18 @@ gvs_tuple_get_child (GVariantSerialised value, + child.depth = value.depth + 1; + offset_size = gvs_get_offset_size (value.size); + ++ /* Ensure the size is set for fixed-sized children, or ++ * g_variant_serialised_check() will fail, even if we return ++ * (child.data == NULL) to indicate an error. */ ++ if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) ++ g_variant_type_info_query (child.type_info, NULL, &child.size); ++ + /* tuples are the only (potentially) fixed-sized containers, so the + * only ones that have to deal with the possibility of having %NULL + * data with a non-zero %size if errors occurred elsewhere. + */ + if G_UNLIKELY (value.data == NULL && value.size != 0) + { +- g_variant_type_info_query (child.type_info, NULL, &child.size); +- + /* this can only happen in fixed-sized tuples, + * so the child must also be fixed sized. + */ +@@ -1032,29 +1036,12 @@ gvs_tuple_get_child (GVariantSerialised value, + else + { + if (offset_size * (member_info->i + 1) > value.size) +- { +- /* if the child is fixed size, return its size. +- * if child is not fixed-sized, return size = 0. +- */ +- g_variant_type_info_query (child.type_info, NULL, &child.size); +- +- return child; +- } ++ return child; + } + +- gvs_tuple_get_member_bounds (value, index_, offset_size, &start, &end); +- + /* The child should not extend into the offset table. */ +- if (index_ != g_variant_type_info_n_members (value.type_info) - 1) +- { +- GVariantSerialised last_child; +- last_child = gvs_tuple_get_child (value, +- g_variant_type_info_n_members (value.type_info) - 1); +- last_end = last_child.data + last_child.size - value.data; +- g_variant_type_info_unref (last_child.type_info); +- } +- else +- last_end = end; ++ gvs_tuple_get_member_bounds (value, index_, offset_size, &start, &end); ++ gvs_tuple_get_member_bounds (value, g_variant_type_info_n_members (value.type_info) - 1, offset_size, NULL, &last_end); + + if (start < end && end <= value.size && end <= last_end) + { diff -Nru glib2.0-2.66.8/debian/patches/series glib2.0-2.66.8/debian/patches/series --- glib2.0-2.66.8/debian/patches/series 2021-03-20 15:35:19.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/series 2023-09-30 13:25:23.000000000 +0000 @@ -1,3 +1,41 @@ +Update-Croatian-translation.patch +gvariant-Clarify-operator-precedence.patch +Explain-magic-literals-in-G_VARIANT_-_INIT.patch +Fix-non-initialized-variable-in-glib-gvariant-parser.c.patch +gvariant-serialiser-Prevent-unbounded-recursion-in-is_nor.patch +gvariant-Fix-memory-leak-on-a-TYPE_CHECK-failure.patch +gvariant-Fix-pointers-being-dereferenced-despite-NULL-che.patch +Do-not-use-ensure_valid_-call-in-g_return_-macro.patch +gvariant-Factor-out-type-check.patch +gvariant-Zero-initialise-GVariantBuilder-children-under-s.patch +gvariant-parser-Reject-deeply-nested-typedecls-in-text-fo.patch +gvariant-parser-Speed-up-maybe_wrapper-by-an-order-of-mag.patch +gvariant-core-Consolidate-construction-of-GVariantSeriali.patch +gvariant-serialiser-Factor-out-functions-for-dealing-with.patch +gvariant-Zero-initialise-various-GVariantSerialised-objec.patch +gvariant-Don-t-allow-child-elements-to-overlap-with-each-.patch +gvariant-serialiser-Factor-out-code-to-get-bounds-of-a-tu.patch +gvariant-serialiser-Rework-child-size-calculation.patch +gvariant-Don-t-allow-child-elements-of-a-tuple-to-overlap.patch +gvariant-Track-checked-and-ordered-offsets-independently.patch +tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch +tests-Disable-some-random-instance-tests-of-GVariants.patch +gvariant-Clarify-the-docs-for-g_variant_get_normal_form.patch +gvariant-Port-g_variant_deep_copy-to-count-its-iterations.patch +gvariant-Add-internal-g_variant_maybe_get_child_value.patch +Exclude-g_variant_maybe_get_child_value-from-API-document.patch +gvariant-Cut-allocs-of-default-values-for-children-of-non.patch +gvariant-Fix-a-leak-of-a-GVariantTypeInfo-on-an-error-han.patch +gvariant-serialiser-Check-offset-table-entry-size-is-mini.patch +gvariant-Fix-g_variant_byteswap-returning-non-normal-data.patch +gvariant-Allow-g_variant_byteswap-to-operate-on-tree-form.patch +gvariant-serialiser-Convert-endianness-of-offsets.patch +gvariant-Check-offset-table-doesn-t-fall-outside-variant-.patch +gvariant-Propagate-trust-when-getting-a-child-of-a-serial.patch +gvariant-Factor-out-some-common-calls-to-g_variant_get_ty.patch +gvariant-Optimise-g_variant_print-for-nested-maybes.patch +gvariant-Remove-redundant-g_variant_serialised_n_children.patch +gvariant-Remove-some-unnecessary-type-assertions-on-a-hot.patch glib-tests-fileutils-Make-more-use-of-g_assert_no_errno.patch glib-tests-fileutils-Fix-expectations-when-running-as-roo.patch glocalfileoutputstream-Tidy-up-error-handling.patch diff -Nru glib2.0-2.66.8/debian/patches/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch glib2.0-2.66.8/debian/patches/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch --- glib2.0-2.66.8/debian/patches/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/tests-Add-another-test-for-overlapping-offsets-in-GVarian.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,63 @@ +From: Philip Withnall +Date: Fri, 12 Jun 2020 18:01:13 +0100 +Subject: tests: Add another test for overlapping offsets in GVariant + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:8c1a7815e7e6695c120cdedff48395c1222af6d1 +--- + glib/tests/gvariant.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index db53a88..56c224a 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -5133,6 +5133,38 @@ test_recursion_limits_array_in_variant (void) + g_variant_unref (wrapper_variant); + } + ++/* Test that a nested array with invalid values in its offset table (which point ++ * from the inner to the outer array) is normalised successfully without ++ * looping infinitely. */ ++static void ++test_normal_checking_array_offsets_overlapped (void) ++{ ++ const guint8 data[] = { ++ 0x01, 0x00, ++ }; ++ gsize size = sizeof (data); ++ GVariant *variant = NULL; ++ GVariant *normal_variant = NULL; ++ GVariant *expected_variant = NULL; ++ ++ variant = g_variant_new_from_data (G_VARIANT_TYPE ("aay"), data, size, ++ FALSE, NULL, NULL); ++ g_assert_nonnull (variant); ++ ++ normal_variant = g_variant_get_normal_form (variant); ++ g_assert_nonnull (normal_variant); ++ ++ expected_variant = g_variant_new_parsed ("[@ay [], []]"); ++ g_assert_cmpvariant (normal_variant, expected_variant); ++ ++ g_assert_cmpmem (g_variant_get_data (normal_variant), g_variant_get_size (normal_variant), ++ g_variant_get_data (expected_variant), g_variant_get_size (expected_variant)); ++ ++ g_variant_unref (expected_variant); ++ g_variant_unref (normal_variant); ++ g_variant_unref (variant); ++} ++ + /* Test that an array with invalidly large values in its offset table is + * normalised successfully without looping infinitely. */ + static void +@@ -5535,6 +5567,8 @@ main (int argc, char **argv) + + g_test_add_func ("/gvariant/normal-checking/tuples", + test_normal_checking_tuples); ++ g_test_add_func ("/gvariant/normal-checking/array-offsets/overlapped", ++ test_normal_checking_array_offsets_overlapped); + g_test_add_func ("/gvariant/normal-checking/array-offsets", + test_normal_checking_array_offsets); + g_test_add_func ("/gvariant/normal-checking/array-offsets2", diff -Nru glib2.0-2.66.8/debian/patches/tests-Disable-some-random-instance-tests-of-GVariants.patch glib2.0-2.66.8/debian/patches/tests-Disable-some-random-instance-tests-of-GVariants.patch --- glib2.0-2.66.8/debian/patches/tests-Disable-some-random-instance-tests-of-GVariants.patch 1970-01-01 00:00:00.000000000 +0000 +++ glib2.0-2.66.8/debian/patches/tests-Disable-some-random-instance-tests-of-GVariants.patch 2023-09-30 13:25:23.000000000 +0000 @@ -0,0 +1,72 @@ +From: Philip Withnall +Date: Mon, 24 Oct 2022 16:43:23 +0100 +Subject: tests: Disable some random instance tests of GVariants +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +Building a `GVariant` using entirely random data may result in a +non-normally-formed `GVariant`. It’s always possible to read these +`GVariant`s, but the API might return default values for some or all of +their components. + +In particular, this can easily happen when randomly generating the +offset tables for non-fixed-width container types. + +If it does happen, bytewise comparison of the parsed `GVariant` with the +original bytes will not always match. So skip those checks. + +Signed-off-by: Philip Withnall +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2121 +Origin: upstream, 2.74.4, commit:019505a7ccc32d0afa06e104dc0ac2e63e6f7189 +--- + glib/tests/gvariant.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c +index 56c224a..6f412df 100644 +--- a/glib/tests/gvariant.c ++++ b/glib/tests/gvariant.c +@@ -1233,6 +1233,7 @@ random_instance_assert (RandomInstance *instance, + GRand *rand; + gsize i; + ++ g_assert_true (size == 0 || buffer != NULL); + g_assert_cmpint ((gsize) buffer & ALIGN_BITS & instance->alignment, ==, 0); + g_assert_cmpint (size, ==, instance->size); + +@@ -1459,10 +1460,13 @@ test_maybe (void) + g_variant_serialiser_serialise (serialised, + random_instance_filler, + (gpointer *) &instance, 1); ++ + child = g_variant_serialised_get_child (serialised, 0); + g_assert_true (child.type_info == instance->type_info); +- random_instance_assert (instance, child.data, child.size); ++ if (child.data != NULL) /* could be NULL if element is non-normal */ ++ random_instance_assert (instance, child.data, child.size); + g_variant_type_info_unref (child.type_info); ++ + flavoured_free (serialised.data, flavour); + } + } +@@ -1595,7 +1599,8 @@ test_array (void) + + child = g_variant_serialised_get_child (serialised, i); + g_assert_true (child.type_info == instances[i]->type_info); +- random_instance_assert (instances[i], child.data, child.size); ++ if (child.data != NULL) /* could be NULL if element is non-normal */ ++ random_instance_assert (instances[i], child.data, child.size); + g_variant_type_info_unref (child.type_info); + } + +@@ -1761,7 +1766,8 @@ test_tuple (void) + + child = g_variant_serialised_get_child (serialised, i); + g_assert_true (child.type_info == instances[i]->type_info); +- random_instance_assert (instances[i], child.data, child.size); ++ if (child.data != NULL) /* could be NULL if element is non-normal */ ++ random_instance_assert (instances[i], child.data, child.size); + g_variant_type_info_unref (child.type_info); + } +