From 775825756714eb6b8467e099cda73a03b782ea0e Mon Sep 17 00:00:00 2001 From: Christian Linhart Date: Tue, 10 Nov 2015 12:53:04 +0100 Subject: 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 --- src/c_client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/c_client.py') 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) -- cgit v1.2.3