diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2019-11-26 18:28:49 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2019-11-26 23:01:19 +0100 |
commit | 8ecb23418fd79f25458b35363738ebdbe8c8ff11 (patch) | |
tree | b9580363b0c6e367d6d7578c7769c88515152e86 | |
parent | d01b83df1b96172b90cf70ca2f6fdd39fe3a2539 (diff) |
libmbim-glib,message: reading string array may fail
-rw-r--r-- | build-aux/mbim-codegen/Message.py | 9 | ||||
-rw-r--r-- | build-aux/mbim-codegen/Struct.py | 4 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-message-private.h | 11 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-message.c | 40 |
4 files changed, 41 insertions, 23 deletions
diff --git a/build-aux/mbim-codegen/Message.py b/build-aux/mbim-codegen/Message.py index 57da031..fdac319 100644 --- a/build-aux/mbim-codegen/Message.py +++ b/build-aux/mbim-codegen/Message.py @@ -830,9 +830,10 @@ class Message: ' goto out;\n' ' offset += 8;\n') elif field['format'] == 'string-array': + count_early_outs += 1 inner_template += ( - ' if (out_${field} != NULL)\n' - ' _${field} = _mbim_message_read_string_array (message, _${array_size_field}, 0, offset);\n' + ' if ((out_${field} != NULL) && !_mbim_message_read_string_array (message, _${array_size_field}, 0, offset, &_${field}, error))\n' + ' goto out;\n' ' offset += (8 * _${array_size_field});\n') elif field['format'] == 'struct': count_early_outs += 1 @@ -987,6 +988,7 @@ class Message: field['format'] == 'guint32' or \ field['format'] == 'guint64' or \ field['format'] == 'string' or \ + field['format'] == 'string-array' or \ field['format'] == 'uuid' or \ field['format'] == 'struct-array' or \ field['format'] == 'ref-struct-array' or \ @@ -1160,7 +1162,8 @@ class Message: ' gchar **tmp;\n' ' guint i;\n' '\n' - ' tmp = _mbim_message_read_string_array (message, _${array_size_field}, 0, offset);\n' + ' if (!_mbim_message_read_string_array (message, _${array_size_field}, 0, offset, &tmp, &inner_error))\n' + ' goto out;\n' ' offset += (8 * _${array_size_field});\n' '\n' ' g_string_append (str, "\'");\n' diff --git a/build-aux/mbim-codegen/Struct.py b/build-aux/mbim-codegen/Struct.py index 6d422a6..2df5242 100644 --- a/build-aux/mbim-codegen/Struct.py +++ b/build-aux/mbim-codegen/Struct.py @@ -523,10 +523,12 @@ class Struct: ' goto out;\n' ' offset += 8;\n') elif field['format'] == 'string-array': + count_early_outs += 1 translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' - ' out->${field_name_underscore} = _mbim_message_read_string_array (self, out->${array_size_field_name_underscore}, relative_offset, offset);\n' + ' if (!_mbim_message_read_string_array (self, out->${array_size_field_name_underscore}, relative_offset, offset, &out->${field_name_underscore}, error))\n' + ' goto out;\n' ' offset += (8 * out->${array_size_field_name_underscore});\n') elif field['format'] == 'ipv4': inner_template += ( diff --git a/src/libmbim-glib/mbim-message-private.h b/src/libmbim-glib/mbim-message-private.h index 4b324b8..f78fa2a 100644 --- a/src/libmbim-glib/mbim-message-private.h +++ b/src/libmbim-glib/mbim-message-private.h @@ -287,12 +287,13 @@ gboolean _mbim_message_read_string (const MbimMessage *self, guint32 relative_offset, gchar **str, GError **error); +gboolean _mbim_message_read_string_array (const MbimMessage *self, + guint32 array_size, + guint32 struct_start_offset, + guint32 relative_offset_array_start, + gchar ***array, + GError **error); - -gchar **_mbim_message_read_string_array (const MbimMessage *self, - guint32 array_size, - guint32 struct_start_offset, - guint32 relative_offset_array_start); const MbimIPv4 *_mbim_message_read_ipv4 (const MbimMessage *self, guint32 relative_offset, gboolean ref); diff --git a/src/libmbim-glib/mbim-message.c b/src/libmbim-glib/mbim-message.c index 2119633..873ed31 100644 --- a/src/libmbim-glib/mbim-message.c +++ b/src/libmbim-glib/mbim-message.c @@ -340,29 +340,41 @@ _mbim_message_read_string (const MbimMessage *self, return TRUE; } -gchar ** -_mbim_message_read_string_array (const MbimMessage *self, - guint32 array_size, - guint32 struct_start_offset, - guint32 relative_offset_array_start) +gboolean +_mbim_message_read_string_array (const MbimMessage *self, + guint32 array_size, + guint32 struct_start_offset, + guint32 relative_offset_array_start, + gchar ***array, + GError **error) { - gchar **array; - guint32 offset; - guint32 i; + guint32 offset; + guint32 i; + GError *inner_error = NULL; - if (!array_size) - return NULL; + g_assert (array != NULL); - array = g_new (gchar *, array_size + 1); + if (!array_size) { + *array = NULL; + return TRUE; + } + + *array = g_new0 (gchar *, array_size + 1); for (i = 0, offset = relative_offset_array_start; i < array_size; offset += 8, i++) { /* Read next string in the OL pair list */ - _mbim_message_read_string (self, struct_start_offset, offset, &array[i], NULL); + if (!_mbim_message_read_string (self, struct_start_offset, offset, &((*array)[i]), &inner_error)) + break; } - array[i] = NULL; - return array; + if (inner_error) { + g_strfreev (*array); + g_propagate_error (error, inner_error); + return FALSE; + } + + return TRUE; } /* |