]> code.delx.au - pulseaudio/commitdiff
Check if environ is actually set before we use it
authorLennart Poettering <lennart@poettering.net>
Tue, 16 Dec 2008 13:03:40 +0000 (14:03 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Dec 2008 13:03:40 +0000 (14:03 +0100)
Some applications seem to set **environ to NULL for various reasons.
Before we iterate through it we thus need to make sure it is actually
set to make sure we don't segfault.

Closes rhbz #473080

src/pulsecore/proplist-util.c

index 4d505f57bee5250e4d859cd75c36d0fae46f03e5..35c9985af9281cc47f5eb26ada7b714c9d5c2fe2 100644 (file)
@@ -44,27 +44,34 @@ void pa_init_proplist(pa_proplist *p) {
 
     pa_assert(p);
 
-    for (e = environ; *e; e++) {
+    if (environ) {
 
-        if (pa_startswith(*e, "PULSE_PROP_")) {
-            size_t kl = strcspn(*e+11, "=");
-            char *k;
+        /* Some applications seem to reset environ to NULL for various
+         * reasons, hence we need to check for this explicitly. See
+         * rhbz #473080 */
 
-            if ((*e)[11+kl] != '=')
-                continue;
+        for (e = environ; *e; e++) {
 
-            if (!pa_utf8_valid(*e+11+kl+1))
-                continue;
+            if (pa_startswith(*e, "PULSE_PROP_")) {
+                size_t kl = strcspn(*e+11, "=");
+                char *k;
 
-            k = pa_xstrndup(*e+11, kl);
+                if ((*e)[11+kl] != '=')
+                    continue;
 
-            if (pa_proplist_contains(p, k)) {
+                if (!pa_utf8_valid(*e+11+kl+1))
+                    continue;
+
+                k = pa_xstrndup(*e+11, kl);
+
+                if (pa_proplist_contains(p, k)) {
+                    pa_xfree(k);
+                    continue;
+                }
+
+                pa_proplist_sets(p, k, *e+11+kl+1);
                 pa_xfree(k);
-                continue;
             }
-
-            pa_proplist_sets(p, k, *e+11+kl+1);
-            pa_xfree(k);
         }
     }