Michal Schmidt e43452
From ae1e1f08b63b11eee857598076dbc5aaa9020032 Mon Sep 17 00:00:00 2001
Michal Schmidt e43452
From: Lennart Poettering <lennart@poettering.net>
Michal Schmidt e43452
Date: Fri, 30 Dec 2011 15:34:21 +0100
Michal Schmidt f1996e
Subject: [PATCH] remount-api-vfs: handle another OOM condition (cherry picked
Michal Schmidt f1996e
 from commit adb2ce5f694cb528f9294219941b1e37dc6a9530)
Michal Schmidt e43452
Michal Schmidt e43452
---
Michal Schmidt e43452
 src/remount-api-vfs.c |   23 +++++++++++++++++------
Michal Schmidt e43452
 1 files changed, 17 insertions(+), 6 deletions(-)
Michal Schmidt e43452
Michal Schmidt e43452
diff --git a/src/remount-api-vfs.c b/src/remount-api-vfs.c
Michal Schmidt e43452
index 8bbc021..7b14655 100644
Michal Schmidt e43452
--- a/src/remount-api-vfs.c
Michal Schmidt e43452
+++ b/src/remount-api-vfs.c
Michal Schmidt e43452
@@ -54,12 +54,14 @@ int main(int argc, char *argv[]) {
Michal Schmidt e43452
 
Michal Schmidt e43452
         umask(0022);
Michal Schmidt e43452
 
Michal Schmidt e43452
-        if (!(f = setmntent("/etc/fstab", "r"))) {
Michal Schmidt e43452
+        f = setmntent("/etc/fstab", "r");
Michal Schmidt e43452
+        if (!f) {
Michal Schmidt e43452
                 log_error("Failed to open /etc/fstab: %m");
Michal Schmidt e43452
                 goto finish;
Michal Schmidt e43452
         }
Michal Schmidt e43452
 
Michal Schmidt e43452
-        if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
Michal Schmidt e43452
+        pids = hashmap_new(trivial_hash_func, trivial_compare_func);
Michal Schmidt e43452
+        if (!pids) {
Michal Schmidt e43452
                 log_error("Failed to allocate set");
Michal Schmidt e43452
                 goto finish;
Michal Schmidt e43452
         }
Michal Schmidt e43452
@@ -76,9 +78,10 @@ int main(int argc, char *argv[]) {
Michal Schmidt e43452
 
Michal Schmidt e43452
                 log_debug("Remounting %s", me->mnt_dir);
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if ((pid = fork()) < 0) {
Michal Schmidt e43452
+                pid = fork();
Michal Schmidt e43452
+                if (pid < 0) {
Michal Schmidt e43452
                         log_error("Failed to fork: %m");
Michal Schmidt e43452
-                        ret = 1;
Michal Schmidt e43452
+                        ret = EXIT_FAILURE;
Michal Schmidt e43452
                         continue;
Michal Schmidt e43452
                 }
Michal Schmidt e43452
 
Michal Schmidt e43452
@@ -101,8 +104,15 @@ int main(int argc, char *argv[]) {
Michal Schmidt e43452
                 /* Parent */
Michal Schmidt e43452
 
Michal Schmidt e43452
                 s = strdup(me->mnt_dir);
Michal Schmidt e43452
+                if (!s) {
Michal Schmidt e43452
+                        log_error("Out of memory.");
Michal Schmidt e43452
+                        ret = EXIT_FAILURE;
Michal Schmidt e43452
+                        continue;
Michal Schmidt e43452
+                }
Michal Schmidt e43452
+
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if ((k = hashmap_put(pids, UINT_TO_PTR(pid), s)) < 0) {
Michal Schmidt e43452
+                k = hashmap_put(pids, UINT_TO_PTR(pid), s);
Michal Schmidt e43452
+                if (k < 0) {
Michal Schmidt e43452
                         log_error("Failed to add PID to set: %s", strerror(-k));
Michal Schmidt e43452
                         ret = EXIT_FAILURE;
Michal Schmidt e43452
                         continue;
Michal Schmidt e43452
@@ -124,7 +134,8 @@ int main(int argc, char *argv[]) {
Michal Schmidt e43452
                         break;
Michal Schmidt e43452
                 }
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if ((s = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
Michal Schmidt e43452
+                s = hashmap_remove(pids, UINT_TO_PTR(si.si_pid));
Michal Schmidt e43452
+                if (s) {
Michal Schmidt e43452
                         if (!is_clean_exit(si.si_code, si.si_status)) {
Michal Schmidt e43452
                                 if (si.si_code == CLD_EXITED)
Michal Schmidt e43452
                                         log_error("/bin/mount for %s exited with exit status %i.", s, si.si_status);