Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • aleasto/glib
  • MggMuggins/glib
  • rnpalmer-guest/glib
  • helmutg/glib
  • hypra-team/glib
  • ubuntu-desktop-helper/glib
  • lts-team/packages/glib
  • tachi/glib
  • bigon/glib
  • erpel/glib
  • jbicha/glib
  • josch/glib
  • devrtz/glib
  • gnome-team/glib
  • laney/glib
  • pwithnall-guest/glib
16 results
Select Git revision
Show changes
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.