diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2010-06-01 08:18:07 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2010-06-03 17:08:12 +0200 |
commit | 579ee9d90168598ed9e9f1a727fa0a4a8d2ed992 (patch) | |
tree | 831f9584e69112acef6dc4ecdf15e055a34cb95f | |
parent | f9d407186fd7f8a6c07f9d8e191c9d928ab5c486 (diff) | |
download | json-dbus-bridge-579ee9d90168598ed9e9f1a727fa0a4a8d2ed992.tar.gz json-dbus-bridge-579ee9d90168598ed9e9f1a727fa0a4a8d2ed992.tar.xz |
[src] always call dbus_message_iter_close_container
Calling dbus_message_iter_open_container without
dbus_message_iter_close_container e.g. when the message is aborted because
of an error, creates a memory leak.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r-- | src/bridge_request.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/src/bridge_request.c b/src/bridge_request.c index e7562e7..4a72324 100644 --- a/src/bridge_request.c +++ b/src/bridge_request.c @@ -281,7 +281,7 @@ int bridge_request_dbus_params_element(bridge_request_t *self, DBusMessageIter *it) { int type; - int ret; + int ret = 0; type = dbus_signature_iter_get_current_type(sigIt); @@ -322,9 +322,9 @@ int bridge_request_dbus_params_element(bridge_request_t *self, vSig, &args); ret = bridge_request_dbus_params_array(self, element, 1, vSig, &args); + dbus_message_iter_close_container(it, &args); if (ret != 0) return EINVAL; - dbus_message_iter_close_container(it, &args); } else if (type == DBUS_TYPE_ARRAY) { DBusMessageIter args; @@ -342,8 +342,6 @@ int bridge_request_dbus_params_element(bridge_request_t *self, if (cType == DBUS_TYPE_DICT_ENTRY) { ret = bridge_request_dbus_params_dict(self, element, &sigArgs, &args); - if (ret != 0) - return ret; } else { int i, len; @@ -351,23 +349,23 @@ int bridge_request_dbus_params_element(bridge_request_t *self, if (json_object_get_type(element) != json_type_array) { bridge_request_error(self, "array expected."); - return EINVAL; + ret = EINVAL; } - len = json_object_array_length(element); - for (i = 0; i < len; ++i) { - struct json_object *tmp; - DBusSignatureIter tmpSigArgs = sigArgs; - - tmp = json_object_array_get_idx(element, i); - if (!tmp) { - bridge_request_error(self, - "value expected."); - return EINVAL; + else { + len = json_object_array_length(element); + for (i = 0; i < len; ++i) { + struct json_object *tmp; + DBusSignatureIter tmpSigArgs = sigArgs; + + tmp = json_object_array_get_idx(element, i); + if (!tmp) { + bridge_request_error(self, + "value expected."); + return EINVAL; + } + ret = bridge_request_dbus_params_element(self, + tmp, &tmpSigArgs, &args); } - ret = bridge_request_dbus_params_element(self, - tmp, &tmpSigArgs, &args); - if (ret != 0) - return ret; } } dbus_message_iter_close_container(it, &args); @@ -377,7 +375,7 @@ int bridge_request_dbus_params_element(bridge_request_t *self, "unsupported json argument type."); return EINVAL; } - return 0; + return ret; } int bridge_request_dbus_params_array(bridge_request_t *self, |