Commit graph

128 commits

Author SHA1 Message Date
Wim Taymans
b029a2ce05 pod: don't iterate 0 sized children
That will just create and endless loop and because the child has no
size, there is not really anything to iterate.
2024-01-16 16:34:37 +01:00
Demi Marie Obenour
0227a30bcf spa: Bounds-check pointers before dereferencing them
Add a new overflow-safe function to check if region p2 of size s2 fits
completely in p1 of size s1 and, if it does, return the amount of bytes
in p1 that come after the end of p2.  Use this to bounds check the pod
iterators while ensuring that the pointer is bounds checked before being
dereferenced.

The spa_pod*_next() functions can still create an out-of-bounds pointer,
but this will not be dereferenced.  Fixing this requires either
additional complexity in these functions or forbidding POD structs,
objects, and sequences that have a length that is not a multiple of 8
bytes.

Fixes: 92ac9a355f ("spa: add spa_ptrinside")
Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2023-12-26 16:05:24 +00:00
Wim Taymans
10d3c547d1 spa: add spa_ptrinside
Add a new overflow safe function to check if region p2 of size s2 fits
completely in p1 of size s1. Use this to bounds check the pod iterators.

Fixes #3727
2023-12-20 20:18:33 +01:00
Wim Taymans
283c215641 stream: make empty objects remove the PARAM
Make sure that NULL params don't cause -EINVAL but ignore them.

Don't add empty param objects. this makes it possible to clear all previous
params by setting an empty object.
2023-12-11 13:01:10 +01:00
Dorinda Bassey
f4a56ad45d Fix some warnings
added cleanup of unused variables and fix warning about missing initializers
to resolve build warnings in pipewire-rs

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
2023-11-21 16:32:51 +00:00
Wim Taymans
779f06865c pod: add spa_auto support for dynamic builder 2023-10-11 17:27:43 +02:00
Wim Taymans
5102e4cb8d pod: handle realloc failure
When realloc fails, the original pointer is untouched so store the
result of realloc somewhere else so that we don't cause a leak.
2023-10-11 17:26:40 +02:00
Tom A. Wagner
7b40ca4f27 pod: Fix spa_pod_builder_control() return type
Fixes the return type of spa_pod_builder_control() from uint32_t to int.

Since the function returns the int returned by spa_pod_builder_raw,
the return type of the function should also be an int.
2023-08-09 12:59:09 +00:00
Wim Taymans
83d2e85f49 parser: add extra check to make coverity happy
Fixes !1473
2023-04-20 12:32:07 +02:00
Barnabás Pőcze
934ab3036e treewide: use SPDX tags to specify copyright information
SPDX tags make the licensing information easy to understand and clear,
and they are machine parseable.

See https://spdx.dev for more information.
2023-02-16 10:54:48 +00:00
Robert Mader
0f4fcd63ac filter: Better SPA_CHOICE_Step support
Allow comparing single values with step-ranges. An example where this
can be useful is when trying to encode a screencast with a hardware
encoder.
2023-01-06 11:16:52 +00:00
Demi Marie Obenour
8e43c41ac1 Add more parentheses
This was missed in the earlier MR.
2022-10-06 12:12:35 -04:00
Wim Taymans
07fd063a0d pod: fix alignment check
Use the platform specific alignment for the spa_pod instead of 8.

Fixes things on 32 bits.
2022-09-29 17:06:54 +02:00
Demi Marie Obenour
1e848fc299 SPA POD parser: fix several integer overflows
This fixes several integer overflow problems in the POD parser, as well
as fixing a returns-twice warning from GCC and integer truncation
problems in SPA_FLAG_CLEAR and SPA_ROUND_DOWN_N.  The integer overflows
can result in a tiny POD being treated as a huge one, causing
out-of-bounds reads.
2022-09-27 10:21:17 +00:00
Demi Marie Obenour
fea248d450 SPA POD parser: Fix bug when parsing choice types
spa_pod_parser_can_collect and spa_pod_parser_getv were inconsistent
with each other.  When parsing crafted POD, this could cause a type
confusion or stack overflow.
2022-09-24 15:52:53 +00:00
Demi Marie Obenour
671a7102ff Fix some badly-behaved macros
Some macros evaluated their arguments more than once when it was not
needed, or were missing parentheses.
2022-09-23 11:39:33 -04:00
Wim Taymans
7bf84fa5e2 pod: only call the overflow callback when still needed
When we are already past the size of the buffer, don't bother calling
the overflow callback anymore, the buffer is already corrupted.

Otherwise it would be possible to have the overflow callback fail the
first time around, some data will be skipped, and then the next
overflow callback would succeed, giving the impression that all is
fine.

