Commit Graph

121 Commits

Author SHA1 Message Date
Demi Marie Obenour 6d965bf6c1 tmp 2024-08-29 17:53:44 -04:00
Demi Marie Obenour cb9e1f4244 Null checks for malloc() return
Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2024-08-29 17:53:44 -04:00
Demi Marie Obenour 4a8fac2831 Overflow checks for sumof()
Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2024-08-29 17:53:44 -04:00
Demi Marie Obenour 9f0edb0b54 Add even more bounds checks
This adds checked _sizeof(), _unpack(), and _unserialize() functions.
2024-08-29 17:53:44 -04:00
Demi Marie Obenour f96f84ee45 Add some bounds checking to _reply functions
This is a step towards fixing a security vulnerability.

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2024-08-29 17:53:44 -04:00
Demi Marie Obenour 06be1d845f Use and require C11 alignof
The current implementation of ALIGNOF invokes undefined behavior, and
C11 is over 12 years old already.  Just use C11 alignof().

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2024-08-29 17:53:44 -04:00
Demi Marie Obenour 1c900f7635 Add bounds-checking variants of reply functions and fix locking
Deprecate the unsafe functions.

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2024-08-29 17:53:28 -04:00
Uli Schlachter b78d304531 Always write C code in UTF-8
Some people apparently use non-utf8 locales and this caused errors when
xcb-proto started using some "fancy" quote marks. Fix this by always
using utf8 encoding.

Fixes: https://gitlab.freedesktop.org/xorg/lib/libxcb/-/issues/72
Signed-off-by: Uli Schlachter <psychon@znc.in>
2024-04-15 14:40:41 +00:00
Ilya Pominov 038636786a c_client: Fix crash in xcb_randr_set_monitor
Take into account c_need_sizeof when evaluating
xcb_protocol_request_t.count

Incorrect xcb_protocol_request_t.count causes a segmentation fault when
calling functions:
- xcb_randr_set_monitor{_checked}
- xcb_input_change_feedback_control{_checked}
- xcb_input_change_device_control{_unchecked}

Steps to reproduce:
Call xcb_randr_set_monitor() with valid arguments

OBSERVED RESULT
Segmentation fault
```
Process terminating with default action of signal 11 (SIGSEGV)
  Access not within mapped region at address 0x780
    at 0x4852925: memmove (in /usr/libexec/valgrind/vgpreload_memcheck-
amd64-linux.so)
    by 0x486967C: memcpy (string_fortified.h:29)
    by 0x486967C: send_request (xcb_out.c:59)
    by 0x486967C: send_request (xcb_out.c:46)
    by 0x486967C: xcb_send_request_with_fds64 (xcb_out.c:338)
    by 0x48699FC: xcb_send_request (xcb_out.c:359)
    by 0x4891F11: xcb_randr_set_monitor_checked (randr.c:5350)
```

EXPECTED RESULT
Function returns cookie

Amend: 77b594f958

Signed-off-by: Ilya Pominov <ipominov@astralinux.ru>
2023-04-10 20:06:52 +03:00
Demi Marie Obenour 33f3dbe369 Fix handling of documented enum parameters
Previously this would crash the code generator.

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
2022-10-16 15:44:42 -04:00
Uli Schlachter a503167f75 Improve/fix docs for reply fds functions
Fixes: https://gitlab.freedesktop.org/xorg/lib/libxcb/-/issues/56
Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-09-20 18:40:08 +00:00
Povilas Kanapickas 3c76c0579f c_client.py: Implement handling of <length> element
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2021-07-30 22:58:47 +03:00
Povilas Kanapickas bdc3f21a52 c_client: Extract _c_get_field_mapping_for_expr() 2021-07-30 22:58:46 +03:00
Povilas Kanapickas 068af21cb3 c_client.py: Use get_expr_field_names directly to resolve list fields
Using get_expr_fields() is only needed in case we are doing things that
can span multiple types easily, e.g. when deciding what data to pass via
function parameters and so on.

In _c_serialize_helper_list_field() we are building function body, so
acquiring field names via get_expr_field_names() is enough.

Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2021-07-30 22:58:45 +03:00
Povilas Kanapickas 4d678b162b c_client.py: Extract get_expr_field_names()
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2021-07-30 22:58:44 +03:00
Alan Coopersmith 542befe40a c_client: fix "adress" typo
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2019-01-07 14:42:53 -08:00
Daniel Stone a3e9821bec c_client: Add support for lists of FDs
Matching xcbgen changes, add support having a ListType which contains
file descriptors. Use this to send a variable number of FDs to the
server, including when the list size is not fixed.

