[Xcb] Proposal: solution for alignment problem from using pointer addresses

Christian Linhart chris at DemoRecorder.com
Fri Jun 12 04:06:01 PDT 2015


Some time ago, I have implemented a compromise for implementing
alignment in structs or switches which start at positions that start with
an offset to alignment.

That compromise uses the pointer address for finding out the alignment offset. see:
http://cgit.freedesktop.org/xcb/libxcb/commit/?id=a7c75be5b1e2da32f7ce2c255972178e7d4b7598

The generally agreed assumption was that pointer addresses only come from properly aligned data such as read buffer for the display connection.

It turned out that the assumption was false:
In some cases the pointer addresses come from user-code, i.e., they are essentially random.
Thanks to Peter Hutterer for pointing that out.

So, we need another solution that does not require ABI/API changes.

Here's what I propose:
* Let the generator compute the initial alignment-offset for <switch> constructs.
  See for example the switch in <struct name="InputState"> in xinput.xml.
  It is possible to do such computations, but it is not entirely trivial.

* Make the initial alignment-offset of a struct explicit in the XML for those structs that start
  with an alignment offset.
  (I don't have an example at hand but these kind of structs do exist somewhere as far as I know.)

This solution will work under the condition that each specific struct or switch is used consistently with the same alignment offset everywhere.
(Which is a good idea anyways.)

Here's how this will look like for structs::

    <struct name="Foo">
        <initial-align-offset base="4" offset="2" />
        ...

This means that struct Foo will start with a 2-byte offset with respect to 4-byte alignment.

Default will be 0-byte offset with respect to 4-byte alignment.
So, most of the XML does not need to be changed.

For <switch>, no change in the xml will be necessary.

What do you think about that?

Chris



More information about the Xcb mailing list