summaryrefslogtreecommitdiff
path: root/glib/gvariant-serialiser.h
Commit message (Collapse)AuthorAgeFilesLines
* gvariant: Track checked and ordered offsets independentlyPhilip Withnall2022-12-131-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | The past few commits introduced the concept of known-good offsets in the offset table (which is used for variable-width arrays and tuples). Good offsets are ones which are non-overlapping with all the previous offsets in the table. If a bad offset is encountered when indexing into the array or tuple, the cached known-good offset index will not be increased. In this way, all child variants at and beyond the first bad offset can be returned as default values rather than dereferencing potentially invalid data. In this case, there was no information about the fact that the indexes between the highest known-good index and the requested one had been checked already. That could lead to a pathological case where an offset table with an invalid first offset is repeatedly checked in full when trying to access higher-indexed children. Avoid that by storing the index of the highest checked offset in the table, as well as the index of the highest good/ordered offset. Signed-off-by: Philip Withnall <pwithnall@endlessos.org> Helps: #2121
* gvariant: Don’t allow child elements of a tuple to overlap each otherPhilip Withnall2022-12-131-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | This is similar to the earlier commit which prevents child elements of a variable-sized array from overlapping each other, but this time for tuples. It is based heavily on ideas by William Manley. Tuples are slightly different from variable-sized arrays in that they contain a mixture of fixed and variable sized elements. All but one of the variable sized elements have an entry in the frame offsets table. This means that if we were to just check the ordering of the frame offsets table, the variable sized elements could still overlap interleaving fixed sized elements, which would be bad. Therefore we have to check the elements rather than the frame offsets. The logic of checking the elements up to the index currently being requested, and caching the result in `ordered_offsets_up_to`, means that the algorithmic cost implications are the same for this commit as for variable-sized arrays: an O(N) cost for these checks is amortised out over N accesses to O(1) per access. Signed-off-by: Philip Withnall <pwithnall@endlessos.org> Fixes: #2121
* gvariant: Don’t allow child elements to overlap with each otherWilliam Manley2022-12-131-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | If different elements of a variable sized array can overlap with each other then we can cause a `GVariant` to normalise to a much larger type. This commit changes the behaviour of `GVariant` with non-normal form data. If an invalid frame offset is found all subsequent elements are given their default value. When retrieving an element at index `n` we scan the frame offsets up to index `n` and if they are not in order we return an element with the default value for that type. This guarantees that elements don't overlap with each other. We remember the offset we've scanned up to so we don't need to repeat this work on subsequent accesses. We skip these checks for trusted data. Unfortunately this makes random access of untrusted data O(n) — at least on first access. It doesn't affect the algorithmic complexity of accessing elements in order, such as when using the `GVariantIter` interface. Also: the cost of validation will be amortised as the `GVariant` instance is continued to be used. I've implemented this with 4 different functions, 1 for each element size, rather than looping calling `gvs_read_unaligned_le` in the hope that the compiler will find it easy to optimise and should produce fairly tight code. Fixes: #2121
* glib: Add SPDX license headers automaticallyPhilip Withnall2022-05-181-0/+2
| | | | | | | | | | | | | | Add SPDX license (but not copyright) headers to all files which follow a certain pattern in their existing non-machine-readable header comment. This commit was entirely generated using the command: ``` git ls-files glib/*.[ch] | xargs perl -0777 -pi -e 's/\n \*\n \* This library is free software; you can redistribute it and\/or\n \* modify it under the terms of the GNU Lesser General Public/\n \*\n \* SPDX-License-Identifier: LGPL-2.1-or-later\n \*\n \* This library is free software; you can redistribute it and\/or\n \* modify it under the terms of the GNU Lesser General Public/igs' ``` Signed-off-by: Philip Withnall <pwithnall@endlessos.org> Helps: #1415
* docs: Standardize spelling of serializ*Geyslan G. Bem2021-05-101-2/+2
| | | | | | | | Changes serialis* to serializ*. Fixes: #2399 Signed-off-by: Geyslan G. Bem <geyslan@gmail.com>
* gvariant: Re-use g_variant_serialised_check() to check alignmentPhilip Withnall2018-11-061-0/+2
| | | | | | | | | | Rather than duplicating the alignment checks when constructing a new GVariant, re-use the alignment checks from GVariantSerialised. This ensures that the same checks are done everywhere in the GVariant code. Signed-off-by: Philip Withnall <withnall@endlessm.com> https://gitlab.gnome.org/GNOME/glib/issues/1342
* gvarianttype: Impose a recursion limit of 128 on variant typesPhilip Withnall2018-10-231-0/+1
| | | | | | | | | | | | | | | | | | | | | Previously, GVariant has allowed ‘arbitrary’ recursion on GVariantTypes, but this isn’t really feasible. We have to deal with GVariants from untrusted sources, and the nature of GVariantType means that another level of recursion (and hence, for example, another stack frame in your application) can be added with a single byte in a variant type signature in the input. This gives malicious input sources far too much leverage to cause deep stack recursion or massive memory allocations which can DoS an application. Limit recursion to 128 levels (which should be more than enough for anyone™), document it and add a test. This is, handily, also the limit of 64 applied by the D-Bus specification (§(Valid Signatures)), plus a bit to allow wrapping of D-Bus messages in additional layers of variants. oss-fuzz#9857 Signed-off-by: Philip Withnall <withnall@endlessm.com>
* glib/: LGPLv2+ -> LGPLv2.1+Sébastien Wilmet2017-05-241-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | All glib/*.{c,h} files have been processed, as well as gtester-report. 12 of those files are not licensed under LGPL: gbsearcharray.h gconstructor.h glibintl.h gmirroringtable.h gscripttable.h gtranslit-data.h gunibreak.h gunichartables.h gunicomp.h gunidecomp.h valgrind.h win_iconv.c Some of them are generated files, some are licensed under a BSD-style license and win_iconv.c is in the public domain. Sub-directories inside glib/: deprecated/: processed in a previous commit glib-mirroring-tab/: already LGPLv2.1+ gnulib/: not modified, the code is copied from gnulib libcharset/: a copy pcre/: a copy tests/: processed in a previous commit https://bugzilla.gnome.org/show_bug.cgi?id=776504
* Updated FSF's addressDaniel Mustieles2014-01-311-3/+1
|
* various: add GLIB_AVAILABLE_IN_ALL everywhere elseRyan Lortie2013-01-131-0/+9
| | | | | | | | | | | Add the GLIB_AVAILABLE_IN_ALL annotation to all old functions (that haven't already been annotated with the GLIB_AVAILABLE_IN_* macros or a deprecation macro). If we discover in the future that we cannot use only one macro on Windows, it will be an easy sed patch to fix that. https://bugzilla.gnome.org/show_bug.cgi?id=688681
* GVariant variable arguments, tests, cleanupsRyan Lortie2010-03-081-9/+0
| | | | | | | | | | | | Merge GVariant variable arguments support and put it under tests. Also, remove the hack of the test case directly '#include'ing .c files from glib/. Instead, create a non-installed gvariant-internal.h that the tests can include and make the symbols in it visible on the symbol table of the shared library. These symbols (as they are present in no installed header files) are not part of the API of GLib. Increase test coverage in a few other areas.
* merge the GVariant serialiserRyan Lortie2010-02-061-0/+75