Zbigniew Jędrzejewski-Szmek 794d16
From 88bef035149080be5a83f90d91d5b13cec9749e8 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:13 -0400
Zbigniew Jędrzejewski-Szmek 794d16
Subject: [PATCH] Never call qsort on potentially NULL arrays
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
This extends 62678ded 'efi: never call qsort on potentially
Zbigniew Jędrzejewski-Szmek 794d16
NULL arrays' to all other places where qsort is used and it
Zbigniew Jędrzejewski-Szmek 794d16
is not obvious that the count is non-zero.
Zbigniew Jędrzejewski-Szmek 794d16
---
Zbigniew Jędrzejewski-Szmek 794d16
 src/analyze/systemd-analyze.c     |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/cgtop/cgtop.c                 |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/core/namespace.c              | 38 ++++++++++++++++++++------------------
Zbigniew Jędrzejewski-Szmek 794d16
 src/journal/catalog.c             |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/journal/journal-file.c        |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/journal/journal-vacuum.c      |  3 +--
Zbigniew Jędrzejewski-Szmek 794d16
 src/journal/journalctl.c          |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/libsystemd-bus/bus-match.c    |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/libudev/libudev-enumerate.c   |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/nss-myhostname/netlink.c      |  3 ++-
Zbigniew Jędrzejewski-Szmek 794d16
 src/readahead/readahead-collect.c | 39 ++++++++++++++++++++++-----------------
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/cgroup-show.c          |  2 ++
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/conf-files.c           |  2 +-
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/efivars.c              |  3 +--
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/fileio.c               |  1 +
Zbigniew Jędrzejewski-Szmek 794d16
 src/shared/util.h                 | 12 ++++++++++++
Zbigniew Jędrzejewski-Szmek 794d16
 src/systemctl/systemctl.c         | 10 +++++-----
