9053 Commits

Author SHA1 Message Date
Guillaume Desmottes
deb495de42 glib: unicode: add tests for g_utf8_normalize()
Test corner cases and some examples from Unicode Standard Annex #15
http://unicode.org/reports/tr15/
2023-03-15 15:14:53 +00:00
Guillaume Desmottes
221bbde429 glib: unicode: fix unicode standard link 2023-03-15 15:14:53 +00:00
Xi Ruoyao
cc7f2f81cc
gstrfuncs: Improve inline version of g_strdup() to avoid breaking C++ code
Wrap the logic into a G_ALWAYS_INLINE function, instead of using a
complex statement-expression which is not allowed in braced initializer
lists and expanded into some bad thing when it's used as
`::g_strdup(...)`.

We cannot use `__builtin_constant_p (str)` because GCC documentation
clearly states that it always produces 0 when str is a const char *
argument of an inline function.  But `__builtin_constant_p (!str)`,
`__builtin_constant_p (!!str)`, and
`__builtin_constant_p (strlen (str))` functions properly with `-O1` or
above enabled.

Fixes #2936.
2023-03-15 15:18:34 +08:00
Marco Trevisan
dc59380561 Merge branch 'bookmarkfile-timings' into 'main'
tests: Change the time function used in the bookmark tests

