[Xcb-commit] libxcb: src

Christian Linhart clinhart at kemper.freedesktop.org
Tue Jan 5 17:25:24 PST 2016


 src/c_client.py |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

New commits:
commit 775825756714eb6b8467e099cda73a03b782ea0e
Author: Christian Linhart <chris at demorecorder.com>
Date:   Tue Nov 10 12:53:04 2015 +0100

    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 at demorecorder.com>

diff --git a/src/c_client.py b/src/c_client.py
index fc34bbe..ecfebf5 100644
--- a/src/c_client.py
+++ b/src/c_client.py
@@ -1948,8 +1948,9 @@ def _c_accessors_list(self, field):
 
             _c('    xcb_generic_iterator_t prev = %s;',
                 _c_iterator_get_end(prev_varsized_field, 'R'))
-            _c('    i.data = ((%s *) prev.data) + %s + (%s);', field.type.c_wiretype,
-                align_pad, _c_accessor_get_expr(field.type.expr, fields))
+            _c('    i.data = ((%s *) ((char*) prev.data + %s)) + (%s);',
+                field.type.c_wiretype, align_pad,
+                _c_accessor_get_expr(field.type.expr, fields))
 
         _c('    i.rem = 0;')
         _c('    i.index = (char *) i.data - (char *) %s;', param)


More information about the xcb-commit mailing list