glib/fuzzing
Philip Withnall 7aeb4d94f2
gcharset: Fix potential negative string offsets in g_get_locale_variants()
The parser was assuming that all three separators (`_@.`) were in order;
but the input might not contain them in order. In that case, the parser
would have passed negative values to `g_strndup()` which would have been
implicitly cast to large positive values, and potentially exposed a lot
of memory (until the first nul byte, which was probably quite soon).

Expand the existing `g_get_locale_variants()` test to cover some invalid
parsing, and add a fuzzing test too.

Spotted by `-Wsign-conversion`.

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

Helps: #3405
2025-04-11 14:02:51 +01:00
..
2018-10-11 00:02:03 +00:00

Fuzz targets used by oss-fuzz.

Useful links: Dashboard (requires access), Build logs, Coverage

How to add new targets

Add fuzz_target_name.c and edit meson.build accordingly.

New targets are picked up by oss-fuzz automatically within a day. Targets must not be renamed once added.

Add (optional) fuzz_target_name.dict containing keywords and magic bytes.

Add (optional) fuzz_target_name.corpus with file names on separate lines. Wildcards ?, * and ** are supported. Examples below.

glib/*  # all files in directory glib
glib/** # all files in directory glib and sub-directories
**.xbel # all files ending with .xbel in the repository

Recommended reading: Fuzz Target, Dictionaries, Corpus

How to reproduce oss-fuzz bugs locally

Build with at least the following flags, choosing a sanitizer as needed. A somewhat recent version of clang is recommended.

$ CC=clang CXX=clang++ meson DIR -Db_sanitize=<address|undefined> -Db_lundef=false

Afterwards run the affected target against the provided test case.

$ DIR/fuzzing/fuzz_target_name FILE

FAQs

What about Memory Sanitizer (MSAN)?

Correct MSAN instrumentation is difficult to achieve locally, so false positives are very likely to mask the actual bug.

If need be, you can still reproduce those bugs with the oss-fuzz provided docker images.

There are no file/function names in the stack trace.

llvm-symbolizer must be in PATH.

UndefinedBehavior Sanitizer (UBSAN) doesn't provide a stack trace.

Set environment variable UBSAN_OPTIONS to print_stacktrace=1 prior to running the target.