dcavalca / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
Zbigniew Jędrzejewski-Szmek a52f67
From 5746ed2343512d5b94c9ce19b74972f835d5e2ed Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 794d16
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 794d16
Date: Fri, 11 Oct 2013 19:33:20 -0400
Zbigniew Jędrzejewski-Szmek 794d16
Subject: [PATCH] dbus-common: avoid leak in error path
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
src/shared/dbus-common.c:968:33: warning: Potential leak of memory pointed to by 'l'
Zbigniew Jędrzejewski-Szmek 794d16
                        return -EINVAL;
Zbigniew Jędrzejewski-Szmek 794d16
                                ^~~~~~
Zbigniew Jędrzejewski-Szmek 794d16
---
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/dbus-common.c | 20 ++++++++++----------
Zbigniew Jędrzejewski-Szmek 794d16
 1 file changed, 10 insertions(+), 10 deletions(-)
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
Zbigniew Jędrzejewski-Szmek 1cc3df
index c727cae7cd..3ba2d87c4d 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/dbus-common.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/dbus-common.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -934,7 +934,7 @@ int bus_parse_strv_iter(DBusMessageIter *iter, char ***_l) {
Zbigniew Jędrzejewski-Szmek 794d16
 int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
Zbigniew Jędrzejewski-Szmek 794d16
         DBusMessageIter sub, sub2;
Zbigniew Jędrzejewski-Szmek 794d16
         unsigned n = 0, i = 0;
Zbigniew Jędrzejewski-Szmek 794d16
-        char **l;
Zbigniew Jędrzejewski-Szmek 794d16
+        _cleanup_strv_free_ char **l = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         assert(iter);
Zbigniew Jędrzejewski-Szmek 794d16
         assert(_l);
Zbigniew Jędrzejewski-Szmek 794d16
@@ -953,6 +953,7 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
Zbigniew Jędrzejewski-Szmek 794d16
         l = new(char*, n*2+1);
Zbigniew Jędrzejewski-Szmek 794d16
         if (!l)
Zbigniew Jędrzejewski-Szmek 794d16
                 return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
+        l[0] = NULL; /* make sure that l is properly terminated at all times */
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         dbus_message_iter_recurse(iter, &sub);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
@@ -968,26 +969,25 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
Zbigniew Jędrzejewski-Szmek 794d16
                         return -EINVAL;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 l[i] = strdup(a);
Zbigniew Jędrzejewski-Szmek 794d16
-                if (!l[i]) {
Zbigniew Jędrzejewski-Szmek 794d16
-                        strv_free(l);
Zbigniew Jędrzejewski-Szmek 794d16
+                if (!l[i])
Zbigniew Jędrzejewski-Szmek 794d16
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                }
Zbigniew Jędrzejewski-Szmek 794d16
+                i++;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                l[++i] = strdup(b);
Zbigniew Jędrzejewski-Szmek 794d16
-                if (!l[i]) {
Zbigniew Jędrzejewski-Szmek 794d16
-                        strv_free(l);
Zbigniew Jędrzejewski-Szmek 794d16
+                l[i] = strdup(b);
Zbigniew Jędrzejewski-Szmek 794d16
+                if (!l[i])
Zbigniew Jędrzejewski-Szmek 794d16
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
                 i++;
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
                 dbus_message_iter_next(&sub);
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         assert(i == n*2);
Zbigniew Jędrzejewski-Szmek 794d16
         l[i] = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        if (_l)
Zbigniew Jędrzejewski-Szmek 794d16
+        if (_l) {
Zbigniew Jędrzejewski-Szmek 794d16
                 *_l = l;
Zbigniew Jędrzejewski-Szmek 794d16
+                l = NULL; /* avoid freeing */
Zbigniew Jędrzejewski-Szmek 794d16
+        }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         return 0;
Zbigniew Jędrzejewski-Szmek 794d16
 }