dbus-launch: avoid asprintf(), and die gracefully on out-of-memory
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Mon, 16 Sep 2013 12:40:22 +0000 (13:40 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Tue, 8 Oct 2013 10:06:18 +0000 (11:06 +0100)
asprintf() is a GNU extension (non-portable).

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=37849
Reviewed-by: Chengwei Yang <chengwei.yang@intel.com>
tools/dbus-launch.c

index b071fcc..3899d6d 100644 (file)
@@ -222,6 +222,26 @@ xstrdup (const char *str)
   return copy;
 }
 
+static char *
+concat2 (const char *a,
+    const char *b)
+{
+  size_t la, lb;
+  char *ret;
+
+  la = strlen (a);
+  lb = strlen (b);
+
+  ret = malloc (la + lb + 1);
+
+  if (ret == NULL)
+    return NULL;
+
+  memcpy (ret, a, la);
+  memcpy (ret + la, b, lb + 1);
+  return ret;
+}
+
 typedef enum
 {
   READ_STATUS_OK,    /**< Read succeeded */
@@ -1114,11 +1134,15 @@ main (int argc, char **argv)
         {
           if (config_file == NULL && getenv ("DBUS_TEST_DATA") != NULL)
             {
-              ret = asprintf (&config_file, "%s/valid-config-files/session.conf",
-                        getenv ("DBUS_TEST_DATA"));
+              config_file = concat2 (getenv ("DBUS_TEST_DATA"),
+                  "/valid-config-files/session.conf");
+
+              if (config_file == NULL)
+                {
+                  fprintf (stderr, "Out of memory\n");
+                  exit (1);
+                }
             }
-            if (ret == -1 && config_file != NULL)
-              free (config_file);
 
           execl (TEST_BUS_BINARY,
                  TEST_BUS_BINARY,