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>
This commit is contained in:
Christian Linhart 2015-11-10 12:53:04 +01:00
parent 32a2189183
commit 7758257567

View File

@ -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)