See merge request GNOME/glib!3315
2023-03-13 11:00:13 +00:00
Christoph Reiter
94fd305dbd tests: only build messages-low-memory if RTLD_NEXT is available
This fixes the build under cygwin which doesn't have RTLD_NEXT.
Use the existing have_rtld_next to skip the test program in that case.
2023-03-12 12:29:03 +01:00
Alessandro Bono
13b564d027 gmacros: Add GCC < 5 fallback for __always_inline__
Commit 15cd0f04612c90292792c4d123ebe84bf4bf93a6 introduced a check
for the __always_inline__ attribute. However, we don't define a
fallback for GCC < 5.
2023-03-09 14:33:43 +01:00
Alessandro Bono
3bbd728868 gmacros: Sort alphabetically 2023-03-09 14:30:38 +01:00
Philip Withnall
e35f4a04cc tests: Change the time function used in the bookmark tests
The current comparison has been seen to fail on vs2017-x86
(https://gitlab.gnome.org/pwithnall/glib/-/jobs/2643197):
```
not ok /bookmarks/deprecated - GLib:ERROR:../glib/tests/bookmarkfile.c:921:test_deprecated: assertion failed (t >= now): (1678122080 >= 1678122081)
```

I guess this is caused by a mismatch between the system clock as used by
`time (NULL)` and `g_get_real_time ()` (which is ultimately what
`g_bookmark_file_set_added()` uses) on Windows.

Attempt to fix that by using `g_get_real_time()` in the test harness
too, so the clock being used is consistent.

If that doesn’t work, my next guess is that some of the code in
`test_deprecated()` is being reordered by the compiler. But that
shouldn’t happen, because the `time()` call has side-effects, and
`g_bookmark_file_set_added()` has side-effects, so they shouldn’t be
reordered with respect to each other. And certainly not so that the
latter one (in code order) ends up being called 1s after the other.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2023-03-06 18:25:42 +00:00
Philip Withnall
0df2c607a6 Merge branch 'skip-test-under-sandbox' into 'main'
tests: Skip assert-msg-test.py if gdb fails

See merge request GNOME/glib!3304
2023-03-02 17:52:33 +00:00
Dan Carpenter
774d8bd914 Fix a memory leak in g_strerror
If g_locale_to_utf8 sets a GError, it must be freed.
2023-03-02 15:46:00 +01:00
Matt Turner
19a8df9d8b tests: Skip assert-msg-test.py if gdb fails
Similar to commit 6e44151bf74d, skip the test if gdb is unable to read
/proc/PID/mem, which gdb does as a fallback if ptrace is unavailable.

This allows the test to skip when run under Gentoo's sandbox.
2023-03-02 09:36:10 -05:00
Philip Withnall
ac5589128c tests: Add some missing g_thread_join() calls to onceinit test
Running the test under asan was failing as the threads were being
leaked.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2023-02-23 12:15:13 +00:00
Philip Withnall
0a715be599 Merge branch 'cloexec-other' into 'main'
Close-on-exec flag few missed places

See merge request GNOME/glib!3292
2023-02-22 13:07:35 +00:00
Chun-wei Fan
c8730dc6f9 gmacros.h: Fix C++ macros for Visual Studio
,,,for G_ALWAYS_INLINE and G_NO_INLINE, since the msvc::forceinline and
msvc::noinline attributes require C++-20 support, not just C++-11
support.  This will avoid warning C5051 (unsupported attribute ...,
ignored) if pre-C++-20 was used.
2023-02-22 10:24:20 +08:00
Chun-wei Fan
994209dbee gstring.h: Avoid compiler warning on Visual Studio
The recent optimizations to gstring.h used G_ALWAYS_INLINE (meaning
'__forceinline' on Visual Studio) together with 'static inline', which
will cause warning C4141 indicating that 'inline' was used more than
once on the function.

Avoid this by temporarily disabling warning C4141 in gstring.h when
building the code that uses 'G_ALWAYS_INLINE'.

Fixes issue #2905.
2023-02-22 10:24:20 +08:00
Emmanuele Bassi
796e21ee1c Merge branch 'w-sign-conversion' into 'main'
tests: Add a -Wsign-conversion test for gstring.h

See merge request GNOME/glib!3275
2023-02-22 01:41:25 +00:00
Emmanuele Bassi
23d28b9d6e Merge branch '2913-error-warning' into 'main'
gerror: Emit a critical warning if the message format is NULL

Closes #2913

See merge request GNOME/glib!3286
2023-02-22 01:35:24 +00:00
Maciej S. Szmigiero
8f8ebb1bd0 g_mkstemp: Use O_CLOEXEC for race-free setting of the close-on-exec flag
mkstemp-like family of functions also use g_open () under the hood so
they should pass the O_CLOEXEC flag there for race-free setting of the
close-on-exec flag.
2023-02-22 00:38:13 +01:00
Maciej S. Szmigiero
7bee4cecdd grand: Use "e" mode flag in fopen () call for race-free setting of the close-on-exec flag
It was missed when other fopen () call sites were converted since the code
had it written as "fopen()" (without space before the opening parenthesis).
2023-02-22 00:29:31 +01:00
Philip Withnall
bd2ccc2f69 Merge branch 'fix-windows-spawn-non-english' into 'main'
spawn-test: Fix running on non-English Windows

See merge request GNOME/glib!3288
2023-02-21 17:49:31 +00:00
Maciej S. Szmigiero
0e7bf99ec2 Use "e" mode flag in fopen () calls for race-free setting of the close-on-exec flag
All Unix CRTs examined: glibc, musl, BSDs, Apple libc, Android bionic
ignore unknown fopen () mode flags, so this flag can be added
unconditionally for Unix builds.

Only Windows CRT is intolerant of these, so the single case in
g_dbus_address_connect () where the fopen () call is shared between Unix
and Windows needs appropriate platform-specific handling.

Skipped the call sites in libcharset and xdgmime copylibs.
2023-02-21 12:42:55 +00:00
Maciej S. Szmigiero
3f2e18b07c Use O_CLOEXEC in {g_,}open () calls for race-free setting of the close-on-exec flag
The remaining call sites are either Windows-only, between fork () and
exec () or in xdgmime copylib.

Hope I haven't missed any site.
2023-02-21 12:42:55 +00:00
Maciej S. Szmigiero
0f5d274871 gtestutils: Document that g_test_trap_fork () won't get close-on-exec fix
We don't want to update this function in case some crusty old third party
code might be relying on its current behavior.
Also, it is deprecated anyway and no code should be using it.
2023-02-21 12:42:55 +00:00
Maciej S. Szmigiero
05d2a1d097 gbacktrace: Use g_unix_open_pipe_internal () for creating pipes
This attempts to create the pipes with race-free setting of the
close-on-exec flag.
2023-02-21 12:42:55 +00:00
Maciej S. Szmigiero
14b5207bfa Add g_unix_open_pipe_internal () for pipes with the close-on-exec flag
Based on the existing g_unix_open_pipe () but for internal use where
returning a raw errno is needed, not a GError.
2023-02-21 12:42:55 +00:00
Chun-wei Fan
601fce37cb spawn-test: Fix running on non-English Windows
Use SetThreadUILocale() to set the UI locale to English (United States)
(en-US), and use SetConsoleOutputCP() to set the code page to en-US (codepage
437) so that g_win32_error_message() will always return the error messages in
English and ensure that the program runs in English as well, so that we
can ensure that the expected error message string can match up
regardless of the languge version of Windows that is running.
2023-02-21 16:34:31 +08:00
Philip Withnall
c4203f740c gerror: Emit a critical warning if the message format is NULL
The code has warned about this since commit 6d9f874330 in 2011.

glibc 2.37 has just started asserting if a `NULL` format is passed to
`sprintf()`, which caused the existing GLib workaround to start
asserting too.

Bite the bullet and upgrade the warning for `format != NULL` to a
critical warning. Projects have had 12 years to fix their code.

The original bug reports
(https://bugzilla.gnome.org/show_bug.cgi?id=660371,
https://bugzilla.gnome.org/show_bug.cgi?id=560482) are actually both
about a domain which is `0`, rather than a format which is `NULL`, which
gives some confidence that this change will actually impact very little
third party code.

Since it doesn’t currently need changing, I have not touched the warning
about `domain != 0`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Fixes: #2913
2023-02-20 16:41:23 +00:00
Luca Bacci
5631a6b9eb spawn-test: Remove the can_fail attribute 2023-02-17 15:57:49 +01:00
Luca Bacci
390dcc92d8 spawn-test: Use an absolute path to the system sort.exe on Windows
This way we avoid executing other kinds of sort.exe which are
available in PATH. This is useful especially on MSYS2 which
provides coreutils sort.
2023-02-17 15:29:00 +01:00
Philip Withnall
6a46aabd4c tests: Use g_assert_*() rather than g_assert() in string tests
It won’t get compiled out with `G_DISABLE_ASSERT`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2023-02-16 11:29:26 +00:00
Philip Withnall
bc53fff8a3 tests: Add a -Wsign-conversion test for gstring.h
While it’s not possible to build GLib with `-Wsign-conversion` enabled
(there are too many warnings), it would be useful to check that GLib’s
public headers can be used with `-Wsign-conversion` enabled, as some
projects want to do that. For example, dnf5 is built that way (see
issue #2919).

Add a simple regression test for this, by re-building the `gstring`
tests with `-Wsign-conversion` enabled. Since they include `glib.h`,
this will test all the public libglib headers by proxy.

Since this is a compile-only test, it doesn’t need to be installed.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Helps: #2919
2023-02-16 11:29:26 +00:00
Philip Withnall
0bdf7fcce4 tests: Fix some sign-conversion warnings in the GString tests
This will be useful for the next commit.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Helps: #2919
2023-02-16 11:29:26 +00:00
Philip Withnall
d2d1af284d gtestutils: Fix a sign-conversion warning in g_assert_cmpmem()
It was assigning the two provided lengths to internal `int` variables.
Given that memory block lengths are typically a `size_t`, this will
usually result in a warning if `-Wsign-conversion` is enabled.

Given that the internal variables are passed to `memcmp()`, which takes
`size_t`, change them to `size_t` and add an explicit cast to avoid
warnings in future.

The alternative would be to mess around with defining `__l1` and `__l2`
to using `typeof()`, but that would lead to a complete mess with the
printf placeholders and probably cause more problems than it fixes.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Helps: #2919
2023-02-16 11:29:26 +00:00
Aleš Matěj
f6d6800962 g_string_append_len_inline: fix implicit conversion changes signedness
For: https://gitlab.gnome.org/GNOME/glib/-/issues/2919
2023-02-16 10:57:48 +00:00
Simon McVittie
854fd11422 array-test: Don't rely on endianness of multi-byte numbers
The array is an array of bytes in this part of the test, so we need to
append a single byte. Previously we were reusing val (a size_t variable)
from earlier in the test, but because g_array_append_val passes the value
by reference, appending a multi-byte number to an array of bytes will
take the first byte of the number's memory representation, which has the
desired value on little-endian CPUs but is zero on big-endian, leading
to a test failure.

Resolves: https://gitlab.gnome.org/GNOME/glib/-/issues/2918
Bug-Debian: https://bugs.debian.org/1031271
Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-14 10:42:08 +00:00
Philip Withnall
a359e56f58 gutils: Remove public API decorator from g_set_user_dirs()
It’s a private API, and is not meant to be exposed in the public API.
Since it’s only used internally within libglib, we don’t have to expose
it in the public symbol table, so drop the decorator.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Helps: #2876
2023-02-13 16:14:10 +00:00
Philip Withnall
438bd5cfa1 gutils: Make g_find_program_for_path() a proper private API
It’s not meant to be exposed publicly yet (we’re not ready to stabilise
it), but it was incorrectly decorated with `GLIB_AVAILABLE_IN_2_76`.

We can’t remove the decorator and use it that way, as it’s called in
libgio, so we have to expose it using `GLIB_PRIVATE_CALL()`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Fixes: #2876
2023-02-13 16:12:07 +00:00
Emmanuele Bassi
585c7d2db6 Merge branch 'wip/smcv/symlink-detection-doc' into 'main'
fileutils: Make some sample code detect symlinks as intended

See merge request GNOME/glib!3265
2023-02-10 20:52:08 +00:00
Alex Richardson
9f8edb1e3f GVariant: ensure GVariantIter alignment for CHERI systems
For CHERI-enabled architectures such as Arm Morello we have to align the
GVariantIter to pointer alignment (16 bytes for Morello) but defining the
opaque struct as 16 gsize elements only aligns to 8 bytes.
This does not change the layout for existing architecutre since there
gsize is the same as guintptr.

Helps: https://gitlab.gnome.org/GNOME/glib/-/issues/2842
2023-02-10 18:22:20 +00:00
Alex Richardson
147777e342 GHash: Don't use SMALL_ENTRY_SIZE for CHERI
The code for SMALL_ENTRY_SIZE assumes pointers are no larger than 8 bytes,
so instead of trying to make it work disable the optimization for now.

Helps: https://gitlab.gnome.org/GNOME/glib/-/issues/2842
Co-authored-by: Graeme Jenkinson <graeme@capabilitieslimited.co.uk>
2023-02-10 18:22:20 +00:00
Alex Richardson
5d8ecac1ec Make GVariantBuilder and GVariantDict layout compatible with CHERI
Use guinptr instead if gsize. While this increases the structure size
for Morello, it is still only 256 bytes which should not matter for a
type where we expect few instances to exist at any given time.
This does not increase the size for existing architectures since gsize
is the same as guintptr for all of them.

Helps: https://gitlab.gnome.org/GNOME/glib/-/issues/2842
2023-02-10 18:22:20 +00:00
Alex Richardson
2aed76fc94 Fix GHashTableIter layout for CHERI targets
Last field needs to be pointer-size to match GHashTableIter. This happened
to work for most architecture due to alignment padding/pointer size, but
for CHERI targets with 128-bit pointers RealIter ends up being smaller
than GHashTableIter.

Helps: https://gitlab.gnome.org/GNOME/glib/-/issues/2842
2023-02-10 18:22:20 +00:00
Simon McVittie
702e606f73 Merge branch 'wip/smcv/pathbuf-windows' into 'main'
pathbuf: Treat forward slashes and backslashes as equivalent on Windows

Closes #2914

See merge request GNOME/glib!3264
2023-02-10 15:41:31 +00:00
Philip Withnall
9ab080c6ce Merge branch 'wip/smcv/gi-warnings' into 'main'
Avoid some warnings from GObject-Introspection

See merge request GNOME/glib!3266
2023-02-10 13:49:22 +00:00
Simon McVittie
ee223e8ec8 gtimezone: Avoid a nested preprocessor conditional to be nice to g-i
GObject-Introspection seems to become confused by the nested conditional
followed by an `#elif` clause for the outer conditional, and issues
this warning:

.../gtimezone.c:830: mismatched #elif  defined (G_OS_WIN32)

Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-10 13:16:01 +00:00
Simon McVittie
30352032a6 gstrfuncs: Use separate preprocessor conditionals for g-i and gtk-doc
GObject-Introspection and gtk-doc both parse C headers using regular
expressions, so they can easily be confused by non-trivial conditions.
GObject-Introspection warns about this:

    .../gstrfuncs.h:151: the __GI_SCANNER__ constant should only be used with simple #ifdef or #endif: #if  !defined (__GTK_DOC_IGNORE__) && !defined (__GI_SCANNER__)

In this case it's very easy to convert the compound expression into
nesting.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-10 13:14:42 +00:00
Simon McVittie
f6e13753aa fileutils: Make some sample code detect symlinks as intended
The sample code here wasn't a race-free version of the race-susceptible
anti-pattern, because it would have dereferenced a symlink automatically.

Fixes: 293b4923 "Clarify g_file_test() docs about TOCTOU bugs"
Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-10 13:06:04 +00:00
Simon McVittie
def7c0ac10 pathbuf: Treat forward slashes and backslashes as equivalent on Windows
The canonical directory separator is a backslash, but some Windows APIs
allow either, interchangeably. Do the same here.

Resolves: https://gitlab.gnome.org/GNOME/glib/-/issues/2914
Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-10 11:13:36 +00:00
Alex Richardson
14ae87f379 Add a (temporary) assertion that sizeof(gsize) == sizeof(guintptr)
Glib does not yet have a well defined ABI/API for architectures
where gsize != guintptr (e.g. CHERI). To enable working on bringup
for new architectures this assertion can be disabled with
`-DG_ENABLE_EXPERIMENTAL_ABI_COMPILATION`.

See https://gitlab.gnome.org/GNOME/glib/-/issues/2842

[smcv: Apply review comments from pwithnall]

Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-10 10:54:36 +00:00
Simon McVittie
73c91ef799 Revert "glib-init: Add more static assertions for gintptr, guintptr"
On closer inspection, these are redundant with stricter assertions that I
added in commit bd1e2a98 "glib-init: Statically assert more facts about
standard types", which assert that sizeof (gintptr) == sizeof (void *).

As far as I can tell, a sufficiently pedantic interpretation of Standard
C doesn't actually require (u)intptr_t to be the same size as a pointer:
it only requires that pointers can be losslessly stored in a (u)intptr_t,
which a sufficiently pathological ABI could implement by having (for
example) 32-bit pointers and a 64-bit uintptr_t just to troll us. However,
I'm fairly confident that no practically useful ABI would do this,
and certainly nobody has complained about this assertion since 2020.

Similarly, Standard C might permit an ABI where 64-bit pointers have the
first 32 bits always-zero and therefore storing the remaining bits in a
32-bit uintptr_t is lossless, but again, that would be pathological.

This reverts commit da3fc59544f36e246cd7f5a198083203199d5127.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2023-02-09 19:08:08 +00:00