Signed-off-by: Daniel Stone <daniels@collabora.com>
2017-06-05 20:36:50 +01:00
Daniel Stone c7aa4e682f c_client: Don't serialise non-wire fields
For when we have a variable-sized field followed by a fixed field, make
sure we do not serialise non-wire fields.

Signed-off-by: Daniel Stone <daniels@collabora.com>
2017-06-05 20:36:50 +01:00
Christian Linhart ee9dfc9a76 add support for eventstruct
eventstruct allows to use events as part of requests.
This is, e.g., needed by xcb_input_send_extension_event.

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2017-03-11 10:51:50 +01:00
Christian Linhart 9bce1f72e3 move symbol lookup of sumof expr to the parser
replace the complicated symboltable lookup for sumof expr
by accessing the lenfield of the expr-object.

This requires the corresponding patch for xcb/proto
which sets the lenfield accordingly.

This should be OK because for official releases we define
that dependency in the build system.

For getting versions off the HEAD of the git repo, it should
be obvious that xcb/proto and xcb/libxcb have to be updated together.

I have tested this patch and it generates exactly the same code
as before.

Tested-by: Christian Linhart <chris@demorecorder.com>
Signed-off-by: Christian Linhart <chris@demorecorder.com>
2017-03-11 10:51:11 +01:00
Thomas Klausner 8740a288ca Fix inconsistent use of tabs vs. space.
Needed for at least python-3.5.x.

Signed-off-by: Thomas Klausner <wiz@NetBSD.org>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2016-05-28 12:20:59 +02:00
Christian Linhart b3516102b4 do not serialize pads by default anymore
Pads should not be serialized/deserialized to maintain
ABI compatibility when adding explicit align pads.

Therefore this pad switches off serialization of pads
unless it is enforced by serialize=true in the xml-definition
of that pad

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2016-02-01 07:53:28 +01:00
Jaya Tiwari c03388ff9e calculate lengthless list
Some rework done by Christian Linhart

Signed-off-by: Jaya Tiwari <tiwari.jaya18@gmail.com>
Signed-off-by: Christian Linhart <chris@demorecorder.com>
2016-01-06 02:34:28 +01:00
Christian Linhart 7758257567 Fix handling of align-pads in end-iterators
If a list is preceded by an align-pad, then
accessor for the end-iterator returned a wrong
value.

Reason: the length of the align-iterator was added
to a pointer of list-member type. Therefore, the length
was multiplied by the size of the list-member type,
due to C pointer arithmetic rules.

This has looked like the following, e.g., in
xcb_randr_get_crtc_transform_pending_params_end:

i.data = ((xcb_render_fixed_t *) prev.data) + ((-prev.index) & (4 - 1)) + (R->pending_nparams);

This bug was introduced with the following commit:
http://cgit.freedesktop.org/xcb/libxcb/commit/?id=4033d39d4da21842bb1396a419dfc299591c3b1f

The fix handles this by casting to char* before adding the align,
and then casting the result to the member type.

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2016-01-06 02:23:28 +01:00
Christian Linhart 32a2189183 set the align-offset as provided by proto
instead of using the lower bits of the pointer address.
This fixes a bug reported by Peter Hutterer in off-list communication
back in June 2015.

This requires the alignment-checker patches in xcb/proto.

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2016-01-06 02:09:56 +01:00
Christian Linhart 4033d39d4d make lists after align-pads work
Handle align-pads when generating an end-function
in the same way as handling them when generating
an accessor or iterator function.

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2015-08-13 18:06:43 +02:00
Christian Linhart b15c96f950 make support for server side stuff optional
and make it disabled by default with an EXPERIMENTAL warning

reason: this feature is unfinished and we want to have flexibility for
ABI/API changes, while still being able to make a release soon

