explicitely ignore return value of symlink(3) call
authorDaniel Golle <daniel@makrotopia.org>
Thu, 22 Oct 2015 21:15:58 +0000 (23:15 +0200)
committerJohn Crispin <blogic@openwrt.org>
Sun, 25 Oct 2015 23:11:04 +0000 (00:11 +0100)
glibc sets __attribute_warn_unused_result__ on symlink(3) if
FORTIFY_SOURCE is set. This breaks procd which deliberately ignores
the result of the symlink(3) call early during init as there wouldn't
be anything better to do in that case other than ignoring the error and
trying to survive.

Introduce libc-compat.h to work-around libc anomalities.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
initd/early.c
libc-compat.h [new file with mode: 0644]
plug/coldplug.c

index f41025604d0cb861c3cfac4ee82705782916caf6..e87774f31cd0d44cc99e1ba123044f0ddf98b371 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 
 #include "init.h"
+#include "../libc-compat.h"
 
 static void
 early_dev(void)
@@ -66,7 +67,7 @@ early_mounts(void)
        mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
        mount("cgroup", "/sys/fs/cgroup", "cgroup",  MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
        mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, "mode=0755,size=512K");
-       symlink("/tmp/shm", "/dev/shm");
+       ignore(symlink("/tmp/shm", "/dev/shm"));
        mkdir("/dev/pts", 0755);
        mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | MS_NOSUID, "mode=600");
        early_dev();
diff --git a/libc-compat.h b/libc-compat.h
new file mode 100644 (file)
index 0000000..9435346
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __PROCD_LIBC_COMPAT_H
+#define __PROCD_LIBC_COMPAT_H
+
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
+static inline int ignore(int x) {return x;}
+#else
+#define ignore(x) x
+#endif
+
+#endif
index 123e17d6bdfa4c1447267570c3c60d63f5a1531b..5fcb9a333200d5d32fad5f7f98d8359f05c4fc6b 100644 (file)
@@ -19,6 +19,7 @@
 #include <unistd.h>
 
 #include "../procd.h"
+#include "../libc-compat.h"
 
 #include "hotplug.h"
 
@@ -45,7 +46,7 @@ void procd_coldplug(void)
        umount2("/dev/pts", MNT_DETACH);
        umount2("/dev/", MNT_DETACH);
        mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755,size=512K");
-       symlink("/tmp/shm", "/dev/shm");
+       ignore(symlink("/tmp/shm", "/dev/shm"));
        mkdir("/dev/pts", 0755);
        umask(oldumask);
        mount("devpts", "/dev/pts", "devpts", MS_NOEXEC | MS_NOSUID, 0);