diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile index 014e01caf9..0c5a34cbb9 100644 --- a/package/system/procd/Makefile +++ b/package/system/procd/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=procd PKG_VERSION:=2013-07-14 -PKG_RELEASE=$(PKG_SOURCE_VERSION) +PKG_RELEASE=$(PKG_SOURCE_VERSION)-1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=git://nbd.name/luci2/procd.git 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 +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 +--- +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 +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 +--- + 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 +