uhttpd: unblock signals in CGI childs, solves hanging ssh logout after server restart from within LuCI and similar problems

SVN-Revision: 27628
master
Jo-Philipp Wich 14 years ago
parent d7fa989b42
commit 53a5beaca8
  1. 4
      package/uhttpd/Makefile
  2. 10
      package/uhttpd/src/uhttpd-cgi.c
  3. 2
      package/uhttpd/src/uhttpd.c

@ -1,5 +1,5 @@
# #
# Copyright (C) 2010 Jo-Philipp Wich <xm@subsignal.org> # Copyright (C) 2010-2011 Jo-Philipp Wich <xm@subsignal.org>
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=uhttpd PKG_NAME:=uhttpd
PKG_RELEASE:=22 PKG_RELEASE:=23
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
PKG_BUILD_DEPENDS := libcyassl liblua PKG_BUILD_DEPENDS := libcyassl liblua

@ -157,6 +157,8 @@ void uh_cgi_request(
fd_set reader; fd_set reader;
fd_set writer; fd_set writer;
sigset_t ss;
struct sigaction sa; struct sigaction sa;
struct timeval timeout; struct timeval timeout;
struct http_response *res; struct http_response *res;
@ -187,6 +189,10 @@ void uh_cgi_request(
/* exec child */ /* exec child */
case 0: case 0:
/* unblock signals */
sigemptyset(&ss);
sigprocmask(SIG_SETMASK, &ss, NULL);
/* restore SIGTERM */ /* restore SIGTERM */
sa.sa_flags = 0; sa.sa_flags = 0;
sa.sa_handler = SIG_DFL; sa.sa_handler = SIG_DFL;
@ -201,6 +207,10 @@ void uh_cgi_request(
dup2(rfd[1], 1); dup2(rfd[1], 1);
dup2(wfd[0], 0); dup2(wfd[0], 0);
/* avoid leaking our pipe into child-child processes */
fd_cloexec(rfd[1]);
fd_cloexec(wfd[0]);
/* check for regular, world-executable file _or_ interpreter */ /* check for regular, world-executable file _or_ interpreter */
if( ((pi->stat.st_mode & S_IFREG) && if( ((pi->stat.st_mode & S_IFREG) &&
(pi->stat.st_mode & S_IXOTH)) || (ip != NULL) (pi->stat.st_mode & S_IXOTH)) || (ip != NULL)

@ -621,7 +621,7 @@ static void uh_mainloop(struct config *conf, fd_set serv_fds, int max_fd)
} }
#ifdef HAVE_TLS #ifdef HAVE_TLS
static inline uh_inittls(struct config *conf) static inline int uh_inittls(struct config *conf)
{ {
/* library handle */ /* library handle */
void *lib; void *lib;

Loading…
Cancel
Save