Based on 7de80bfe2e61d5818601ccfddbadad3b7703ed70 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 25 Jul 2014 15:38:31 +0200
Subject: [PATCH] Always check asprintf return code

There is a small number of the places in sources where we don't check
asprintf() return code and assume that after error the function
returns NULL pointer via the first argument. That's wrong, after
error the content of pointer is undefined.
---
 src/core/unit-printf.c                              |    8 ++++----
 src/cryptsetup/cryptsetup.c                         |   11 ++++++++---
 src/journal/journalctl.c                            |   16 +++++++++++-----
 src/run/run.c                                       |   20 ++++++++++----------
 src/shared/install.c                                |   15 +++++++++------
 src/systemctl/systemctl.c                           |   18 +++++++++---------
 src/tty-ask-password-agent/tty-ask-password-agent.c |    5 +++--
 7 files changed, 54 insertions(+), 39 deletions(-)

--- src/core/unit-printf.c
+++ src/core/unit-printf.c	2014-07-28 09:42:20.726235696 +0000
@@ -182,7 +182,7 @@ static int specifier_user_name(char spec
         char *printed = NULL;
         Unit *u = userdata;
         ExecContext *c;
-        int r;
+        int r = 0;
 
         assert(u);
 
@@ -208,7 +208,7 @@ static int specifier_user_name(char spec
                                 if (r < 0)
                                         return -ENODATA;
 
-                                asprintf(&printed, "%lu", (unsigned long) uid);
+                                r = asprintf(&printed, "%lu", (unsigned long) uid);
                         }
                 }
 
@@ -231,10 +231,10 @@ static int specifier_user_name(char spec
                 if (specifier == 'u')
                         printed = strdup(username);
                 else
-                        asprintf(&printed, "%lu", (unsigned long) uid);
+                        r = asprintf(&printed, "%lu", (unsigned long) uid);
         }
 
-        if (!printed)
+        if (r < 0 || !printed)
                 return -ENOMEM;
 
         *ret = printed;
--- src/cryptsetup/cryptsetup.c
+++ src/cryptsetup/cryptsetup.c	2014-07-28 00:00:00.000000000 +0000
@@ -535,13 +535,18 @@ int main(int argc, char *argv[]) {
                         description = NULL;
                 }
 
+                k = 0;
                 if (mount_point && description)
-                        asprintf(&name_buffer, "%s (%s) on %s", description, argv[2], mount_point);
+                        k = asprintf(&name_buffer, "%s (%s) on %s", description, argv[2], mount_point);
                 else if (mount_point)
-                        asprintf(&name_buffer, "%s on %s", argv[2], mount_point);
+                        k = asprintf(&name_buffer, "%s on %s", argv[2], mount_point);
                 else if (description)
-                        asprintf(&name_buffer, "%s (%s)", description, argv[2]);
+                        k = asprintf(&name_buffer, "%s (%s)", description, argv[2]);
 
+                if (k < 0) {
+                        log_oom();
+                        goto finish;
+                }
                 name = name_buffer ? name_buffer : argv[2];
 
                 k = crypt_init(&cd, argv[3]);
--- src/journal/journalctl.c
+++ src/journal/journalctl.c	2014-07-28 00:00:00.000000000 +0000
@@ -746,11 +746,17 @@ static int add_matches(sd_journal *j, ch
                                         }
                                 } else
                                         t = strappend("_EXE=", path);
-                        } else if (S_ISCHR(st.st_mode))
-                                asprintf(&t, "_KERNEL_DEVICE=c%u:%u", major(st.st_rdev), minor(st.st_rdev));
-                        else if (S_ISBLK(st.st_mode))
-                                asprintf(&t, "_KERNEL_DEVICE=b%u:%u", major(st.st_rdev), minor(st.st_rdev));
-                        else {
+                        } else if (S_ISCHR(st.st_mode)) {
+                                if (asprintf(&t, "_KERNEL_DEVICE=c%u:%u",
+                                             major(st.st_rdev),
+                                             minor(st.st_rdev)) < 0)
+                                        return -ENOMEM;
+                        } else if (S_ISBLK(st.st_mode)) {
+                                if (asprintf(&t, "_KERNEL_DEVICE=b%u:%u",
+                                             major(st.st_rdev),
+                                             minor(st.st_rdev)) < 0)
+                                        return -ENOMEM;
+                        } else {
                                 log_error("File is neither a device node, nor regular file, nor executable: %s", *i);
                                 return -EINVAL;
                         }
