From: Peter Harris Date: Thu, 23 Sep 2010 01:16:51 +0000 (-0400) Subject: Make *_unserialize safe to use on buffers in-place X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=commitdiff_plain;ds=inline;h=8c1d2021ca611c1452a8d2ff2a705569e4ebd056;p=free-sw%2Fxcb%2Flibxcb Make *_unserialize safe to use on buffers in-place By calling memmove instead of memcpy, and walking the buffer backward from the end, *_unserialize is safe to use in-place. Signed-off-by: Peter Harris --- diff --git a/src/c_client.py b/src/c_client.py index 08d6ec4..a66c7e3 100644 --- a/src/c_client.py +++ b/src/c_client.py @@ -1218,12 +1218,13 @@ def _c_serialize(context, self): # unserialize: assign variable size fields individually if 'unserialize' == context: - _c(' *%s = xcb_out;', aux_ptr) - _c(' xcb_tmp = (char *)(*_aux+1);') + _c(' xcb_tmp = ((char *)*_aux)+xcb_buffer_len;') + param_fields.reverse() for field in param_fields: if not field.type.fixed_size(): - _c(' memcpy(xcb_tmp, %s, %s_len);', field.c_field_name, field.c_field_name) - _c(' xcb_tmp += %s_len;', field.c_field_name) + _c(' xcb_tmp -= %s_len;', field.c_field_name) + _c(' memmove(xcb_tmp, %s, %s_len);', field.c_field_name, field.c_field_name) + _c(' *%s = xcb_out;', aux_ptr) _c('') _c(' return xcb_buffer_len;')