From c9e72b2efdae6efd98d0a6977a7f992cf1abae4b Mon Sep 17 00:00:00 2001 From: Daniel Martin Date: Mon, 18 Nov 2013 16:24:30 +0200 Subject: [PATCH] c_client.py: Fix _sizeof() functions Currently, it is not possible to correctly iterate over the replies of some requests. For example, the list of XIDeviceInfo returned by the XIQueryDevice request from xinput2 is read as garbage starting from the second entry. The culprits are the _sizeof() used by the iterators. In the above case: int xcb_input_xi_device_info_sizeof (const void *_buffer /**< */) { char *xcb_tmp = (char *)_buffer; [...] unsigned int xcb_block_len = 0; [...] xcb_block_len += sizeof(xcb_input_xi_device_info_t); xcb_tmp += xcb_block_len; /* name */ xcb_block_len += (((_aux->name_len + 3) / 4) * 4) * sizeof(char); xcb_tmp += xcb_block_len; [...] } The problem here is that `xcb_block_len` is not zero'd right above the `/* name */` comment, causing `xcb_tmp` to be incremented by `sizeof(xcb_input_xi_device_info_t)` twice. The returned size is too large. https://bugs.freedesktop.org/show_bug.cgi?id=68387 Tested-by: Ran Benita Reviewed-by: Ran Benita Signed-off-by: Ran Benita --- src/c_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/c_client.py b/src/c_client.py index 7280004..9016d29 100644 --- a/src/c_client.py +++ b/src/c_client.py @@ -1061,6 +1061,8 @@ def _c_serialize_helper(context, complex_type, if context in ('unserialize', 'unpack', 'sizeof') and not self.var_followed_by_fixed_fields: code_lines.append('%s xcb_block_len += sizeof(%s);' % (space, self.c_type)) code_lines.append('%s xcb_tmp += xcb_block_len;' % space) + code_lines.append('%s xcb_buffer_len += xcb_block_len;' % space) + code_lines.append('%s xcb_block_len = 0;' % space) # probably not needed #_c_serialize_helper_insert_padding(context, code_lines, space, False) -- 1.8.4.2