Add a unit test for this.
2022-09-20 16:59:25 +02:00
Wim Taymans
0db8d39dd8 spa: fix compilation with c++ 2022-03-01 21:40:30 +01:00
Wim Taymans
d3a1b9fe31 spa: add dynamic builder helper
Resizes the buffer dynamically. Be careful with getting the address
of a pod in the buffer, it might not be valid after building more stuff
with the builder.
2022-03-01 20:32:58 +01:00
Barnabás Pőcze
871ba61228 spa: pod: parser: add null terminator
If the supplied buffer has smaller (or equal) size than the
length of the string, then `strncpy()` will not place a null
terminator in the buffer.

Fix that by always setting the last byte of the buffer to zero.
2021-12-21 17:05:25 +01:00
Wim Taymans
eea6e7a1fb spa: add method to check if an object is fixated
See #1732
2021-10-25 18:08:10 +02:00
Pauli Virtanen
49901f2d61 doc: add brief explanations for all groups 2021-10-04 20:55:04 +03:00
Pauli Virtanen
8159797f89 doc: reorganize Doxygen groups/modules to make more sense
The Doxygen "Modules" page is not very illuminative, as different parts
of the API are mixed together and not all parts are included.

Try to address this:

Put all parts of the public API to some Doxygen group, usually one group
per header file. Use short, systematic names.

Make these groups sub-groups of a few top-level groups, roughly
corresponding to the different logical parts of the API (core, impl,
stream, filter, spa, utilities).
2021-10-03 15:39:27 +03:00
Wim Taymans
44583367db pod: add prop option to avoid fixation
Add a DONT_FIXATE flag to spa_pod_props. The flag avoids fixation
of the property by spa_pod_fixate().

When filtering properties, 'and' the flags together in the filtered
property. This mostly preserves the merged property flags. It also
merges the DONT_FIXATE flags so that when both sides can handle
the non-fixated result, it will be returned.

This can be used to let PipeWire filter out the common property
fields and leave the final selection of fields to the producer. This can
only work when the final selected field can be transported in some
other way than the format param, like on the buffer fields or in
metadata. One use case is negotiation of the DMABUF modifiers.

