Commit Graph

62 Commits

Author SHA1 Message Date
Tobias Stoeckmann
3719ac8db7 strfuncs: Check for overflows when joining strings
The functions g_strconcat, g_strjoinv and g_strjoin perform the
concatination of strings in two phases. The first phase figures out the
required amount of memory to hold the resulting string. The second
phase actually copies the strings into the allocated memory.

If the sum of the lengths of all strings to be joined exceeds G_SIZEMAX,
then phase two triggers an out of boundary write due to insufficient
amount of memory allocated.

While this sounds impossible to do at first, actually it becomes a
possibility on 32 bit systems with merely 20 MB of heap. The overflow
can actually happen if the same string is joined multiple times. See
attached unit test. While the same can be done with 64 bit systems, it
takes much more memory and a lot of time.

Fortunately the protection is rather cheap, although it adds two or
three machine instructions and branches due to testing.
2025-09-18 17:00:28 +02:00
Tobias Stoeckmann
0eef9aeb77 gstrfuncs: Check parameter validity
If string operations get the length G_MAXSIZE passed (which cannot
ever be true because terminating NUL byte would not fit), return NULL
instead of triggering out of boundary writes.
2025-08-11 22:34:09 +02:00
Philip Withnall
e570263483 tests: Add basic unit tests for g_str_is_ascii()
It turns out it’s not actually been explicitly tested before, even
though it has full code coverage through being called by other code
which is tested.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-10-03 14:31:02 +01:00
Philip Withnall
f24bb8dc19 gutilsprivate: Factor out g_isnan() helper
There are a couple of places in the code which use `isnan()` and have
platform-specific workarounds for it. Unify those, and extend the
workaround to work for msys2-mingw32.

It seems that msys2-mingw32 can’t automatically use `isnan()` in a wider
mode than `float`:
```
In file included from ../glib/gdatetime.c:60:
../glib/gdatetime.c: In function 'g_date_time_new':
../glib/gdatetime.c:1648:14: error: conversion from 'gdouble' {aka 'double'} to 'float' may change value [-Werror=float-conversion]
 1648 |       isnan (seconds) ||
      |              ^~~~~~~
cc1.exe: all warnings being treated as errors
```

See: https://gitlab.gnome.org/pwithnall/glib/-/jobs/4022715

Using it in float mode on all platforms should not change behaviour, as
a conversion from `(double) NAN` to `float` should still give `NAN`.

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

Helps: #3405
2024-07-07 17:53:19 +01:00
Philip Withnall
5fdacf78e2 tests: Check a few results in strfuncs tests
This fixes some written-but-never-read warnings from `scan-build`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2023-03-20 10:43:25 +00:00
Marco Trevisan (Treviño)
cc0fb5e77c gstrfuncs: Add inline version of g_strdup()
g_strdup() is often used to duplicate static strings, in these cases the
compiler could use a faster path because it knows the length of the
string at compile time, but this cannot happen because our g_strdup()
implementation is hidden.

To improve this case, we add a simple implementation of g_strdup() when
it is used with static or NULL strings that explicitly uses strlen,
g_malloc and memcpy to give hints to the compiler how to behave better.

This has definitely some benefits in terms of performances, causing an
iteration of 1000000 string duplication to drop from 2.7002s to 1.9428s
for a static string and from ~0.6584s to ~0.4408 for a NULL one.

Since compiler can optimize these cases quite a bit, the generated code
[2] is not increasing a lot, given that it can now avoid generating some
code or do it in few simpler steps.

Update tests to cover both inlined and non inlined cases.

[1] https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3209#note_1644383
[2] https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3209#note_1646662
2023-01-26 16:51:05 +01:00
Marco Trevisan (Treviño)
ed42f57704 tests/strfuncs: Add test for g_strdup() with empty string 2023-01-26 16:49:28 +01:00
Marco Trevisan (Treviño)
9cd90d97ae tests/strfuncs: Ensure that inlined functions really are macros
Add a compile check to ensure that the functions we have inlined are
actually macros when under gcc (and friends).
2023-01-26 16:49:28 +01:00
Philip Withnall
bcd364afef gstrfuncs: Fix regression in types accepted by g_str_equal()
The new macro form of `g_str_equal()` had stricter type checking than
the original function form. That would be nice, except it causes new
compiler warnings in third party projects, which counts as an API break
for us, so unfortunately we can’t do it.

Add some tests to prevent regressions on this again.

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

Fixes: #2809
2022-11-22 13:12:05 +00:00
Ray Strode
69b410c58a tests: Test g_str_has_prefix inside G_UNLIKELY
g_str_has_prefix uses G_UNLIKELY itself, and up
until recently, G_UNLIKELY could not be nested.