--- src/run/run.c
+++ src/run/run.c	2014-07-28 09:46:36.846235596 +0000
@@ -309,12 +309,12 @@ static int start_transient_service(
         _cleanup_free_ char *name = NULL;
         int r;
 
-        if (arg_unit)
+        if (arg_unit) {
                 name = unit_name_mangle_with_suffix(arg_unit, MANGLE_NOGLOB, ".service");
-        else
-                asprintf(&name, "run-%lu.service", (unsigned long) getpid());
-        if (!name)
-                return -ENOMEM;
+                if (!name)
+                        return log_oom();
+        } else if (asprintf(&name, "run-%lu.service", (unsigned long) getpid()) < 0)
+                return log_oom();
 
         r = message_start_transient_unit_new(bus, name, &m);
         if (r < 0)
@@ -436,12 +436,12 @@ static int start_transient_scope(
 
         assert(bus);
 
-        if (arg_unit)
+        if (arg_unit) {
                 name = unit_name_mangle_with_suffix(arg_unit, MANGLE_NOGLOB, ".scope");
-        else
-                asprintf(&name, "run-%lu.scope", (unsigned long) getpid());
-        if (!name)
-                return -ENOMEM;
+                if (!name)
+                        return log_oom();
+        } else if (asprintf(&name, "run-%lu.scope", (unsigned long) getpid()) < 0)
+                return log_oom();
 
         r = message_start_transient_unit_new(bus, name, &m);
         if (r < 0)
--- src/shared/install.c
+++ src/shared/install.c	2014-07-28 00:00:00.000000000 +0000
@@ -72,13 +72,16 @@ static int get_config_path(UnitFileScope
 
         case UNIT_FILE_SYSTEM:
 
-                if (root_dir && runtime)
-                        asprintf(&p, "%s/run/systemd/system", root_dir);
-                else if (runtime)
+                if (root_dir && runtime) {
+                        if (asprintf(&p, "%s/run/systemd/system", root_dir) < 0)
+                                return -ENOMEM;
+                } else if (runtime)
                         p = strdup("/run/systemd/system");
-                else if (root_dir)
-                        asprintf(&p, "%s/%s", root_dir, SYSTEM_CONFIG_UNIT_PATH);
-                else
+                else if (root_dir) {
+                        if (asprintf(&p, "%s/%s", root_dir,
+                                     SYSTEM_CONFIG_UNIT_PATH) < 0)
+                                return -ENOMEM;
+                } else
                         p = strdup(SYSTEM_CONFIG_UNIT_PATH);
 
                 break;
--- src/systemctl/systemctl.c
+++ src/systemctl/systemctl.c	2014-07-28 09:51:40.894735541 +0000
@@ -4639,11 +4639,11 @@ static int enable_sysv_units(const char
 
                 STRV_FOREACH(k, paths.unit_path) {
                         if (!isempty(arg_root))
-                                asprintf(&p, "%s/%s/%s", arg_root, *k, name);
+                                j = asprintf(&p, "%s/%s/%s", arg_root, *k, name);
                         else
-                                asprintf(&p, "%s/%s", *k, name);
+                                j = asprintf(&p, "%s/%s", *k, name);
 
-                        if (!p) {
+                        if (j < 0) {
                                 r = log_oom();
                                 goto finish;
                         }
@@ -4660,10 +4660,10 @@ static int enable_sysv_units(const char
                         continue;
 
                 if (!isempty(arg_root))
-                        asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/%s", arg_root, name);
+                        j = asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/%s", arg_root, name);
                 else
-                        asprintf(&p, SYSTEM_SYSVINIT_PATH "/%s", name);
-                if (!p) {
+                        j = asprintf(&p, SYSTEM_SYSVINIT_PATH "/%s", name);
+                if (j < 0) {
                         r = log_oom();
                         goto finish;
                 }
@@ -4676,10 +4676,10 @@ static int enable_sysv_units(const char
                         free(p);
                         p = NULL;
                         if (!isempty(arg_root))
-                                asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/boot.%s", arg_root, name);
+                                j = asprintf(&p, "%s/" SYSTEM_SYSVINIT_PATH "/boot.%s", arg_root, name);
                         else
-                                asprintf(&p, SYSTEM_SYSVINIT_PATH "/boot.%s", name);
-                        if (!p) {
+                                j = asprintf(&p, SYSTEM_SYSVINIT_PATH "/boot.%s", name);
+                        if (j < 0) {
                                 r = log_oom();
                                 goto finish;
                         }
--- src/tty-ask-password-agent/tty-ask-password-agent.c
+++ src/tty-ask-password-agent/tty-ask-password-agent.c	2014-07-28 00:00:00.000000000 +0000
@@ -102,8 +102,9 @@ static int ask_password_plymouth(
         if (accept_cached) {
                 packet = strdup("c");
                 n = 1;
-        } else
-                asprintf(&packet, "*\002%c%s%n", (int) (strlen(message) + 1), message, &n);
+        } else if (asprintf(&packet, "*\002%c%s%n", (int) (strlen(message) + 1),
+                            message, &n) < 0)
+                packet = NULL;
 
         if (!packet) {
                 r = -ENOMEM;
