summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Olbrich <m.olbrich@pengutronix.de>2010-06-01 08:18:07 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2010-06-03 17:08:12 +0200
commit579ee9d90168598ed9e9f1a727fa0a4a8d2ed992 (patch)
tree831f9584e69112acef6dc4ecdf15e055a34cb95f
parentf9d407186fd7f8a6c07f9d8e191c9d928ab5c486 (diff)
downloadjson-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.c38
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,