See #1084
2021-07-28 11:03:26 +02:00
Peter Hutterer
a71e68e945 spa: add missing header guards and extern C define for spa/pod/filter.h 2021-06-04 18:46:29 +10:00
Peter Hutterer
07533cb708 spa: group the spa headers into doxygen modules
Subdirectories buffer, control, debug, monitor, pod, support and utils, others
are still missing. Headers are grouped either per subdirectory (e.g. buffer/
gets added to group spa_buffer) or per-file (e.g. spa_json is a separate
group), whatever seemed like the most sensible approach.
2021-05-26 07:44:55 +00:00
columbarius
d735d32eb3 spa: respect mandatory properties while filtering 2021-05-21 10:41:34 +00:00
columbarius
da566c2865 spa: add property flag SPA_POD_PROP_FLAG_MANDATORY
This flag is used to announce that the respective key is mandatory and
therefore the object containing this key is not suitable to be merged
with other objects missing it.
2021-05-21 10:41:34 +00:00
Peter Hutterer
2405f0942b spa/buffer: rename SPA_MEMBER to SPA_PTROFF
SPA_MEMBER is misleading, all we're doing here is pointer+offset and a
type-casting the result. Rename to SPA_PTROFF which is more expressive (and
has the same number of characters so we don't need to re-indent).
2021-05-06 09:39:39 +00:00
Davide Beatrici
5f09b9f4d1 pod: fix "missing-field-initializers" warnings
/usr/include/spa-0.2/spa/pod/builder.h:90:13: error: missing field '_padding' initializer [-Werror,-Wmissing-field-initializers]
        *builder = SPA_POD_BUILDER_INIT(data, size);
                   ^

/usr/include/spa-0.2/spa/pod/builder.h:90:13: error: missing field 'state' initializer [-Werror,-Wmissing-field-initializers]
        *builder = SPA_POD_BUILDER_INIT(data, size);
                   ^

/usr/include/spa-0.2/spa/pod/builder.h:90:13: error: missing field 'callbacks' initializer [-Werror,-Wmissing-field-initializers]
        *builder = SPA_POD_BUILDER_INIT(data, size);
                   ^

/usr/include/spa-0.2/spa/pod/builder.h:248:33: error: missing field '_padding' initializer [-Werror,-Wmissing-field-initializers]
        const struct spa_pod_float p = SPA_POD_INIT_Float(val);
                                       ^

/usr/include/spa-0.2/spa/pod/parser.h:56:12: error: missing field '_padding' initializer [-Werror,-Wmissing-field-initializers]
        *parser = SPA_POD_PARSER_INIT(data, size);
                  ^

/usr/include/spa-0.2/spa/pod/parser.h:56:12: error: missing field 'state' initializer [-Werror,-Wmissing-field-initializers]
        *parser = SPA_POD_PARSER_INIT(data, size);
                  ^
2021-05-05 08:03:46 +00:00
Wim Taymans
ebf324590b pod: handle various ways of making empty array/choice
Make it possible to make empty array/choice
Handle empty array/choice
Add some tests to make empty arrays/choice objects
2021-01-25 10:55:30 +01:00
Wim Taymans
c3973fd9ec pod: add a HINT_DICT flag
We can use this to mark the ROUTE_info property and hopefully improve
the debugging output later.
2020-12-18 16:40:35 +01:00
Jan Grulich
743cf58fb7 Define SPA_FALLTHROUGH to make fall-through annotations work for all compilers
This is needed for example for Clang compiler which uses different
annotations than GCC. It will make WebRTC to happily use PipeWire
since the spa library is header-only and WebRTC defaults to use
Clang with -Wimplicit-fallthrough.
2020-10-22 13:31:19 +02:00
Frank Praznik
796db2b11b builder: fix variable shadow warning 2020-10-20 19:08:25 +00:00
Wim Taymans
e030445e49 acp: add volume base and step
Add a READONLY property flag to makr properties READONLY
Set the base_volume and volume_step in the acp device
Send the base volume and step as REAONLY properties. Use these
in pulse layer.
2020-07-07 13:12:57 +02:00
Wim Taymans
cf8db93cd4 pod: add HARDWARE flag to spa_pod_prop
Add HARDWARE flag to mark a property that does some hardware control.
Mark the device volume/mute property as HARDWARE or not.
Use the HARDWARE property in pulse to set the right flags.
2020-07-06 17:46:32 +02:00
Wim Taymans
9174e5ca20 parser: handle SPA_POD_None() in parser
SPA_POD_None will have a NULL as the destination address of the pod
value, so don't try to write to that.
2020-05-06 15:45:19 +02:00
Wim Taymans
558a1f0bb2 filter: ENOSPC is the error when we can't deref 2020-04-01 12:56:17 +02:00
Wim Taymans
7a29c15628 enable more warnings
Fix some warnings
2020-04-01 12:51:42 +02:00
Wim Taymans
de22ca68da filter: return the newly filtered object
Always take the state of the builder to get the newly filtered
object, even in the case there is no filter.

Handle the case where we can't copy the pod in the case of
a NULL filter by reverting the state of the builder.

Rework the function a bit to make it possible to pass a NULL
result (to calculate the required size, for example)

Fixes #226
2020-04-01 12:44:31 +02:00
Dan Shick
2a59ef5146 Fix includes
Fixes #215
2020-03-17 11:46:28 +01:00
Wim Taymans
387fcfdc8a pod: add support for flags filter
Add macro to make flags choice from int and long.
Implement the filter for flags by or-ing the flags.
2020-03-09 12:49:14 +01:00
Wim Taymans
c3b550478a pod: document that the choice array might have excess elements
The choice array might have excess elements when the type has been
changed, for example by fixation. This is not a problem and the
excess elements should simply be ignored.
2020-02-27 16:23:12 +01:00
Wim Taymans
11086f23ea pod: add and use reserve_bytes helper 2020-02-19 11:02:00 +01:00
Wim Taymans
632c8440f8 builder: pass NULL to _raw to reserve memory 2020-02-19 09:57:57 +01:00
Wim Taymans
2a487d5fdb filter: implement filter with Step
Implement filter between Step and Range as if the Step were a
range, ignoring the step value for now.
2020-02-18 18:04:05 +01:00
Wim Taymans
919656aba3 pod: be more careful with bool 2020-01-15 18:10:54 +01:00
Michael Tretter
94ffe88b65 filter: return error if id cannot be dereferenced
If an ID cannot be de-referenced, e.g., because the builder buffer is
too small, spa_pod_filter() still reports success, but the result is
NULL. Any subsequent access to result will cause a segfault.

Return an error if no pod is found to properly propagate and handle the
error.

The segfault can be reproduced by using the v4l2 module with Vivid
devices [0], because the buffer for the v4l2 controls is too small.

[0] https://github.com/PipeWire/pipewire/issues/138
2019-12-19 15:43:04 +01:00
Wim Taymans
b681286362 pod: Use private names for variable in macros
Fixes #197
2019-12-13 13:13:22 +01:00
Wim Taymans
181c2de2ee parser: only recurse into CHOICE when 1 value
Only try to collect the CHOICE value when there is only 1 value.
This makes it possible to parse the complete choice as a SPA_Pod.
2019-12-09 12:23:24 +01:00