aboutsummaryrefslogtreecommitdiffstats
path: root/package/system/procd/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/system/procd/patches')
-rw-r--r--package/system/procd/patches/0001-early-keep-stdio-files-open.patch49
-rw-r--r--package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch40
2 files changed, 89 insertions, 0 deletions
diff --git a/package/system/procd/patches/0001-early-keep-stdio-files-open.patch b/package/system/procd/patches/0001-early-keep-stdio-files-open.patch
new file mode 100644
index 0000000000..74cca070c3
--- /dev/null
+++ b/package/system/procd/patches/0001-early-keep-stdio-files-open.patch
@@ -0,0 +1,49 @@
+From 13ebb50d2789de7bd47cebe57e3f6eba58fdcc7e Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Fri, 19 Jul 2013 08:43:35 +0200
+Subject: [PATCH 1/2] early: keep stdio files open
+
+At the end of the 'early_console' function, the
+file descriptor is closed unconditionally. This
+'close' call closes the stdio files if the fd
+returned by the 'open(dev/console)' call equals
+with any of the STD{IN,OUT,ERR}_FILENO values.
+When this happens, all subsequent accesses to
+the stdio files will fail and early console
+access won't work.
+
+To avoid this, don't close the file descriptor if
+that equals with any of the STD*_FILENO values.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+Note:
+
+The issue happens if Linux is unable to open the
+initial console before calling init. In this case,
+the 'open(dev/console)' call in the 'early_console'
+function returns with zero.
+---
+ early.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/early.c b/early.c
+index 27d0929..204623b 100644
+--- a/early.c
++++ b/early.c
+@@ -65,7 +65,11 @@ static void early_console(const char *dev)
+ dup2(dd, STDIN_FILENO);
+ dup2(dd, STDOUT_FILENO);
+ dup2(dd, STDERR_FILENO);
+- close(dd);
++
++ if (dd != STDIN_FILENO &&
++ dd != STDOUT_FILENO &&
++ dd != STDERR_FILENO)
++ close(dd);
+ }
+
+ static void early_env(void)
+--
+1.7.10
+
diff --git a/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch b/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch
new file mode 100644
index 0000000000..096983200c
--- /dev/null
+++ b/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch
@@ -0,0 +1,40 @@
+From 1edd25cfa0a26dac1ca5d49bce479ebdea336437 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Fri, 19 Jul 2013 08:21:17 +0200
+Subject: [PATCH 2/2] early: remove superfluous close of stdio file
+ descriptors
+
+'man dup2' says:
+
+ dup2() makes newfd be the copy of oldfd, closing newfd first if
+ necessary, but note the following:
+
+ * If oldfd is not a valid file descriptor, then the call fails,
+ and newfd is not closed.
+
+ * If oldfd is a valid file descriptor, and newfd has the same
+ value as oldfd, then dup2() does nothing, and returns newfd.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ early.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/early.c b/early.c
+index 204623b..f9e3277 100644
+--- a/early.c
++++ b/early.c
+@@ -53,10 +53,6 @@ static void early_console(const char *dev)
+ mkdev("*console", 0600);
+
+ dd = open(dev, O_RDWR);
+- close(STDIN_FILENO);
+- close(STDOUT_FILENO);
+- close(STDERR_FILENO);
+-
+ if (dd < 0) {
+ ERROR("Failed to open %s\n", dev);
+ return;
+--
+1.7.10
+