summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2019-11-26 18:28:49 +0100
committerAleksander Morgado <aleksander@aleksander.es>2019-11-26 23:01:19 +0100
commit8ecb23418fd79f25458b35363738ebdbe8c8ff11 (patch)
treeb9580363b0c6e367d6d7578c7769c88515152e86
parentd01b83df1b96172b90cf70ca2f6fdd39fe3a2539 (diff)
libmbim-glib,message: reading string array may fail
-rw-r--r--build-aux/mbim-codegen/Message.py9
-rw-r--r--build-aux/mbim-codegen/Struct.py4
-rw-r--r--src/libmbim-glib/mbim-message-private.h11
-rw-r--r--src/libmbim-glib/mbim-message.c40
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;
}
/*