This commit adds a test that nests G_UNLIKELY to
make sure it continues to work going forward.
2022-11-04 15:07:58 -04:00
Simon McVittie
32b0dd24e3 Add a SPDX LicenseRef for the license historically used for tests
Some of GLib's unit tests are under an apparently GLib-specific
permissive license, vaguely similar to the BSD/MIT family but with the
GPL's lack-of-warranty wording. This is not on SPDX's list of
well-known licenses, so we need to use a custom license name prefixed
with LicenseRef if we want to represent this in SPDX/REUSE syntax.

Most of the newer tests seem to be licensed under LGPL-2.1-or-later
instead.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-11-02 12:34:19 +00:00
Marco Trevisan (Treviño)
0de22a8864 tests/strfuncs: Do not compare string literal with pointers
Otherwise clang would complain:

  ../glib/tests/strfuncs.c:2603:32: warning: result of comparison
    against a string literal is unspecified (use an explicit string
    comparison function instead) [-Wstring-compare]
    g_assert_true ((gpointer)str != (gpointer)"");
                                 ^  ~~~~~~~~~~~~
  ../glib/gtestutils.h:187:59: note: expanded from macro 'g_assert_true'
                                               if G_LIKELY (expr) ; else \
                                                            ^~~~
  ../glib/gmacros.h:1186:59: note: expanded from macro 'G_LIKELY'
  #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
                                                            ^~~~
  ../glib/gmacros.h:1180:8: note: expanded from macro '_G_BOOLEAN_EXPR'
     if (expr)
2022-10-24 21:34:35 +02:00
Emmanuel Fleury
c7f24df744 Check for prefix/suffix smaller than string and check for non-inlined function
* Add a test to check that smaller string than prefix/suffix are
  handled in g_str_has_*() functions.

* Add a tests on macro prefixed function and ensure that function
  itselves are tested as well.
2022-10-17 14:40:32 +02:00
Christian Hergert
49ae9b490d strfuncs: add g_set_str()
This is like our other suite of g_set_*() based APIs to simplify and
improve correctness of setters for fields, properties, and more.

This implementation specifically handles setting string values that may
point to an offset within the current string by copying before free.