Signed-off-by: Christian Linhart <chris@demorecorder.com>
2015-07-04 16:25:23 +02:00
Uli Schlachter 658fb4a5f0 Code generator: Use xcb_send_request_with_fds()
Signed-off-by: Uli Schlachter <psychon@znc.in>
2015-06-12 09:39:13 +02:00
Ran Benita bbdf1d133f c_client.py: don't generate useless empty /** < */ comments
(This does not change doxygen's output or warnings).

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-05-30 11:36:13 +02:00
Ran Benita ff6cb3913b c_client.py: use pattern matching with enumerate()
Signed-off-by: Ran Benita <ran234@gmail.com>
2015-05-30 11:16:43 +02:00
Ran Benita a90be9955d c_client.py: make condition easier to follow in _c_complex()
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 12:25:58 +01:00
Ran Benita f9f925107e c_client.py: don't add /* <name> */ before references to 'S'
The name can be understood from the type of S already.

For examples, look for 'S->' in xkb.c or xinput.c.

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
Reviewed-by: Rémi Cardona <remi@gentoo.org>
2015-03-15 12:22:32 +01:00
Ran Benita 17f9bda6c2 c_client.py: remove duplicated `cookie_type` argument for requests
It is implied already inside the function by the `void` argument.

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 12:19:07 +01:00
Ran Benita c65005e9d0 c_client.py: spell out keyword arguments in c_request() for clarity
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 12:11:59 +01:00
Ran Benita 6872e92582 c_client.py: simplify _c_reply_has_fds()
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 12:05:37 +01:00
Ran Benita 8bf8b62316 c_client.py: remove commented debug statements
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 12:03:27 +01:00
Ran Benita ec435aebd6 c_client.py: use C99 initializers instead of comments
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 11:52:38 +01:00
Ran Benita 89498d1d45 c_client.py: remove end-of-function comments
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 11:42:16 +01:00
Ran Benita 2871d4b1b8 c_client.py: no need to compare bools to True/False
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 11:39:00 +01:00
Ran Benita 30976e5255 c_client.py: use "foo".join() instead of reduce
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 11:36:23 +01:00
Ran Benita 0ab52cbcc6 c_client.py: fix indentation
(Also remove unnecessary parens around the condition).

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 11:23:30 +01:00
Ran Benita 80341d5df3 c_client.py: use comprehensions instead of map/filter
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 10:42:32 +01:00
Ran Benita 86ea6645d9 c_client.py: use print as a function for python3 compatibility
This works for all python>=2.6, which is what configure requires.

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 10:27:39 +01:00
Ran Benita 70d32ce7d8 c_client.py: fix pyflakes errors
c_client.py:2: 'from xml.etree.cElementTree import *' used; unable to detect undefined names
c_client.py:3: 'basename' imported but unused
c_client.py:9: 'time' imported but unused
c_client.py:1437: local variable 'list_obj' is assigned to but never used
c_client.py:1745: local variable 'varfield' is assigned to but never used
c_client.py:2050: local variable 'length' is assigned to but never used
c_client.py:2416: local variable 'R_obj' is assigned to but never used
c_client.py:2441: local variable 'S_obj' is assigned to but never used

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 10:22:38 +01:00
Ran Benita 12d23b934f c_client.py: simplify maximum expression
Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 10:09:39 +01:00
Ran Benita 1b37d6ad3a c_client.py: remove unneeded call to get_serialize_params()
The results are not used, and the function doesn't have side effects.

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>
2015-03-15 10:03:12 +01:00
Jaya Tiwari e3ec1f7463 Adding accessors for requests
Added accessor functions for requests the same way they were added for
structs,events and replies.
Lists for replies have accessor functions now.

Signed-off-by: Jaya Tiwari <tiwari.jaya18@gmail.com>
Reviewed-by: Christian Linhart <chris@demorecorder.com>

Comment from the Reviewer Christian Linhart:
I have tested your patch after fixing the issues with the patch-format.
It looks good:
* only adds new functions, and does not modify existing functions.
  Therefore it is API and ABI compatible.

* adds accessors for varsized-stuff in requests.
  This is needed for server-side XCB and may be useful for implementing X11-protocol proxies.
2015-02-22 11:56:04 +01:00
Christian Linhart c6f3fb2529 generator: support parametrized structs
Parametrized structs contain paramref expressions which
refer to the value of a field defined in the context
where the struct is used.

Implementing the parametrized structs turned out
to be somewhat easier than previously thought
because the generator already had some support for type-parametrization
because this is needed when case or bitcase refers to fields outside
of the switch.

So I decided to go with the flow and to implement the solution
which best fits the current implementation.

I did the following:
* I provided a way to specify fieldref with an explicitely given type:
  This resulted in <paramref type="CARD8>fieldname</paramref>
  A paramref is just a fieldref with an explicit type.
  The type is necessary because there is no local field of that
  name where the type can be derived from.

* then I tested it and made several changes in the generator
  such that it really works.

Basically the generated code is as follows:
* The parameter appears on the parameter list of the
  sizeof-function of the parametrized struct.
  When that function gets called, an appropriate argument is supplied.

* The parameter also appears as an additional member of the iterator-struct
  for the iterator of lists of that parametrized struct.
  This way, the next-function can get the value of that parameter from the iterator.
  When the iterator is created, this iterator-member is set accordingly.

* When the paramref appears in the length-expression of a list, then
  the parameter appears on the parameterlist of the "length" and "end" functions.
  When these functions get called, an appropriate argument is supplied.

Some comments:
* I did not implement inline structs.
  This would probably have been more complicated, and at least some additional effort.
  But that can be implemented later if needed.
  (Inline structs could probably use some code from switch-case/bitcase which is already kind of
  an inlined struct but one has to be careful not to break the functionality
  of switch-case/bitcase. Support for inline structs inside lists must probably
  be implemented from scratch...)

* The paramref expression refers to a field of the same name in the struct/request/...
  where it is used.
  So it is not possible to pass the value of arbitrary fields or even expressions
  to the parametrized struct.
  This would have been possible with the previously discussed <typearg>.
  That can be added later, if needed.
  ( Wont be too complicated )

* So this is pretty much like the proposal from Ran Benita.

changes for V2 of this patch, according to suggestions from Ran Benita:
* replace map with list comprehension
  because map returns an iterator instead of a list from Python 3 on,
  so it cannot be added to a list anymore.

* removed "self" parameter of function additional_params_to_str
  and accessed the variable additional_params from the outer
  function directly.

changes for V2 of this patch:
* adapt to revision 2 of patchset ListInputDevices
* style fixes for similar things that Ran Benita has found in my previous patches

Message-ID: <54574397.4060000@DemoRecorder.com>
Patch-Thread-Subject: [Xcb] parametrized structs implemented
Patch-Set: ParametrizedStruct
Patch-Number: libxcb 1/1
Patch-Version: V3
Signed-off-by: Christian Linhart <chris@DemoRecorder.com>
2014-11-03 11:23:17 +01:00
Christian Linhart 912cd97a6d generator: support listelement-ref
Support for listelement-ref needs the following three changes
(in the order as they appear in the patch):

* making the current list-element accessible with the variable
  xcb_listelement which is a pointer to the list-element

* supporting lists of simple-type for sumof with a nested expression

* using the variable for resolving a listelement-ref expression

Changes for V2 of this patch:
- adapt to removal of patch "libxcb 2/6" from patchset "ListInputDevices".

Changes for V3 of this patch:
- adapt to V2 of patch "libxcb 5/6" from patchset "ListInputDevices"

Changes for V4 of this patch:
- adapt to revision 2 of the patchset "ListInputDevices"

Message-ID: <545743A0.50907@DemoRecorder.com>
Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
Patch-Set: PopcountList
Patch-Number: libxcb 4/4
Patch-Version: V4
Signed-off-by: Christian Linhart <chris@DemoRecorder.com>
2014-11-03 11:23:17 +01:00
Christian Linhart 422458b663 generator: _c_accessor_get_length: remove buggy special case
The function _c_accessor_get_length had a special case handling
for intermixed var and fixed size fields.

However:
* The implementation of that special case was buggy:
  It tried to call a python-dict as a function which causes
  Python to abort the program with a stacktrace and error message.
  So this code was never used.

* The case it tried to handle is handeled elsewhere in the
  meantime: in _c_helper_absolute_name by previous patches
  made by me.

Message-ID: <1409845851-38950-3-git-send-email-chris@demorecorder.com>
Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
Patch-Set: PopcountList
Patch-Number: libxcb 3/4
Patch-Version: V1
Signed-off-by: Christian Linhart <chris@DemoRecorder.com>
2014-11-03 11:23:17 +01:00