Skip to content
Commits on Source (18)
Overview of changes in GLib 2.74.2
==================================
* Fix `GVariant` type depths checks on text format variants (work by Philip Withnall) (#2782)
* Fix an obscure corner case with FD handling in `g_spawn_*()` when a process
has already closed the standard I/O FDs (work by Ray Strode) (#2795)
* Fix regression in type checking on `const` arguments to `g_str_equal()` (#2809)
* Bugs fixed:
- #2782 GVariant type depth not checked on typedecls in text format variants
(Philip Withnall)
- #2795 [regression] gnome-keyring-daemon uses 100% CPU with glib-2.74.1 (Ray
Strode)
- #2799 Wrong GTask tag on error return path in
g_proxy_resolver_lookup_async() (Michael Catanzaro)
- #2809 g_str_equal switched to stricter API (typing) (Philip Withnall)
- !3017 Backport !3008 “gio/gdesktopappinfo: Free the wrapped argv array on
launch failure” to glib-2-74
- !3038 Backport !3035 “portal: Fix broken header guard” to glib-2-74
- !3039 Backport !3029 “Revert "Handling collision between standard i/o file
descriptors and newly created ones" ” to glib-2-74
- !3046 Backport !3045 “gproxyresolver: lookup_finish() should better parallel
lookup_async()” to glib-2-74
- !3063 Backport !3061 “gvariant-parser: Speed up maybe_wrapper() by an order
of magnitude” to glib-2-74
- !3084 Backport !3082 “gstrfuncs: Fix regression in types accepted by
g_str_equal()” to glib-2-74
* Translation updates:
- Abkhazian (Nart Tlisha)
- Dutch (Nathan Follens)
- Serbian (Мирослав Николић)
Overview of changes in GLib 2.74.1
==================================
 
......
......@@ -2963,6 +2963,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
g_free (sn_id);
g_list_free (launched_uris);
g_clear_pointer (&wrapped_argv, g_strfreev);
goto out;
}
......
......@@ -19,6 +19,7 @@
*/
#ifndef __G_PORTAL_SUPPORT_H__
#define __G_PORTAL_SUPPORT_H__
#include <glib.h>
......
......@@ -245,6 +245,9 @@ g_proxy_resolver_lookup_finish (GProxyResolver *resolver,
g_return_val_if_fail (G_IS_PROXY_RESOLVER (resolver), NULL);
if (g_async_result_is_tagged (result, g_proxy_resolver_lookup_async))
return g_task_propagate_pointer (G_TASK (result), error);
iface = G_PROXY_RESOLVER_GET_IFACE (resolver);
proxy_uris = (* iface->lookup_finish) (resolver, result, error);
......
......@@ -20,7 +20,6 @@
#include <string.h>
#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_34
#include <gio/gio.h>
/* Overview:
......@@ -194,6 +193,7 @@ g_test_proxy_resolver_lookup_async (GProxyResolver *resolver,
proxies = g_proxy_resolver_lookup (resolver, uri, cancellable, &error);
task = g_task_new (resolver, NULL, callback, user_data);
g_task_set_source_tag (task, g_test_proxy_resolver_lookup_async);
if (proxies == NULL)
g_task_return_error (task, error);
else
......@@ -207,6 +207,9 @@ g_test_proxy_resolver_lookup_finish (GProxyResolver *resolver,
GAsyncResult *result,
GError **error)
{
g_assert_true (g_task_is_valid (result, resolver));
g_assert_true (g_task_get_source_tag (G_TASK (result)) == g_test_proxy_resolver_lookup_async);
return g_task_propagate_pointer (G_TASK (result), error);
}
......@@ -917,6 +920,18 @@ async_got_error (GObject *source,
g_assert (*error != NULL);
}
static void
async_resolver_got_error (GObject *source,
GAsyncResult *result,
gpointer user_data)
{
GError **error = user_data;
g_assert (error != NULL && *error == NULL);
g_proxy_resolver_lookup_finish (G_PROXY_RESOLVER (source),
result, error);
g_assert (*error != NULL);
}
static void
assert_direct (GSocketConnection *conn)
......@@ -1166,13 +1181,24 @@ test_invalid_uris_sync (gpointer fixture,
do_echo_test (conn);
g_object_unref (conn);
g_clear_pointer (&last_proxies, g_strfreev);
/* Trying to use something that is not a URI at all should fail. */
conn = g_socket_client_connect_to_uri (client, "asdf", 0, NULL, &error);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_clear_error (&error);
g_clear_pointer (&last_proxies, g_strfreev);
/* Should still fail if using GProxyResolver directly. */
g_proxy_resolver_lookup (g_proxy_resolver_get_default (), "asdf", NULL, &error);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_clear_error (&error);
}
static void
test_invalid_uris_async (gpointer fixture,
gconstpointer user_data)
{
GSocketConnection *conn;
GSocketConnection *conn = NULL;
GError *error = NULL;
gchar *uri;
......@@ -1204,29 +1230,44 @@ test_invalid_uris_async (gpointer fixture,
* we should succeed.
*/
uri = g_strdup_printf ("invalid-then-simple://127.0.0.1:%u", server.server_port);
conn = NULL;
g_socket_client_connect_to_uri_async (client, uri, 0, NULL,
async_got_conn, &conn);
g_free (uri);
while (conn == NULL)
g_main_context_iteration (NULL, TRUE);
do_echo_test (conn);
g_object_unref (conn);
g_clear_object (&conn);
g_clear_pointer (&last_proxies, g_strfreev);
/* If the proxy resolver returns a valid URI before an invalid URI,
* we should succeed.
*/
uri = g_strdup_printf ("simple-then-invalid://127.0.0.1:%u", server.server_port);
conn = NULL;
g_socket_client_connect_to_uri_async (client, uri, 0, NULL,
async_got_conn, &conn);
g_free (uri);
while (conn == NULL)
g_main_context_iteration (NULL, TRUE);
do_echo_test (conn);
g_object_unref (conn);
g_clear_object (&conn);
g_clear_pointer (&last_proxies, g_strfreev);
/* Trying to use something that is not a URI at all should fail. */
g_socket_client_connect_to_uri_async (client, "asdf", 0, NULL,
async_got_error, &error);
while (error == NULL)
g_main_context_iteration (NULL, TRUE);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_clear_error (&error);
g_clear_pointer (&last_proxies, g_strfreev);
/* Should still fail if using GProxyResolver directly. */
g_proxy_resolver_lookup_async (g_proxy_resolver_get_default (), "asdf", NULL,
async_resolver_got_error, &error);
while (error == NULL)
g_main_context_iteration (NULL, TRUE);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_clear_error (&error);
}
static void
......
......@@ -162,7 +162,7 @@ gboolean g_str_equal (gconstpointer v1,
gconstpointer v2);
/* Macro for optimization in the case it is not used as callback function */
#define g_str_equal(v1, v2) (strcmp ((v1), (v2)) == 0)
#define g_str_equal(v1, v2) (strcmp ((gconstpointer) (v1), (gconstpointer) (v2)) == 0)
GLIB_AVAILABLE_IN_ALL
guint g_str_hash (gconstpointer v);
......
......@@ -108,17 +108,6 @@ g_unix_open_pipe (int *fds,
ecode = pipe2 (fds, pipe2_flags);
if (ecode == -1 && errno != ENOSYS)
return g_unix_set_error_from_errno (error, errno);
/* Don't reassign pipes to stdin, stdout, stderr if closed meanwhile */
else if (fds[0] < 3 || fds[1] < 3)
{
int old_fds[2] = { fds[0], fds[1] };
gboolean result = g_unix_open_pipe (fds, flags, error);
close (old_fds[0]);
close (old_fds[1]);
if (!result)
g_unix_set_error_from_errno (error, errno);
}
else if (ecode == 0)
return TRUE;
/* Fall through on -ENOSYS, we must be running on an old kernel */
......@@ -127,19 +116,6 @@ g_unix_open_pipe (int *fds,
ecode = pipe (fds);
if (ecode == -1)
return g_unix_set_error_from_errno (error, errno);
/* Don't reassign pipes to stdin, stdout, stderr if closed meanwhile */
else if (fds[0] < 3 || fds[1] < 3)
{
int old_fds[2] = { fds[0], fds[1] };
gboolean result = g_unix_open_pipe (fds, flags, error);
close (old_fds[0]);
close (old_fds[1]);
if (!result)
g_unix_set_error_from_errno (error, errno);
return result;
}
if (flags == 0)
return TRUE;
......
......@@ -31,6 +31,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"
......@@ -869,23 +870,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
......
......@@ -4219,6 +4219,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)
{
......@@ -5194,6 +5270,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);
......
......@@ -2130,6 +2130,31 @@ test_transliteration (void)
g_free (out);
}
static void
test_str_equal (void)
{
const guchar *unsigned_a = (const guchar *) "a";
g_test_summary ("Test macro and function forms of g_str_equal()");
/* Test function form. */
g_assert_true ((g_str_equal) ("a", "a"));
g_assert_false ((g_str_equal) ("a", "b"));
/* Test macro form. */
g_assert_true (g_str_equal ("a", "a"));
g_assert_false (g_str_equal ("a", "b"));
/* As g_str_equal() is defined for use with GHashTable, it takes gconstpointer
* arguments, so can historically accept unsigned arguments. We need to
* continue to support that. */
g_assert_true ((g_str_equal) (unsigned_a, "a"));
g_assert_false ((g_str_equal) (unsigned_a, "b"));
g_assert_true (g_str_equal (unsigned_a, "a"));
g_assert_false (g_str_equal (unsigned_a, "b"));
}
/* Testing g_strv_contains() function with various cases */
static void
test_strv_contains (void)
......@@ -2597,6 +2622,7 @@ main (int argc,
g_test_add_func ("/strfuncs/strv-length", test_strv_length);
g_test_add_func ("/strfuncs/test-is-to-digit", test_is_to_digit);
g_test_add_func ("/strfuncs/transliteration", test_transliteration);
g_test_add_func ("/strfuncs/str-equal", test_str_equal);
return g_test_run();
}
......@@ -24,8 +24,11 @@
#include "config.h"
#include "glib-unix.h"
#include "gstdio.h"
#include <string.h>
#include <pwd.h>
#include <unistd.h>
static void
test_pipe (void)
......@@ -52,6 +55,43 @@ test_pipe (void)
g_assert (g_str_has_prefix (buf, "hello"));
}
static void
test_pipe_stdio_overwrite (void)
{
GError *error = NULL;
int pipefd[2], ret;
gboolean res;
int stdin_fd;
g_test_summary ("Test that g_unix_open_pipe() will use the first available FD, even if it’s stdin/stdout/stderr");
g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2795");
stdin_fd = dup (STDIN_FILENO);
g_assert_cmpint (stdin_fd, >, 0);
g_close (STDIN_FILENO, &error);
g_assert_no_error (error);
res = g_unix_open_pipe (pipefd, FD_CLOEXEC, &error);
g_assert_no_error (error);
g_assert_true (res);
g_assert_cmpint (pipefd[0], ==, STDIN_FILENO);
g_close (pipefd[0], &error);
g_assert_no_error (error);
g_close (pipefd[1], &error);
g_assert_no_error (error);
ret = dup2 (stdin_fd, STDIN_FILENO);
g_assert_cmpint (ret, >=, 0);
g_close (stdin_fd, &error);
g_assert_no_error (error);
}
static void
test_error (void)
{
......@@ -337,6 +377,7 @@ main (int argc,
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/glib-unix/pipe", test_pipe);
g_test_add_func ("/glib-unix/pipe-stdio-overwrite", test_pipe_stdio_overwrite);
g_test_add_func ("/glib-unix/error", test_error);
g_test_add_func ("/glib-unix/nonblocking", test_nonblocking);
g_test_add_func ("/glib-unix/sighup", test_sighup);
......
project('glib', 'c',
version : '2.74.1',
version : '2.74.2',
# NOTE: See the policy in docs/meson-version.md before changing the Meson dependency
meson_version : '>= 0.60.0',
default_options : [
......
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
"POT-Creation-Date: 2022-09-24 17:13+0000\n"
"POT-Creation-Date: 2022-10-16 12:25+0000\n"
"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
"Language-Team: Abkhazian <daniel.abzakh@gmail.com>\n"
"Language: ab\n"
......@@ -9,6 +9,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-DamnedLies-Scope: partial\n"
#: gio/gappinfo.c:335
msgid "Setting default applications not supported yet"
......@@ -2007,7 +2008,7 @@ msgstr ""
#: gio/gio-tool-mount.c:69
msgid "DEVICE"
msgstr ""
msgstr "АИҾАРТӘЫРА"
#: gio/gio-tool-mount.c:70
msgid "Unmount all mounts with the given scheme"
......@@ -2106,7 +2107,7 @@ msgstr ""
#: gio/gio-tool-rename.c:47
msgid "NAME"
msgstr ""
msgstr "АХЬӠ"
#: gio/gio-tool-rename.c:52
msgid "Rename a file."
......@@ -2985,115 +2986,115 @@ msgstr ""
msgid "Error setting extended attribute “%s”: %s"
msgstr ""
#: gio/glocalfileinfo.c:1738 gio/win32/gwinhttpfile.c:191
#: gio/glocalfileinfo.c:1732 gio/win32/gwinhttpfile.c:191
msgid " (invalid encoding)"
msgstr ""
#: gio/glocalfileinfo.c:1897 gio/glocalfileoutputstream.c:945
#: gio/glocalfileinfo.c:1891 gio/glocalfileoutputstream.c:945
#: gio/glocalfileoutputstream.c:997
#, c-format
msgid "Error when getting information for file “%s”: %s"
msgstr ""
#: gio/glocalfileinfo.c:2163
#: gio/glocalfileinfo.c:2157
#, c-format
msgid "Error when getting information for file descriptor: %s"
msgstr ""
#: gio/glocalfileinfo.c:2208
#: gio/glocalfileinfo.c:2202
msgid "Invalid attribute type (uint32 expected)"
msgstr ""
#: gio/glocalfileinfo.c:2226
#: gio/glocalfileinfo.c:2220
msgid "Invalid attribute type (uint64 expected)"
msgstr ""
#: gio/glocalfileinfo.c:2245 gio/glocalfileinfo.c:2264
#: gio/glocalfileinfo.c:2239 gio/glocalfileinfo.c:2258
msgid "Invalid attribute type (byte string expected)"
msgstr ""
#: gio/glocalfileinfo.c:2311
#: gio/glocalfileinfo.c:2305
msgid "Cannot set permissions on symlinks"
msgstr ""
#: gio/glocalfileinfo.c:2327
#: gio/glocalfileinfo.c:2321
#, c-format
msgid "Error setting permissions: %s"
msgstr ""
#: gio/glocalfileinfo.c:2378
#: gio/glocalfileinfo.c:2372
#, c-format
msgid "Error setting owner: %s"
msgstr ""
#: gio/glocalfileinfo.c:2401
#: gio/glocalfileinfo.c:2395
msgid "symlink must be non-NULL"
msgstr ""
#: gio/glocalfileinfo.c:2411 gio/glocalfileinfo.c:2430
#: gio/glocalfileinfo.c:2441
#: gio/glocalfileinfo.c:2405 gio/glocalfileinfo.c:2424
#: gio/glocalfileinfo.c:2435
#, c-format
msgid "Error setting symlink: %s"
msgstr ""
#: gio/glocalfileinfo.c:2420
#: gio/glocalfileinfo.c:2414
msgid "Error setting symlink: file is not a symlink"
msgstr ""
#: gio/glocalfileinfo.c:2492
#: gio/glocalfileinfo.c:2486
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative"
msgstr ""
#: gio/glocalfileinfo.c:2501
#: gio/glocalfileinfo.c:2495
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
msgstr ""
#: gio/glocalfileinfo.c:2511
#: gio/glocalfileinfo.c:2505
#, c-format
msgid "UNIX timestamp %lld does not fit into 64 bits"
msgstr "Аамҭалатәи адырга UNIX %lld 64 бит иакӡом"
#: gio/glocalfileinfo.c:2522
#: gio/glocalfileinfo.c:2516
#, fuzzy, c-format
msgid "UNIX timestamp %lld is outside of the range supported by Windows"
msgstr "Аамҭалатәи адырга UNIX %ll d иаҵанакцом Windows зыцхыраауа аҵакыра"
#: gio/glocalfileinfo.c:2625
#: gio/glocalfileinfo.c:2619
#, c-format
msgid "File name “%s” cannot be converted to UTF-16"
msgstr ""
#: gio/glocalfileinfo.c:2644
#: gio/glocalfileinfo.c:2638
#, c-format
msgid "File “%s” cannot be opened: Windows Error %lu"
msgstr ""
#: gio/glocalfileinfo.c:2657
#: gio/glocalfileinfo.c:2651
#, c-format
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr ""
#: gio/glocalfileinfo.c:2798 gio/glocalfileinfo.c:2810
#: gio/glocalfileinfo.c:2825
#, c-format
msgid "Error setting modification or access time: %s"
msgstr ""
#: gio/glocalfileinfo.c:2833
#: gio/glocalfileinfo.c:2848
msgid "SELinux context must be non-NULL"
msgstr ""
#: gio/glocalfileinfo.c:2840
#: gio/glocalfileinfo.c:2855
msgid "SELinux is not enabled on this system"
msgstr ""
#: gio/glocalfileinfo.c:2850
#: gio/glocalfileinfo.c:2865
#, c-format
msgid "Error setting SELinux context: %s"
msgstr ""
#: gio/glocalfileinfo.c:2947
#: gio/glocalfileinfo.c:2962
#, c-format
msgid "Setting attribute %s not supported"
msgstr ""
......@@ -5191,300 +5192,300 @@ msgstr ""
msgid "Unknown option %s"
msgstr ""
#: glib/gregex.c:474
#: glib/gregex.c:479
msgid "corrupted object"
msgstr ""
#: glib/gregex.c:476
#: glib/gregex.c:481
msgid "out of memory"
msgstr ""
#: glib/gregex.c:482
#: glib/gregex.c:487
msgid "backtracking limit reached"
msgstr ""
#: glib/gregex.c:493 glib/gregex.c:746 glib/gregex.c:775
#: glib/gregex.c:498
msgid "internal error"
msgstr ""
#: glib/gregex.c:495
#: glib/gregex.c:500
msgid "the pattern contains items not supported for partial matching"
msgstr ""
#: glib/gregex.c:497
#: glib/gregex.c:502
msgid "back references as conditions are not supported for partial matching"
msgstr ""
#: glib/gregex.c:503
#: glib/gregex.c:508
msgid "recursion limit reached"
msgstr ""
#: glib/gregex.c:505
#: glib/gregex.c:510
msgid "bad offset"
msgstr ""
#: glib/gregex.c:507
#: glib/gregex.c:512
msgid "recursion loop"
msgstr ""
#. should not happen in GRegex since we check modes before each match
#: glib/gregex.c:510
#: glib/gregex.c:515
msgid "matching mode is requested that was not compiled for JIT"
msgstr ""
#: glib/gregex.c:514
#: glib/gregex.c:536 glib/gregex.c:1838
msgid "unknown error"
msgstr ""
#: glib/gregex.c:535
#: glib/gregex.c:557
msgid "\\ at end of pattern"
msgstr ""
#: glib/gregex.c:539
#: glib/gregex.c:561
msgid "\\c at end of pattern"
msgstr ""
#: glib/gregex.c:544
#: glib/gregex.c:566
msgid "unrecognized character following \\"
msgstr ""
#: glib/gregex.c:548
#: glib/gregex.c:570
msgid "numbers out of order in {} quantifier"
msgstr ""
#: glib/gregex.c:552
#: glib/gregex.c:574
msgid "number too big in {} quantifier"
msgstr ""
#: glib/gregex.c:556
#: glib/gregex.c:578
msgid "missing terminating ] for character class"
msgstr ""
#: glib/gregex.c:560
#: glib/gregex.c:582
msgid "invalid escape sequence in character class"
msgstr ""
#: glib/gregex.c:564
#: glib/gregex.c:586
msgid "range out of order in character class"
msgstr ""
#: glib/gregex.c:569
#: glib/gregex.c:591
msgid "nothing to repeat"
msgstr ""
#: glib/gregex.c:573
#: glib/gregex.c:595
msgid "unrecognized character after (? or (?-"
msgstr ""
#: glib/gregex.c:577
#: glib/gregex.c:599
msgid "POSIX named classes are supported only within a class"
msgstr ""
#: glib/gregex.c:581
#: glib/gregex.c:603
msgid "POSIX collating elements are not supported"
msgstr ""
#: glib/gregex.c:587
#: glib/gregex.c:609
msgid "missing terminating )"
msgstr ""
#: glib/gregex.c:591
#: glib/gregex.c:613
msgid "reference to non-existent subpattern"
msgstr ""
#: glib/gregex.c:595
#: glib/gregex.c:617
msgid "missing ) after comment"
msgstr ""
#: glib/gregex.c:599
#: glib/gregex.c:621
msgid "regular expression is too large"
msgstr ""
#: glib/gregex.c:603
#: glib/gregex.c:625
msgid "malformed number or name after (?("
msgstr ""
#: glib/gregex.c:607
#: glib/gregex.c:629
msgid "lookbehind assertion is not fixed length"
msgstr ""
#: glib/gregex.c:611
#: glib/gregex.c:633
msgid "conditional group contains more than two branches"
msgstr ""
#: glib/gregex.c:615
#: glib/gregex.c:637
msgid "assertion expected after (?("
msgstr ""
#: glib/gregex.c:619
#: glib/gregex.c:641
msgid "a numbered reference must not be zero"
msgstr ""
#: glib/gregex.c:623
#: glib/gregex.c:645
msgid "unknown POSIX class name"
msgstr ""
#: glib/gregex.c:628
#: glib/gregex.c:650
msgid "character value in \\x{...} sequence is too large"
msgstr ""
#: glib/gregex.c:632
#: glib/gregex.c:654
msgid "\\C not allowed in lookbehind assertion"
msgstr ""
#: glib/gregex.c:636
#: glib/gregex.c:658
msgid "missing terminator in subpattern name"
msgstr ""
#: glib/gregex.c:640
#: glib/gregex.c:662
msgid "two named subpatterns have the same name"
msgstr ""
#: glib/gregex.c:644
#: glib/gregex.c:666
msgid "malformed \\P or \\p sequence"
msgstr ""
#: glib/gregex.c:648
#: glib/gregex.c:670
msgid "unknown property name after \\P or \\p"
msgstr ""
#: glib/gregex.c:652
#: glib/gregex.c:674
msgid "subpattern name is too long (maximum 32 characters)"
msgstr ""
#: glib/gregex.c:656
#: glib/gregex.c:678
msgid "too many named subpatterns (maximum 10,000)"
msgstr ""
#: glib/gregex.c:660
#: glib/gregex.c:682
msgid "octal value is greater than \\377"
msgstr ""
msgstr "Аабаны иҟоу аҵакы еиҳауп \\377"
#: glib/gregex.c:664
#: glib/gregex.c:686
msgid "DEFINE group contains more than one branch"
msgstr ""
#: glib/gregex.c:668
#: glib/gregex.c:690
msgid "inconsistent NEWLINE options"
msgstr ""
#: glib/gregex.c:672
#: glib/gregex.c:694
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, "
"or by a plain number"
msgstr ""
#: glib/gregex.c:677
#: glib/gregex.c:699
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr ""
#: glib/gregex.c:681
#: glib/gregex.c:703
msgid "(*VERB) not recognized"
msgstr ""
#: glib/gregex.c:685
#: glib/gregex.c:707
msgid "number is too big"
msgstr ""
#: glib/gregex.c:689
#: glib/gregex.c:711
msgid "missing subpattern name after (?&"
msgstr ""
#: glib/gregex.c:693
#: glib/gregex.c:715
msgid "different names for subpatterns of the same number are not allowed"
msgstr ""
#: glib/gregex.c:697
#: glib/gregex.c:719
msgid "(*MARK) must have an argument"
msgstr ""
#: glib/gregex.c:701
#: glib/gregex.c:723
msgid "\\c must be followed by an ASCII character"
msgstr ""
#: glib/gregex.c:705
#: glib/gregex.c:727
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr ""
#: glib/gregex.c:709
#: glib/gregex.c:731
msgid "\\N is not supported in a class"
msgstr ""
#: glib/gregex.c:713
#: glib/gregex.c:735
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr ""
#: glib/gregex.c:717 glib/gregex.c:856
#: glib/gregex.c:739 glib/gregex.c:875
msgid "code overflow"
msgstr ""
#: glib/gregex.c:721
#: glib/gregex.c:743
msgid "unrecognized character after (?P"
msgstr ""
#: glib/gregex.c:725
#: glib/gregex.c:747
msgid "overran compiling workspace"
msgstr ""
#: glib/gregex.c:729
#: glib/gregex.c:751
msgid "previously-checked referenced subpattern not found"
msgstr ""
#: glib/gregex.c:855 glib/gregex.c:1100 glib/gregex.c:2406
#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr ""
#: glib/gregex.c:1696
#: glib/gregex.c:1721
msgid "PCRE library is compiled without UTF8 support"
msgstr "Абиблиотека PCRE еизгоуп UTF-8 амаҵурада"
#: glib/gregex.c:1704
#: glib/gregex.c:1729
msgid "PCRE library is compiled with incompatible options"
msgstr "Абиблиотека PCRE еизгоуп еимарам ахышәарақәа рыла"
#: glib/gregex.c:1813
#: glib/gregex.c:1847
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr ""
#: glib/gregex.c:2848
#: glib/gregex.c:2887
msgid "hexadecimal digit or “}” expected"
msgstr "Иазыԥшуп жәаф хыԥхьаӡара змоу аԥхьаӡац, мамзар “}”"
#: glib/gregex.c:2864
#: glib/gregex.c:2903
msgid "hexadecimal digit expected"
msgstr "Иазыԥшуп жәаф хыԥхьаӡара змоу аԥхьаӡац"
#: glib/gregex.c:2904
#: glib/gregex.c:2943
msgid "missing “<” in symbolic reference"
msgstr "Иазхаӡом “<” асимволтә зхьарԥш аҟны"
#: glib/gregex.c:2913
#: glib/gregex.c:2952
msgid "unfinished symbolic reference"
msgstr "Ихырқәшам асимолтә зхьарԥш"
#: glib/gregex.c:2920
#: glib/gregex.c:2959
msgid "zero-length symbolic reference"
msgstr "Асимвотә зхьарԥш зоура ноль ыҟоу"
#: glib/gregex.c:2931
#: glib/gregex.c:2970
msgid "digit expected"
msgstr "Аԥхьаӡац азҧшра"
#: glib/gregex.c:2949
#: glib/gregex.c:2988
msgid "illegal symbolic reference"
msgstr "Иақәнагам асимволтә зхьарԥш"
#: glib/gregex.c:3012
#: glib/gregex.c:3051
msgid "stray final “\\”"
msgstr ""
#: glib/gregex.c:3016
#: glib/gregex.c:3055
msgid "unknown escape sequence"
msgstr "Еилкаам икодрку аишьҭагылазаара"
#: glib/gregex.c:3026
#: glib/gregex.c:3065
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr "Аҧсахратә текст аилыргара агха “%s” асимвол %lu аҟны : %s"
......@@ -6173,249 +6174,6 @@ msgstr ""
#, fuzzy
#, fuzzy
#, fuzzy
......@@ -7046,2774 +6804,6 @@ msgstr ""
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
#, fuzzy
......
This diff is collapsed.
This diff is collapsed.