Zbigniew Jędrzejewski-Szmek 794d16
 17 files changed, 74 insertions(+), 53 deletions(-)
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c
Zbigniew Jędrzejewski-Szmek 794d16
index 27d063c..a4f15eb 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/analyze/systemd-analyze.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/analyze/systemd-analyze.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -768,7 +768,7 @@ static int list_dependencies_one(DBusConnection *bus, const char *name, unsigned
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
                 return r;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         r = acquire_boot_times(bus, &boot);
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
Zbigniew Jędrzejewski-Szmek 794d16
index cacf705..293a211 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/cgtop/cgtop.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/cgtop/cgtop.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -461,7 +461,7 @@ static int display(Hashmap *a) {
Zbigniew Jędrzejewski-Szmek 794d16
                 if (g->n_tasks_valid || g->cpu_valid || g->memory_valid || g->io_valid)
Zbigniew Jędrzejewski-Szmek 794d16
                         array[n++] = g;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(array, n, sizeof(Group*), group_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(array, n, sizeof(Group*), group_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         /* Find the longest names in one run */
Zbigniew Jędrzejewski-Szmek 794d16
         for (j = 0; j < n; j++) {
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/core/namespace.c b/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 794d16
index 16b132b..936f368 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -222,7 +222,7 @@ int setup_namespace(char** read_write_dirs,
Zbigniew Jędrzejewski-Szmek 794d16
                      strv_length(read_only_dirs) +
Zbigniew Jędrzejewski-Szmek 794d16
                      strv_length(inaccessible_dirs) +
Zbigniew Jędrzejewski-Szmek 794d16
                      (private_tmp ? 2 : 0);
Zbigniew Jędrzejewski-Szmek 794d16
-        BindMount *m, *mounts;
Zbigniew Jędrzejewski-Szmek 794d16
+        BindMount *m, *mounts = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
         int r = 0;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         if (!mount_flags)
Zbigniew Jędrzejewski-Szmek 794d16
@@ -231,27 +231,29 @@ int setup_namespace(char** read_write_dirs,
Zbigniew Jędrzejewski-Szmek 794d16
         if (unshare(CLONE_NEWNS) < 0)
Zbigniew Jędrzejewski-Szmek 794d16
                 return -errno;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        m = mounts = (BindMount *) alloca(n * sizeof(BindMount));
Zbigniew Jędrzejewski-Szmek 794d16
-        if ((r = append_mounts(&m, read_write_dirs, READWRITE)) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
-                (r = append_mounts(&m, read_only_dirs, READONLY)) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
-                (r = append_mounts(&m, inaccessible_dirs, INACCESSIBLE)) < 0)
Zbigniew Jędrzejewski-Szmek 794d16
-                return r;
Zbigniew Jędrzejewski-Szmek 794d16
+        if (n) {
Zbigniew Jędrzejewski-Szmek 794d16
+                m = mounts = (BindMount *) alloca(n * sizeof(BindMount));
Zbigniew Jędrzejewski-Szmek 794d16
+                if ((r = append_mounts(&m, read_write_dirs, READWRITE)) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (r = append_mounts(&m, read_only_dirs, READONLY)) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (r = append_mounts(&m, inaccessible_dirs, INACCESSIBLE)) < 0)
Zbigniew Jędrzejewski-Szmek 794d16
+                        return r;
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+                if (private_tmp) {
Zbigniew Jędrzejewski-Szmek 794d16
+                        m->path = "/tmp";
Zbigniew Jędrzejewski-Szmek 794d16
+                        m->mode = PRIVATE_TMP;
Zbigniew Jędrzejewski-Szmek 794d16
+                        m++;
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+                        m->path = "/var/tmp";
Zbigniew Jędrzejewski-Szmek 794d16
+                        m->mode = PRIVATE_VAR_TMP;
Zbigniew Jędrzejewski-Szmek 794d16
+                        m++;
Zbigniew Jędrzejewski-Szmek 794d16
+                }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        if (private_tmp) {
Zbigniew Jędrzejewski-Szmek 794d16
-                m->path = "/tmp";
Zbigniew Jędrzejewski-Szmek 794d16
-                m->mode = PRIVATE_TMP;
Zbigniew Jędrzejewski-Szmek 794d16
-                m++;
Zbigniew Jędrzejewski-Szmek 794d16
+                assert(mounts + n == m);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                m->path = "/var/tmp";
Zbigniew Jędrzejewski-Szmek 794d16
-                m->mode = PRIVATE_VAR_TMP;
Zbigniew Jędrzejewski-Szmek 794d16
-                m++;
Zbigniew Jędrzejewski-Szmek 794d16
+                qsort(mounts, n, sizeof(BindMount), mount_path_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+                drop_duplicates(mounts, &n);
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        assert(mounts + n == m);
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(mounts, n, sizeof(BindMount), mount_path_compare);
Zbigniew Jędrzejewski-Szmek 794d16
-        drop_duplicates(mounts, &n);
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
         /* Remount / as SLAVE so that nothing now mounted in the namespace
Zbigniew Jędrzejewski-Szmek 794d16
            shows up in the parent */
Zbigniew Jędrzejewski-Szmek 794d16
         if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/journal/catalog.c b/src/journal/catalog.c
Zbigniew Jędrzejewski-Szmek 794d16
index 7738d24..90ca008 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/journal/catalog.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/journal/catalog.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -399,7 +399,7 @@ int catalog_update(const char* database, const char* root, const char* const* di
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         assert(n == hashmap_size(h));
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(items, n, sizeof(CatalogItem), catalog_compare_func);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(items, n, sizeof(CatalogItem), catalog_compare_func);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         r = write_catalog(database, h, sb, items, n);
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
Zbigniew Jędrzejewski-Szmek 794d16
index 81c344f..425e38a 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/journal/journal-file.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/journal/journal-file.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1344,7 +1344,7 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         /* Order by the position on disk, in order to improve seek
Zbigniew Jędrzejewski-Szmek 794d16
          * times for rotating media. */
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(items, n_iovec, sizeof(EntryItem), entry_item_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(items, n_iovec, sizeof(EntryItem), entry_item_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         r = journal_file_append_entry_internal(f, ts, xor_hash, items, n_iovec, seqnum, ret, offset);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c
Zbigniew Jędrzejewski-Szmek 794d16
index 8d5effb..d4a1c6c 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/journal/journal-vacuum.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/journal/journal-vacuum.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -299,8 +299,7 @@ int journal_directory_vacuum(
Zbigniew Jędrzejewski-Szmek 794d16
                 n_list ++;
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        if (n_list > 0)
Zbigniew Jędrzejewski-Szmek 794d16
-                qsort(list, n_list, sizeof(struct vacuum_info), vacuum_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(list, n_list, sizeof(struct vacuum_info), vacuum_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         for (i = 0; i < n_list; i++) {
Zbigniew Jędrzejewski-Szmek 794d16
                 struct statvfs ss;
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 794d16
index 9a2d255..0876ee6 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/journal/journalctl.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -755,7 +755,7 @@ static int get_relative_boot_id(sd_journal *j, sd_id128_t *boot_id, int relative
Zbigniew Jędrzejewski-Szmek 794d16
                 sd_journal_flush_matches(j);
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(all_ids, count, sizeof(boot_id_t), boot_id_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(all_ids, count, sizeof(boot_id_t), boot_id_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         if (sd_id128_equal(*boot_id, SD_ID128_NULL)) {
Zbigniew Jędrzejewski-Szmek 794d16
                 if (relative > (int) count || relative <= -(int)count)
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c
Zbigniew Jędrzejewski-Szmek 794d16
index 1411167..916682a 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/libsystemd-bus/bus-match.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/libsystemd-bus/bus-match.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -768,7 +768,7 @@ int bus_match_parse(
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         /* Order the whole thing, so that we always generate the same tree */
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(components, n_components, sizeof(struct bus_match_component), match_component_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(components, n_components, sizeof(struct bus_match_component), match_component_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         /* Check for duplicates */
Zbigniew Jędrzejewski-Szmek 794d16
         for (i = 0; i+1 < n_components; i++)
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
Zbigniew Jędrzejewski-Szmek 794d16
index 8146f27..e71d766 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/libudev/libudev-enumerate.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/libudev/libudev-enumerate.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -276,7 +276,7 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume
Zbigniew Jędrzejewski-Szmek 794d16
                 size_t move_later_prefix = 0;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 udev_list_cleanup(&udev_enumerate->devices_list);
Zbigniew Jędrzejewski-Szmek 794d16
-                qsort(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
+                qsort_safe(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 max = udev_enumerate->devices_cur;
Zbigniew Jędrzejewski-Szmek 794d16
                 for (i = 0; i < max; i++) {
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/nss-myhostname/netlink.c b/src/nss-myhostname/netlink.c
Zbigniew Jędrzejewski-Szmek 794d16
index b1ef912..47a41f5 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/nss-myhostname/netlink.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/nss-myhostname/netlink.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -197,7 +197,8 @@ finish:
Zbigniew Jędrzejewski-Szmek 794d16
                 return r;
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(list, n_list, sizeof(struct address), address_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        if (n_list)
Zbigniew Jędrzejewski-Szmek 794d16
+                qsort(list, n_list, sizeof(struct address), address_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         *_list = list;
Zbigniew Jędrzejewski-Szmek 794d16
         *_n_list = n_list;
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c
Zbigniew Jędrzejewski-Szmek 794d16
index 32888ad..6b74866 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/readahead/readahead-collect.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/readahead/readahead-collect.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -536,8 +536,7 @@ done:
Zbigniew Jędrzejewski-Szmek 794d16
                 HASHMAP_FOREACH_KEY(q, p, files, i)
Zbigniew Jędrzejewski-Szmek 794d16
                         pack_file(pack, p, on_btrfs);
Zbigniew Jędrzejewski-Szmek 794d16
         } else {
Zbigniew Jędrzejewski-Szmek 794d16
-                struct item *ordered, *j;
Zbigniew Jędrzejewski-Szmek 794d16
-                unsigned k, n;
Zbigniew Jędrzejewski-Szmek 794d16
+                unsigned n;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 /* On rotating media, order things by the block
Zbigniew Jędrzejewski-Szmek 794d16
                  * numbers */
Zbigniew Jędrzejewski-Szmek 794d16
@@ -545,25 +544,31 @@ done:
Zbigniew Jędrzejewski-Szmek 794d16
                 log_debug("Ordering...");
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 n = hashmap_size(files);
Zbigniew Jędrzejewski-Szmek 794d16
-                if (!(ordered = new(struct item, n))) {
Zbigniew Jędrzejewski-Szmek 794d16
-                        r = log_oom();
Zbigniew Jędrzejewski-Szmek 794d16
-                        goto finish;
Zbigniew Jędrzejewski-Szmek 794d16
-                }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-                j = ordered;
Zbigniew Jędrzejewski-Szmek 794d16
-                HASHMAP_FOREACH_KEY(q, p, files, i) {
Zbigniew Jędrzejewski-Szmek 794d16
-                        memcpy(j, q, sizeof(struct item));
Zbigniew Jędrzejewski-Szmek 794d16
-                        j++;
Zbigniew Jędrzejewski-Szmek 794d16
-                }
Zbigniew Jędrzejewski-Szmek 794d16
+                if (n) {
Zbigniew Jędrzejewski-Szmek 794d16
+                        _cleanup_free_ struct item *ordered;
Zbigniew Jędrzejewski-Szmek 794d16
+                        struct item *j;
Zbigniew Jędrzejewski-Szmek 794d16
+                        unsigned k;
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+                        ordered = new(struct item, n);
Zbigniew Jędrzejewski-Szmek 794d16
+                        if (!ordered) {
Zbigniew Jędrzejewski-Szmek 794d16
+                                r = log_oom();
Zbigniew Jędrzejewski-Szmek 794d16
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 794d16
+                        }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                assert(ordered + n == j);
Zbigniew Jędrzejewski-Szmek 794d16
+                        j = ordered;
Zbigniew Jędrzejewski-Szmek 794d16
+                        HASHMAP_FOREACH_KEY(q, p, files, i) {
Zbigniew Jędrzejewski-Szmek 794d16
+                                memcpy(j, q, sizeof(struct item));
Zbigniew Jędrzejewski-Szmek 794d16
+                                j++;
Zbigniew Jędrzejewski-Szmek 794d16
+                        }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                qsort(ordered, n, sizeof(struct item), qsort_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+                        assert(ordered + n == j);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                for (k = 0; k < n; k++)
Zbigniew Jędrzejewski-Szmek 794d16
-                        pack_file(pack, ordered[k].path, on_btrfs);
Zbigniew Jędrzejewski-Szmek 794d16
+                        qsort(ordered, n, sizeof(struct item), qsort_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                free(ordered);
Zbigniew Jędrzejewski-Szmek 794d16
+                        for (k = 0; k < n; k++)
Zbigniew Jędrzejewski-Szmek 794d16
+                                pack_file(pack, ordered[k].path, on_btrfs);
Zbigniew Jędrzejewski-Szmek 794d16
+                } else
Zbigniew Jędrzejewski-Szmek 794d16
+                        log_warning("No pack files");
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         log_debug("Finalizing...");
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c
Zbigniew Jędrzejewski-Szmek 794d16
index e971f36..cc44ab4 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/cgroup-show.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/cgroup-show.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -44,6 +44,8 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
Zbigniew Jędrzejewski-Szmek 794d16
         unsigned i, m, pid_width;
Zbigniew Jędrzejewski-Szmek 794d16
         pid_t biggest = 0;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
+        assert(n_pids > 0);
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
         /* Filter duplicates */
Zbigniew Jędrzejewski-Szmek 794d16
         m = 0;
Zbigniew Jędrzejewski-Szmek 794d16
         for (i = 0; i < n_pids; i++) {
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c
Zbigniew Jędrzejewski-Szmek 794d16
index 6d99739..ed4070c 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/conf-files.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/conf-files.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -127,7 +127,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const
Zbigniew Jędrzejewski-Szmek 794d16
                 return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(files, hashmap_size(fh), sizeof(char *), base_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(files, hashmap_size(fh), sizeof(char *), base_cmp);
Zbigniew Jędrzejewski-Szmek 794d16
         *strv = files;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         hashmap_free(fh);
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
Zbigniew Jędrzejewski-Szmek 794d16
index c015b16..f3eb6a6 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/efivars.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/efivars.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -384,8 +384,7 @@ int efi_get_boot_options(uint16_t **options) {
Zbigniew Jędrzejewski-Szmek 794d16
                 list[count ++] = id;
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        if (list)
Zbigniew Jędrzejewski-Szmek 794d16
-                qsort(list, count, sizeof(uint16_t), cmp_uint16);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(list, count, sizeof(uint16_t), cmp_uint16);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         *options = list;
Zbigniew Jędrzejewski-Szmek 794d16
         return count;
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/fileio.c b/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 794d16
index 603a1c7..733b320 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -662,6 +662,7 @@ int get_status_field(const char *filename, const char *pattern, char **field) {
Zbigniew Jędrzejewski-Szmek 794d16
         int r;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         assert(filename);
Zbigniew Jędrzejewski-Szmek 794d16
+        assert(pattern);
Zbigniew Jędrzejewski-Szmek 794d16
         assert(field);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         r = read_full_file(filename, &status, NULL);
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/shared/util.h b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 794d16
index 1b845b3..222abe0 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 794d16
@@ -764,3 +764,15 @@ bool id128_is_valid(const char *s) _pure_;
Zbigniew Jędrzejewski-Szmek 794d16
 void parse_user_at_host(char *arg, char **user, char **host);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
 int split_pair(const char *s, const char *sep, char **l, char **r);
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+/**
Zbigniew Jędrzejewski-Szmek 794d16
+ * Normal qsort requires base to be nonnull. Here were require
Zbigniew Jędrzejewski-Szmek 794d16
+ * that only if nmemb > 0.
Zbigniew Jędrzejewski-Szmek 794d16
+ */
Zbigniew Jędrzejewski-Szmek 794d16
+static inline void qsort_safe(void *base, size_t nmemb, size_t size,
Zbigniew Jędrzejewski-Szmek 794d16
+                              int (*compar)(const void *, const void *)) {
Zbigniew Jędrzejewski-Szmek 794d16
+        if (nmemb) {
Zbigniew Jędrzejewski-Szmek 794d16
+                assert(base);
Zbigniew Jędrzejewski-Szmek 794d16
+                qsort(base, nmemb, size, compar);
Zbigniew Jędrzejewski-Szmek 794d16
+        }
Zbigniew Jędrzejewski-Szmek 794d16
+}
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
Zbigniew Jędrzejewski-Szmek 794d16
index d75281f..036828b 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/systemctl/systemctl.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/systemctl/systemctl.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -471,7 +471,7 @@ static int list_units(DBusConnection *bus, char **args) {
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
                 return r;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         output_units_list(unit_infos, c);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
@@ -733,8 +733,8 @@ static int list_sockets(DBusConnection *bus, char **args) {
Zbigniew Jędrzejewski-Szmek 794d16
                 listen = triggered = NULL; /* avoid cleanup */
Zbigniew Jędrzejewski-Szmek 794d16
         }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(socket_infos, cs, sizeof(struct socket_info),
Zbigniew Jędrzejewski-Szmek 794d16
-              (__compar_fn_t) socket_info_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(socket_infos, cs, sizeof(struct socket_info),
Zbigniew Jędrzejewski-Szmek 794d16
+                   (__compar_fn_t) socket_info_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         output_sockets_list(socket_infos, cs);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1108,7 +1108,7 @@ static int list_dependencies_one(DBusConnection *bus, const char *name, int leve
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
                 return r;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(deps, strv_length(deps), sizeof (char*), list_dependencies_compare);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         STRV_FOREACH(c, deps) {
Zbigniew Jędrzejewski-Szmek 794d16
                 if (strv_contains(u, *c)) {
Zbigniew Jędrzejewski-Szmek 794d16
@@ -3532,7 +3532,7 @@ static int show_all(const char* verb,
Zbigniew Jędrzejewski-Szmek 794d16
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 794d16
                 return r;
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-        qsort(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
Zbigniew Jędrzejewski-Szmek 794d16
+        qsort_safe(unit_infos, c, sizeof(struct unit_info), compare_unit_info);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
         for (u = unit_infos; u < unit_infos + c; u++) {
Zbigniew Jędrzejewski-Szmek 794d16
                 _cleanup_free_ char *p = NULL;