strcmp() is used directly (as opposed to g_strcmp0() due to it being in
gtestutils.h as well as to increase the chance that the compiler will
hoist the implementation.

Fixes #2747
2022-10-14 16:24:41 +01:00
Loic Le Page
22b7182d2a Fix redefinition of local variable in glib/tests/strfuncs.c 2022-02-21 12:42:15 +01:00
Philip Withnall
feff097f27 gstrfuncs: Deprecate g_memdup() in favour of g_memdup2()
Unfortunately, `g_memdup()` accepts its size argument as a `guint`,
unlike most other functions which deal with memory sizes — they all use
`gsize`. `gsize` is 64 bits on 64-bit machines, while `guint` is only 32
bits. This can lead to a silent (with default compiler warnings)
truncation of the value provided by the caller. For large values, this
will result in the returned heap allocation being significantly smaller
than the caller expects, which will then lead to buffer overflow
reads/writes.

Any code using `g_memdup()` should immediately port to `g_memdup2()` and
check the pointer arithmetic around their call site to ensure there
aren’t other overflows.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
Fixes: #2319
2021-02-04 17:34:03 +00:00
Philip Withnall
f8cf0b8672 gstrfuncs: Add g_memdup2() function
This will replace the existing `g_memdup()` function, which has an
unavoidable security flaw of taking its `byte_size` argument as a
`guint` rather than as a `gsize`. Most callers will expect it to be a
`gsize`, and may pass in large values which could silently be truncated,
resulting in an undersize allocation compared to what the caller
expects.

This could lead to a classic buffer overflow vulnerability for many
callers of `g_memdup()`.

`g_memdup2()`, in comparison, takes its `byte_size` as a `gsize`.

Spotted by Kevin Backhouse of GHSL.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
Helps: GHSL-2021-045
Helps: #2319
2021-02-04 14:13:03 +00:00
Niels De Graef
6fa5c13c30 gio, glib: Use g_assert_cmpstrv where it makes sense 2020-11-14 18:17:32 +00:00
Philip Withnall
648986a290 glib: Avoid redefining GLIB_DISABLE_DEPRECATION_WARNINGS
It may be defined by the environment (we document that as being allowed)
— if so, individual files should not try to redefine it, as that causes
a preprocessor warning.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2020-07-27 15:41:09 +01:00
Philip Withnall
1ef6e84012 tests: Add some tests for expanding invalid escapes with g_strcompress()
This brings the branch coverage of `g_strcompress()` up to 100%. Yay.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2020-07-26 23:22:06 +01:00
Philip Withnall
437526675a tests: Test that UTF-8 is escaped correctly by g_strescape()
`g_strescape()` is documented as escaping UTF-8 characters, so test that
it does.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Fixes: #4
2020-07-26 23:04:37 +01:00
Philip Withnall
81ba6e54fe tests: Remove redundant non-NULL checks in g_strlcat() test
The buffer is a local array, not a pointer, so can never be NULL.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2019-05-02 13:28:55 +01:00
Philip Withnall
777a6030a6 tests: Add checks for buffer sizing in g_strlcat() tests
Just to ensure we’re passing a valid value for dest_size.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Helps: #1768
2019-05-02 13:28:27 +01:00
Philip Withnall
7541085589 tests: Increase buffer size for g_strlcat() tests
There was a buffer overflow on the last g_strlcat() call in the test.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Fixes: #1768
2019-05-02 13:27:53 +01:00
Emmanuel Fleury
4afab02376 Adding tests cases for a better coverage of glib/tests/strfuncs.c 2019-05-02 00:13:25 +01:00
Emmanuel Fleury
b3eab1deaf Fixing glib/tests/strfuncs.c to conform to new test coding standards 2019-04-30 09:43:01 +02:00
Руслан Ижбулатов
8f27aa9965 glib: update internal gnulib from upstream
https://bugzilla.gnome.org/show_bug.cgi?id=795569

Related to issue #1371.
2019-03-13 12:38:42 +00:00
Philip Withnall
a67eadbdc3 gstrfuncs: Add g_strv_equal()
This is a utility function which I find myself writing in a number of
places. Mostly in unit tests.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2018-12-17 17:16:03 +00:00
Philip Withnall
8d0a163000 gstrfuncs: Clarify that g_ascii_strtoull() accepts signed numbers
It’s perverse, but explicitly documented that strtoull() accepts numbers
with a leading minus sign (`-`) and explicitly casts them to signed
output.

g_ascii_strtoull() is documented to do what strtoull() does (but locale
independently), and its behaviour is correct. However, the documentation
could be a lot clearer about this unexpected behaviour.

Add a unit test for it too.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2018-12-04 12:51:09 +00:00
Christoph Reiter
f92d179f77 tests/strfuncs: drop some redundant test code
The loop was testing that all strings in the hash table are valid
utf-8, but the loop filling the hash table is already doing that.

https://bugzilla.gnome.org/show_bug.cgi?id=795569
2018-05-24 23:17:08 +02:00
Christoph Reiter
dad754f5bc tests/strfuncs: mingw-w64 prints 3 digits for the %e exponent
Filed and fixed upstream: https://sourceforge.net/p/mingw-w64/bugs/732/

Once we get a new release in MSYS2 or when we get better gnulib integration
this special case needs to be removed again, but for now this will do.

https://bugzilla.gnome.org/show_bug.cgi?id=795569
2018-05-24 23:17:08 +02:00
Christoph Reiter
044e65ee28 tests/strfuncs: handle unknown error codes when testing g_strerror
The tests checks that g_strerror returns unique error messages for
all error codes between 1-200, but under Windows only a small range of them
is actually used: https://msdn.microsoft.com/en-us/library/t3ayayh1.aspx

Change the test to check that the returned message is either unique or
matches the error message for unknown codes instead.

https://bugzilla.gnome.org/show_bug.cgi?id=795569
2018-05-24 23:17:08 +02:00
Krzesimir Nowak
4fe89b0437 gstrfuncs: Add replacement for string-to-number functions
Very often when we want to convert a string to number, we assume that
the string contains only a number. We have g_ascii_strto* family of
functions to do the conversion but they are awkward to use - one has
to check if errno is zero, end_ptr is not NULL and *end_ptr points to
the terminating nul and then do the bounds checking. Many projects
need this kind of functionality, so it gets reimplemented all the
time.

This commit adds some replacement functions that convert a string to a
signed or unsigned number that also follows the usual way of error
reporting - returning FALSE on failure and filling an error output
parameter.
2017-05-10 12:04:03 +02:00
Bastien Nocera
21ad4c800c gstrfuncs: Add test for g_strjoinv() behaviour
https://bugzilla.gnome.org/show_bug.cgi?id=764092
2016-04-04 15:06:57 +02:00
Dan Winship
19eb511ba4 More g_strerror() fixes
Add a check to configure.ac for strerror_r, since we don't currently
require POSIX.1-2001 conformance in general. Add back a
plain-strerror() case as a fallback, and rearrange the glibc-vs-POSIX
strerror_r() branches.

Update the docs to not claim that "not all platforms support the
strerror() function" (we require C90), but still mention the UTF-8 and
always-valid-string benefits. (And make test_strerror() check that
last part.)

https://bugzilla.gnome.org/show_bug.cgi?id=754788
2015-09-11 12:38:18 -04:00
Dan Winship
9f2e3f6b72 gtestutils: add g_assert_cmpmem()
Add a test macro to compare two buffers (which are not already known
to be the same length) for equality.

https://bugzilla.gnome.org/show_bug.cgi?id=754283
2015-08-31 13:59:48 -04:00
Matthias Clasen
30d95388e7 Test g_strerror some more
Set a locale here, so we actually do conversion, and also
run the loop far enough that we hit the 'unknown error' case.
2015-08-28 16:05:05 -04:00
Xavier Claessens
71944b1bfd gstrfuncs: Add g_strv_contains()
Includes unit tests.

https://bugzilla.gnome.org/show_bug.cgi?id=685880
2014-11-25 12:51:36 +00:00
Ryan Lortie
d7291760df tests: test transliteration API
Add some tests for the new transliteration API.

https://bugzilla.gnome.org/show_bug.cgi?id=710142
2014-02-20 18:27:24 -05:00
Chun-wei Fan
f038c629a4 glib/tests/: Avoid GCCisms and fix tests for MSVC
Skip the tests on inf/nan strings for the gvariant and strfuncs tests, and
skip the hex strings for the strtod tests in strfuncs as they are C99
features that are not yet supported by Visual C++ (even 2013).  Use a
definition for NAN and INFINITY (that is also used in PyGObject) as
atof("NaN") and atof("Infinity") simply returns 0.0 (which is not a NAN)
in Visual C++ to fix the tests running there.

Also adapt to the format of g_ascii_formatd() when dealing with 1e99.

https://bugzilla.gnome.org/show_bug.cgi?id=711047
2013-11-11 22:52:00 +08:00
Dan Winship
cc24dac3c8 glib/tests: use g_test_expect_message()
Replace some tests that used to use g_test_trap_fork() with
g_test_expect_message() instead.

https://bugzilla.gnome.org/show_bug.cgi?id=679556
2012-08-20 13:54:52 -04:00
Matthias Clasen
2c338e21d6 Improve strfuncs tests coverage 2012-08-18 14:41:35 -04:00
Ravi Sankar Guntur
aded15c9d1 glib: fix memory leaks in gutils, protocol, and strfuncs tests
https://bugzilla.gnome.org/show_bug.cgi?id=672329

Signed-off-by: Ravi Sankar Guntur <ravi.g@samsung.com>
2012-05-17 00:38:43 -04:00
Ravi Sankar Guntur
8ca2647c74 Fix to handle '\v' (vertical tab) by g_strescape() and g_strcompress().
fix enables g_strescape() and g_strcompress() to handle '\v' along with other
special characters - '\b', '\f', '\n', '\r', '\t', '\'.

https://bugzilla.gnome.org/show_bug.cgi?id=664830

Signed-off-by: Ravi Sankar Guntur <ravi.g@samsung.com>
2011-12-27 21:49:19 -05:00
Simon McVittie
fa4792c35e various tests: do not provoke SIGTRAP with -m no-undefined
Some of the GLib tests deliberately provoke warnings (or even fatal
errors) in a forked child. Normally, this is fine, but under valgrind
it's somewhat undesirable. We do want to follow fork(), so we can check
for leaks in child processes that exit gracefully; but we don't want to
be told about "leaks" in processes that are crashing, because there'd
be no point in cleaning those up anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=666116
2011-12-27 17:51:09 -05:00
Simon McVittie
29f2ced8eb various GLib tests: plug memory leaks
These don't really matter, since it's test code, but they do obscure
real leaks in the library.

Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=666115
Acked-by: Matthias Clasen <mclasen@redhat.com>
2011-12-14 12:40:16 +00:00
Matthias Clasen
b13e79da62 Don't abort if g_ascii_strtod tests fail
https://bugzilla.gnome.org/show_bug.cgi?id=652560
2011-11-29 22:54:45 -05:00
Matthias Clasen
6dde6b7f21 Add back required _XOPEN_SOURCE define
This got lost somewhere between 2.30 and now, but it is needed
for isnan(). See bug 664354, reported by Tim Mooney.
2011-11-22 19:12:48 -05:00
Ryan Lortie
3d93c44374 Mark some functions 'static' in glib/tests
This has uncovered two unused testcases in option-context.c.  They are
currently broken and require more investigation (which is probably why
they are unused).
2011-10-16 21:41:15 -04:00
Matthias Clasen
8bc8cd7aa0 Improve test coverage 2011-10-15 00:09:20 -04:00