[pkg-lighttpd] r276 - in lighttpd/trunk: . cygwin debian openwrt src tests

eloy at alioth.debian.org eloy at alioth.debian.org
Tue Sep 11 10:47:39 UTC 2007


Author: eloy
Date: 2007-09-11 10:47:39 +0000 (Tue, 11 Sep 2007)
New Revision: 276

Added:
   lighttpd/trunk/src/lighttpd-angel.c
Modified:
   lighttpd/trunk/NEWS
   lighttpd/trunk/configure
   lighttpd/trunk/configure.in
   lighttpd/trunk/cygwin/lighttpd.README
   lighttpd/trunk/debian/changelog
   lighttpd/trunk/lighttpd.spec
   lighttpd/trunk/openwrt/control
   lighttpd/trunk/openwrt/lighttpd.mk
   lighttpd/trunk/src/Makefile.am
   lighttpd/trunk/src/Makefile.in
   lighttpd/trunk/src/configparser.c
   lighttpd/trunk/src/configparser.y
   lighttpd/trunk/src/connections.c
   lighttpd/trunk/src/http_auth.c
   lighttpd/trunk/src/mod_fastcgi.c
   lighttpd/trunk/src/mod_mysql_vhost.c
   lighttpd/trunk/src/server.c
   lighttpd/trunk/tests/mod-redirect.t
Log:
new upstream version


Modified: lighttpd/trunk/NEWS
===================================================================
--- lighttpd/trunk/NEWS	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/NEWS	2007-09-11 10:47:39 UTC (rev 276)
@@ -3,7 +3,18 @@
 NEWS
 ====
 
+- 1.4.18 - 2007-09-09
+
+  * fixed compile error on IRIX 6.5.x on prctl() (#1333)
+  * fixed forwarding a SIGINT and SIGHUP when using max-workers (#902)
+  * fixed FastCGI header overrun in mod_fastcgi (reported by mattias at secweb.se)
+  * fixed hanging redirects with keep-alive due to missing
+    "Content-Length: 0" headers
+  * fixed crashing when using undefined environment variables in the config
+  * fixed compilation of mod_mysql_vhost on irix (#1341)
+
 - 1.4.17 - 2007-08-29
+
   * added dir-listing.set-footer in mod_dirlisting (#1277)
   * added sending UID and PID for SIGTERM and SIGINT to the logs
   * fixed hardcoded font-sizes in mod_dirlisting (#1267)

Modified: lighttpd/trunk/configure
===================================================================
--- lighttpd/trunk/configure	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/configure	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for lighttpd 1.4.17.
+# Generated by GNU Autoconf 2.61 for lighttpd 1.4.18.
 #
 # Report bugs to <jan at kneschke.de>.
 #
@@ -728,8 +728,8 @@
 # Identity of this package.
 PACKAGE_NAME='lighttpd'
 PACKAGE_TARNAME='lighttpd'
-PACKAGE_VERSION='1.4.17'
-PACKAGE_STRING='lighttpd 1.4.17'
+PACKAGE_VERSION='1.4.18'
+PACKAGE_STRING='lighttpd 1.4.18'
 PACKAGE_BUGREPORT='jan at kneschke.de'
 
 ac_unique_file="src/server.c"
@@ -1440,7 +1440,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures lighttpd 1.4.17 to adapt to many kinds of systems.
+\`configure' configures lighttpd 1.4.18 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1511,7 +1511,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of lighttpd 1.4.17:";;
+     short | recursive ) echo "Configuration of lighttpd 1.4.18:";;
    esac
   cat <<\_ACEOF
 
@@ -1645,7 +1645,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-lighttpd configure 1.4.17
+lighttpd configure 1.4.18
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1659,7 +1659,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by lighttpd $as_me 1.4.17, which was
+It was created by lighttpd $as_me 1.4.18, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2478,7 +2478,7 @@
 
 # Define the identity of the package.
  PACKAGE='lighttpd'
- VERSION='1.4.17'
+ VERSION='1.4.18'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -28619,7 +28619,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by lighttpd $as_me 1.4.17, which was
+This file was extended by lighttpd $as_me 1.4.18, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28672,7 +28672,7 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-lighttpd config.status 1.4.17
+lighttpd config.status 1.4.18
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 

Modified: lighttpd/trunk/configure.in
===================================================================
--- lighttpd/trunk/configure.in	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/configure.in	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,7 +1,7 @@
 #                                               -*- Autoconf -*-
 # Process this file with autoconf to produce a configure script.
 AC_PREREQ(2.57)
-AC_INIT(lighttpd, 1.4.17, jan at kneschke.de)
+AC_INIT(lighttpd, 1.4.18, jan at kneschke.de)
 AC_CONFIG_SRCDIR([src/server.c])
 
 AC_CANONICAL_TARGET

Modified: lighttpd/trunk/cygwin/lighttpd.README
===================================================================
--- lighttpd/trunk/cygwin/lighttpd.README	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/cygwin/lighttpd.README	2007-09-11 10:47:39 UTC (rev 276)
@@ -31,17 +31,17 @@
 ------------------------------------
 
 Build instructions:
-  unpack lighttpd-1.4.17-<REL>-src.tar.bz2
+  unpack lighttpd-1.4.18-<REL>-src.tar.bz2
     if you use setup to install this src package, it will be
 	 unpacked under /usr/src automatically
   cd /usr/src
-  ./lighttpd-1.4.17-<REL>.sh all
+  ./lighttpd-1.4.18-<REL>.sh all
 
 This will create:
-  /usr/src/lighttpd-1.4.17-<REL>.tar.bz2
-  /usr/src/lighttpd-1.4.17-<REL>-src.tar.bz2
+  /usr/src/lighttpd-1.4.18-<REL>.tar.bz2
+  /usr/src/lighttpd-1.4.18-<REL>-src.tar.bz2
 
-Or use './lighttpd-1.4.17-<REL>.sh prep' to get a patched source directory
+Or use './lighttpd-1.4.18-<REL>.sh prep' to get a patched source directory
 
 -------------------------------------------
 

Modified: lighttpd/trunk/debian/changelog
===================================================================
--- lighttpd/trunk/debian/changelog	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/debian/changelog	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,3 +1,11 @@
+lighttpd (1.4.18-1) UNRELEASED; urgency=low
+
+  * (NOT RELEASED YET) New upstream release
+  * lighttpd contains now small lighttpd-angel binary which is used for 
+    gracefull restarting of lighttpd
+
+ -- Krzysztof Krzyzaniak (eloy) <eloy at debian.org>  Tue, 11 Sep 2007 12:45:11 +0200
+
 lighttpd (1.4.17-1) unstable; urgency=low
 
   * New upstream release

Modified: lighttpd/trunk/lighttpd.spec
===================================================================
--- lighttpd/trunk/lighttpd.spec	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/lighttpd.spec	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,6 +1,6 @@
 Summary: A fast webserver with minimal memory-footprint (lighttpd)
 Name: lighttpd
-Version: 1.4.17
+Version: 1.4.18
 Release: 1
 Source: http://jan.kneschke.de/projects/lighttpd/download/lighttpd-%version.tar.gz
 Packager: Jan Kneschke <jan at kneschke.de>

Modified: lighttpd/trunk/openwrt/control
===================================================================
--- lighttpd/trunk/openwrt/control	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/openwrt/control	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,8 +1,8 @@
 Package: lighttpd
-Version: 1.4.17
+Version: 1.4.18
 Architecture: mipsel
 Maintainer: Jan Kneschke <jan at kneschke.de>
-Source: http://jan.kneschke.de/projects/lighttpd/download/lighttpd-1.4.17.tar.gz
+Source: http://jan.kneschke.de/projects/lighttpd/download/lighttpd-1.4.18.tar.gz
 Section: net
 Priority: optional
 Depends:

Modified: lighttpd/trunk/openwrt/lighttpd.mk
===================================================================
--- lighttpd/trunk/openwrt/lighttpd.mk	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/openwrt/lighttpd.mk	2007-09-11 10:47:39 UTC (rev 276)
@@ -10,7 +10,7 @@
 
 #  For this example we'll use a fairly simple package that compiles easily
 #  and has sources available for download at sourceforge
-LIGHTTPD=lighttpd-1.4.17
+LIGHTTPD=lighttpd-1.4.18
 LIGHTTPD_TARGET=.built
 LIGHTTPD_DIR=$(BUILD_DIR)/$(LIGHTTPD)
 LIGHTTPD_IPK=$(BUILD_DIR)/$(LIGHTTPD)_mipsel.ipk

Modified: lighttpd/trunk/src/Makefile.am
===================================================================
--- lighttpd/trunk/src/Makefile.am	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/Makefile.am	2007-09-11 10:47:39 UTC (rev 276)
@@ -1,12 +1,14 @@
 AM_CFLAGS = $(FAM_CFLAGS)
 
 noinst_PROGRAMS=proc_open lemon # simple-fcgi #graphic evalo bench ajp ssl error_test adserver gen-license
-sbin_PROGRAMS=lighttpd
+sbin_PROGRAMS=lighttpd lighttpd-angel
 bin_PROGRAMS=spawn-fcgi
 LEMON=$(top_builddir)/src/lemon
 
 lemon_SOURCES=lemon.c
 
+lighttpd_angel_SOURCES=lighttpd-angel.c
+
 #simple_fcgi_SOURCES=simple-fcgi.c
 #simple_fcgi_LDADD=-lfcgi
 
@@ -254,7 +256,7 @@
       splaytree.h proc_open.h status_counter.h \
       mod_magnet_cache.h
 
-DEFS= @DEFS@ -DLIBRARY_DIR="\"$(libdir)\""
+DEFS= @DEFS@ -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""
 
 lighttpd_SOURCES = $(src)
 lighttpd_LDADD = $(PCRE_LIB) $(DL_LIB) $(SENDFILE_LIB) $(ATTR_LIB) $(common_libadd) $(SSL_LIB) $(FAM_LIBS)

Modified: lighttpd/trunk/src/Makefile.in
===================================================================
--- lighttpd/trunk/src/Makefile.in	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/Makefile.in	2007-09-11 10:47:39 UTC (rev 276)
@@ -36,7 +36,7 @@
 host_triplet = @host@
 target_triplet = @target@
 noinst_PROGRAMS = proc_open$(EXEEXT) lemon$(EXEEXT)
-sbin_PROGRAMS = lighttpd$(EXEEXT)
+sbin_PROGRAMS = lighttpd$(EXEEXT) lighttpd-angel$(EXEEXT)
 bin_PROGRAMS = spawn-fcgi$(EXEEXT)
 
 # if the linker doesn't allow referencing symbols of the binary
@@ -373,6 +373,9 @@
 lighttpd_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(lighttpd_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am_lighttpd_angel_OBJECTS = lighttpd-angel.$(OBJEXT)
+lighttpd_angel_OBJECTS = $(am_lighttpd_angel_OBJECTS)
+lighttpd_angel_LDADD = $(LDADD)
 am_proc_open_OBJECTS = proc_open-proc_open.$(OBJEXT) \
 	proc_open-buffer.$(OBJEXT)
 proc_open_OBJECTS = $(am_proc_open_OBJECTS)
@@ -409,7 +412,8 @@
 	$(mod_status_la_SOURCES) $(mod_trigger_b4_dl_la_SOURCES) \
 	$(mod_userdir_la_SOURCES) $(mod_usertrack_la_SOURCES) \
 	$(mod_webdav_la_SOURCES) $(lemon_SOURCES) $(lighttpd_SOURCES) \
-	$(proc_open_SOURCES) $(spawn_fcgi_SOURCES)
+	$(lighttpd_angel_SOURCES) $(proc_open_SOURCES) \
+	$(spawn_fcgi_SOURCES)
 DIST_SOURCES = $(am__liblightcomp_la_SOURCES_DIST) \
 	$(mod_access_la_SOURCES) $(mod_accesslog_la_SOURCES) \
 	$(mod_alias_la_SOURCES) $(mod_auth_la_SOURCES) \
@@ -428,7 +432,8 @@
 	$(mod_trigger_b4_dl_la_SOURCES) $(mod_userdir_la_SOURCES) \
 	$(mod_usertrack_la_SOURCES) $(mod_webdav_la_SOURCES) \
 	$(lemon_SOURCES) $(am__lighttpd_SOURCES_DIST) \
-	$(proc_open_SOURCES) $(spawn_fcgi_SOURCES)
+	$(lighttpd_angel_SOURCES) $(proc_open_SOURCES) \
+	$(spawn_fcgi_SOURCES)
 HEADERS = $(noinst_HEADERS)
 ETAGS = etags
 CTAGS = ctags
@@ -453,7 +458,7 @@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@ -DLIBRARY_DIR="\"$(libdir)\""
+DEFS = @DEFS@ -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""
 DEPDIR = @DEPDIR@
 DL_LIB = @DL_LIB@
 ECHO = @ECHO@
@@ -573,6 +578,7 @@
 AM_CFLAGS = $(FAM_CFLAGS)
 LEMON = $(top_builddir)/src/lemon
 lemon_SOURCES = lemon.c
+lighttpd_angel_SOURCES = lighttpd-angel.c
 common_src = buffer.c log.c \
       keyvalue.c chunk.c  \
       http_chunk.c stream.c fdevent.c \
@@ -945,6 +951,9 @@
 lighttpd$(EXEEXT): $(lighttpd_OBJECTS) $(lighttpd_DEPENDENCIES) 
 	@rm -f lighttpd$(EXEEXT)
 	$(lighttpd_LINK) $(lighttpd_OBJECTS) $(lighttpd_LDADD) $(LIBS)
+lighttpd-angel$(EXEEXT): $(lighttpd_angel_OBJECTS) $(lighttpd_angel_DEPENDENCIES) 
+	@rm -f lighttpd-angel$(EXEEXT)
+	$(LINK) $(lighttpd_angel_OBJECTS) $(lighttpd_angel_LDADD) $(LIBS)
 proc_open$(EXEEXT): $(proc_open_OBJECTS) $(proc_open_DEPENDENCIES) 
 	@rm -f proc_open$(EXEEXT)
 	$(LINK) $(proc_open_OBJECTS) $(proc_open_LDADD) $(LIBS)
@@ -1029,6 +1038,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblightcomp_la-stat_cache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblightcomp_la-status_counter.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblightcomp_la-stream.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lighttpd-angel.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/log.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/md5.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mod_access.Plo at am__quote@

Modified: lighttpd/trunk/src/configparser.c
===================================================================
--- lighttpd/trunk/src/configparser.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/configparser.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -941,6 +941,7 @@
       case 14:
 #line 232 "./configparser.y"
 {
+  yygotominor.yy41 = NULL;
   if (strncmp(yymsp[0].minor.yy43->ptr, "env.", sizeof("env.") - 1) == 0) {
     char *env;
 
@@ -965,59 +966,59 @@
   buffer_free(yymsp[0].minor.yy43);
   yymsp[0].minor.yy43 = NULL;
 }
-#line 968 "configparser.c"
+#line 969 "configparser.c"
         break;
       case 15:
-#line 258 "./configparser.y"
+#line 259 "./configparser.y"
 {
   yygotominor.yy41 = (data_unset *)data_string_init();
   buffer_copy_string_buffer(((data_string *)(yygotominor.yy41))->value, yymsp[0].minor.yy0);
   buffer_free(yymsp[0].minor.yy0);
   yymsp[0].minor.yy0 = NULL;
 }
-#line 978 "configparser.c"
+#line 979 "configparser.c"
         break;
       case 16:
-#line 265 "./configparser.y"
+#line 266 "./configparser.y"
 {
   yygotominor.yy41 = (data_unset *)data_integer_init();
   ((data_integer *)(yygotominor.yy41))->value = strtol(yymsp[0].minor.yy0->ptr, NULL, 10);
   buffer_free(yymsp[0].minor.yy0);
   yymsp[0].minor.yy0 = NULL;
 }
-#line 988 "configparser.c"
+#line 989 "configparser.c"
         break;
       case 17:
-#line 271 "./configparser.y"
+#line 272 "./configparser.y"
 {
   yygotominor.yy41 = (data_unset *)data_array_init();
   array_free(((data_array *)(yygotominor.yy41))->value);
   ((data_array *)(yygotominor.yy41))->value = yymsp[0].minor.yy40;
   yymsp[0].minor.yy40 = NULL;
 }
-#line 998 "configparser.c"
+#line 999 "configparser.c"
         break;
       case 18:
-#line 277 "./configparser.y"
+#line 278 "./configparser.y"
 {
   yygotominor.yy40 = array_init();
 }
-#line 1005 "configparser.c"
+#line 1006 "configparser.c"
   yy_destructor(8,&yymsp[-1].minor);
   yy_destructor(9,&yymsp[0].minor);
         break;
       case 19:
-#line 280 "./configparser.y"
+#line 281 "./configparser.y"
 {
   yygotominor.yy40 = yymsp[-1].minor.yy40;
   yymsp[-1].minor.yy40 = NULL;
 }
-#line 1015 "configparser.c"
+#line 1016 "configparser.c"
   yy_destructor(8,&yymsp[-2].minor);
   yy_destructor(9,&yymsp[0].minor);
         break;
       case 20:
-#line 285 "./configparser.y"
+#line 286 "./configparser.y"
 {
   if (buffer_is_empty(yymsp[0].minor.yy41->key) ||
       NULL == array_get_element(yymsp[-2].minor.yy40, yymsp[0].minor.yy41->key->ptr)) {
@@ -1034,37 +1035,37 @@
   yygotominor.yy40 = yymsp[-2].minor.yy40;
   yymsp[-2].minor.yy40 = NULL;
 }
-#line 1037 "configparser.c"
+#line 1038 "configparser.c"
   yy_destructor(10,&yymsp[-1].minor);
         break;
       case 21:
-#line 302 "./configparser.y"
+#line 303 "./configparser.y"
 {
   yygotominor.yy40 = yymsp[-1].minor.yy40;
   yymsp[-1].minor.yy40 = NULL;
 }
-#line 1046 "configparser.c"
+#line 1047 "configparser.c"
   yy_destructor(10,&yymsp[0].minor);
         break;
       case 22:
-#line 307 "./configparser.y"
+#line 308 "./configparser.y"
 {
   yygotominor.yy40 = array_init();
   array_insert_unique(yygotominor.yy40, yymsp[0].minor.yy41);
   yymsp[0].minor.yy41 = NULL;
 }
-#line 1056 "configparser.c"
+#line 1057 "configparser.c"
         break;
       case 23:
-#line 313 "./configparser.y"
+#line 314 "./configparser.y"
 {
   yygotominor.yy41 = yymsp[0].minor.yy41;
   yymsp[0].minor.yy41 = NULL;
 }
-#line 1064 "configparser.c"
+#line 1065 "configparser.c"
         break;
       case 24:
-#line 317 "./configparser.y"
+#line 318 "./configparser.y"
 {
   buffer_copy_string_buffer(yymsp[0].minor.yy41->key, yymsp[-2].minor.yy43);
   buffer_free(yymsp[-2].minor.yy43);
@@ -1073,7 +1074,7 @@
   yygotominor.yy41 = yymsp[0].minor.yy41;
   yymsp[0].minor.yy41 = NULL;
 }
-#line 1076 "configparser.c"
+#line 1077 "configparser.c"
   yy_destructor(11,&yymsp[-1].minor);
         break;
       case 25:
@@ -1082,18 +1083,18 @@
       case 26:
         break;
       case 27:
-#line 329 "./configparser.y"
+#line 330 "./configparser.y"
 {
   data_config *dc;
   dc = (data_config *)array_get_element(ctx->srv->config_context, "global");
   assert(dc);
   configparser_push(ctx, dc, 0);
 }
-#line 1092 "configparser.c"
+#line 1093 "configparser.c"
   yy_destructor(12,&yymsp[0].minor);
         break;
       case 28:
-#line 336 "./configparser.y"
+#line 337 "./configparser.y"
 {
   data_config *cur;
 
@@ -1104,14 +1105,14 @@
 
   yygotominor.yy0 = cur;
 }
-#line 1107 "configparser.c"
+#line 1108 "configparser.c"
         /* No destructor defined for globalstart */
   yy_destructor(13,&yymsp[-2].minor);
         /* No destructor defined for metalines */
   yy_destructor(14,&yymsp[0].minor);
         break;
       case 29:
-#line 347 "./configparser.y"
+#line 348 "./configparser.y"
 {
   assert(yymsp[-3].minor.yy78->context_ndx < yymsp[0].minor.yy78->context_ndx);
   yymsp[0].minor.yy78->prev = yymsp[-3].minor.yy78;
@@ -1120,20 +1121,20 @@
   yymsp[-3].minor.yy78 = NULL;
   yymsp[0].minor.yy78 = NULL;
 }
-#line 1123 "configparser.c"
+#line 1124 "configparser.c"
         /* No destructor defined for eols */
   yy_destructor(15,&yymsp[-1].minor);
         break;
       case 30:
-#line 356 "./configparser.y"
+#line 357 "./configparser.y"
 {
   yygotominor.yy78 = yymsp[0].minor.yy78;
   yymsp[0].minor.yy78 = NULL;
 }
-#line 1133 "configparser.c"
+#line 1134 "configparser.c"
         break;
       case 31:
-#line 361 "./configparser.y"
+#line 362 "./configparser.y"
 {
   data_config *cur;
 
@@ -1144,14 +1145,14 @@
 
   yygotominor.yy78 = cur;
 }
-#line 1147 "configparser.c"
+#line 1148 "configparser.c"
         /* No destructor defined for context */
   yy_destructor(13,&yymsp[-2].minor);
         /* No destructor defined for metalines */
   yy_destructor(14,&yymsp[0].minor);
         break;
       case 32:
-#line 372 "./configparser.y"
+#line 373 "./configparser.y"
 {
   data_config *dc;
   buffer *b, *rvalue, *op;
@@ -1287,45 +1288,45 @@
   yymsp[0].minor.yy41->free(yymsp[0].minor.yy41);
   yymsp[0].minor.yy41 = NULL;
 }
-#line 1290 "configparser.c"
+#line 1291 "configparser.c"
   yy_destructor(16,&yymsp[-6].minor);
   yy_destructor(18,&yymsp[-4].minor);
   yy_destructor(19,&yymsp[-2].minor);
         break;
       case 33:
-#line 507 "./configparser.y"
+#line 508 "./configparser.y"
 {
   yygotominor.yy27 = CONFIG_COND_EQ;
 }
-#line 1300 "configparser.c"
+#line 1301 "configparser.c"
   yy_destructor(20,&yymsp[0].minor);
         break;
       case 34:
-#line 510 "./configparser.y"
+#line 511 "./configparser.y"
 {
   yygotominor.yy27 = CONFIG_COND_MATCH;
 }
-#line 1308 "configparser.c"
+#line 1309 "configparser.c"
   yy_destructor(21,&yymsp[0].minor);
         break;
       case 35:
-#line 513 "./configparser.y"
+#line 514 "./configparser.y"
 {
   yygotominor.yy27 = CONFIG_COND_NE;
 }
-#line 1316 "configparser.c"
+#line 1317 "configparser.c"
   yy_destructor(22,&yymsp[0].minor);
         break;
       case 36:
-#line 516 "./configparser.y"
+#line 517 "./configparser.y"
 {
   yygotominor.yy27 = CONFIG_COND_NOMATCH;
 }
-#line 1324 "configparser.c"
+#line 1325 "configparser.c"
   yy_destructor(23,&yymsp[0].minor);
         break;
       case 37:
-#line 520 "./configparser.y"
+#line 521 "./configparser.y"
 {
   yygotominor.yy43 = NULL;
   if (ctx->ok) {
@@ -1342,10 +1343,10 @@
   yymsp[0].minor.yy41->free(yymsp[0].minor.yy41);
   yymsp[0].minor.yy41 = NULL;
 }
-#line 1345 "configparser.c"
+#line 1346 "configparser.c"
         break;
       case 38:
-#line 537 "./configparser.y"
+#line 538 "./configparser.y"
 {
   if (ctx->ok) {
     if (0 != config_parse_file(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) {
@@ -1355,11 +1356,11 @@
     yymsp[0].minor.yy43 = NULL;
   }
 }
-#line 1358 "configparser.c"
+#line 1359 "configparser.c"
   yy_destructor(24,&yymsp[-1].minor);
         break;
       case 39:
-#line 547 "./configparser.y"
+#line 548 "./configparser.y"
 {
   if (ctx->ok) {
     if (0 != config_parse_cmd(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) {
@@ -1369,7 +1370,7 @@
     yymsp[0].minor.yy43 = NULL;
   }
 }
-#line 1372 "configparser.c"
+#line 1373 "configparser.c"
   yy_destructor(25,&yymsp[-1].minor);
         break;
   };
@@ -1403,7 +1404,7 @@
 
   ctx->ok = 0;
 
-#line 1406 "configparser.c"
+#line 1407 "configparser.c"
   configparserARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
 

Modified: lighttpd/trunk/src/configparser.y
===================================================================
--- lighttpd/trunk/src/configparser.y	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/configparser.y	2007-09-11 10:47:39 UTC (rev 276)
@@ -230,6 +230,7 @@
 }
 
 value(A) ::= key(B). {
+  A = NULL;
   if (strncmp(B->ptr, "env.", sizeof("env.") - 1) == 0) {
     char *env;
 

Modified: lighttpd/trunk/src/connections.c
===================================================================
--- lighttpd/trunk/src/connections.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/connections.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -537,7 +537,10 @@
 			    con->http_status == 204 ||
 			    con->http_status == 304) {
 				/* no Content-Body, no Content-Length */
-			} else if (qlen > 0) {
+			} else if (qlen >= 0) {
+				/* qlen = 0 is important for Redirects (301, ...) as they MAY have
+				 * a content. Browsers are waiting for a Content otherwise
+				 */
 				buffer_copy_off_t(srv->tmp_buf, chunkqueue_length(con->write_queue));
 
 				response_header_overwrite(srv, con, CONST_STR_LEN("Content-Length"), CONST_BUF_LEN(srv->tmp_buf));

Modified: lighttpd/trunk/src/http_auth.c
===================================================================
--- lighttpd/trunk/src/http_auth.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/http_auth.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -831,19 +831,17 @@
 	username = buffer_init();
 
 	if (!base64_decode(username, realm_str)) {
-		buffer_free(username);
-
 		log_error_write(srv, __FILE__, __LINE__, "sb", "decodeing base64-string failed", username);
 
+		buffer_free(username);
 		return 0;
 	}
 
 	/* r2 == user:password */
 	if (NULL == (pw = strchr(username->ptr, ':'))) {
-		buffer_free(username);
-
 		log_error_write(srv, __FILE__, __LINE__, "sb", ": is missing in", username);
 
+		buffer_free(username);
 		return 0;
 	}
 

Copied: lighttpd/trunk/src/lighttpd-angel.c (from rev 275, lighttpd/branches/upstream/current/src/lighttpd-angel.c)
===================================================================
--- lighttpd/trunk/src/lighttpd-angel.c	                        (rev 0)
+++ lighttpd/trunk/src/lighttpd-angel.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -0,0 +1,154 @@
+/**
+ * angel process for lighttpd 
+ *
+ * the purpose is the run as root all the time and handle:
+ * - restart on crash
+ * - spawn on HUP to allow graceful restart
+ * - ...
+ *
+ * it has to stay safe and small to be trustable
+ */
+
+#include <sys/wait.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <signal.h>
+
+#define BINPATH SBIN_DIR"/lighttpd"
+
+static siginfo_t last_sigterm_info;
+static siginfo_t last_sighup_info;
+
+static volatile sig_atomic_t start_process    = 1;
+static volatile sig_atomic_t graceful_restart = 0;
+static volatile pid_t pid = -1;
+
+static void sigaction_handler(int sig, siginfo_t *si, void *context) {
+	int exitcode;
+
+	switch (sig) {
+	case SIGINT: 
+	case SIGTERM:
+		memcpy(&last_sigterm_info, si, sizeof(*si));
+
+		/** forward the sig to the child */
+		kill(pid, sig);
+		break;
+	case SIGHUP: /** do a graceful restart */
+		memcpy(&last_sighup_info, si, sizeof(*si));
+
+		/** do a graceful shutdown on the main process and start a new child */
+		kill(pid, SIGINT);
+
+		usleep(5 * 1000); /** wait 5 microsec */
+		
+		start_process = 1;
+		break;
+	case SIGCHLD:
+		/** a child died, de-combie it */
+		wait(&exitcode);
+		break;
+	}
+}
+
+int main(int argc, char **argv) {
+	int is_shutdown = 0;
+	struct sigaction act;
+
+	/**
+	 * we are running as root BEWARE
+	 */
+
+	memset(&act, 0, sizeof(act));
+	act.sa_handler = SIG_IGN;
+	sigaction(SIGPIPE, &act, NULL);
+	sigaction(SIGUSR1, &act, NULL);
+
+	act.sa_sigaction = sigaction_handler;
+	sigemptyset(&act.sa_mask);
+	act.sa_flags = SA_SIGINFO;
+
+	sigaction(SIGINT,  &act, NULL);
+	sigaction(SIGTERM, &act, NULL);
+	sigaction(SIGHUP,  &act, NULL);
+	sigaction(SIGALRM, &act, NULL);
+	sigaction(SIGCHLD, &act, NULL);
+
+	/* check that the compiled in path has the right user,
+	 *
+	 * BEWARE: there is a race between the check here and the exec later
+	 */
+
+	while (!is_shutdown) {
+		int exitcode = 0;
+
+		if (start_process) {
+			pid = fork();
+
+			if (0 == pid) {
+				/* i'm the child */
+
+				argv[0] = BINPATH;
+
+				execvp(BINPATH, argv);
+
+				exit(1);
+			} else if (-1 == pid) {
+				/** error */
+
+				return -1;
+			}
+
+			/* I'm the angel */
+			start_process = 0;
+		}
+	       
+		if ((pid_t)-1 == waitpid(pid, &exitcode, 0)) {
+			switch (errno) {
+			case EINTR:
+				/* someone sent a signal ... 
+				 * do we have to shutdown or restart the process */
+				break;
+			case ECHILD:
+				/** 
+				 * make sure we are not in a race between the signal handler
+				 * and the process restart */
+				if (!start_process) is_shutdown = 1;
+				break;
+			default:
+				break;
+			}
+		} else {
+			/** process went away */
+
+			if (WIFEXITED(exitcode)) {
+				/** normal exit */
+
+				is_shutdown = 1;
+
+				fprintf(stderr, "%s.%d: child (pid=%d) exited normally with exitcode: %d\n", 
+						__FILE__, __LINE__,
+						pid,
+						WEXITSTATUS(exitcode));
+
+			} else if (WIFSIGNALED(exitcode)) {
+				/** got a signal */
+
+				fprintf(stderr, "%s.%d: child (pid=%d) exited unexpectedly with signal %d, restarting\n", 
+						__FILE__, __LINE__,
+						pid,
+						WTERMSIG(exitcode));
+
+				start_process = 1;
+			}
+		}
+	}
+
+	return 0;
+}
+

Modified: lighttpd/trunk/src/mod_fastcgi.c
===================================================================
--- lighttpd/trunk/src/mod_fastcgi.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/mod_fastcgi.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -49,6 +49,12 @@
 #include <sys/wait.h>
 #endif
 
+#define FCGI_ENV_ADD_CHECK(ret, con) \
+	if (ret == -1) { \
+		con->http_status = 400; \
+		con->file_finished = 1; \
+		return -1; \
+	};
 
 /*
  *
@@ -1571,6 +1577,21 @@
 	len += key_len > 127 ? 4 : 1;
 	len += val_len > 127 ? 4 : 1;
 
+	if (env->used + len >= FCGI_MAX_LENGTH) {
+		/**
+		 * we can't append more headers, ignore it
+		 */
+		return -1;
+	}
+
+	/**
+	 * field length can be 31bit max
+	 *
+	 * HINT: this can't happen as FCGI_MAX_LENGTH is only 16bit
+	 */
+	if (key_len > 0x7fffffff) key_len = 0x7fffffff;
+	if (val_len > 0x7fffffff) val_len = 0x7fffffff;
+
 	buffer_prepare_append(env, len);
 
 	if (key_len > 127) {
@@ -1600,6 +1621,8 @@
 }
 
 static int fcgi_header(FCGI_Header * header, unsigned char type, size_t request_id, int contentLength, unsigned char paddingLength) {
+	assert(contentLength <= FCGI_MAX_LENGTH);
+	
 	header->version = FCGI_VERSION_1;
 	header->type = type;
 	header->requestIdB0 = request_id & 0xff;
@@ -1754,7 +1777,7 @@
 			}
 			srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
 
-			fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)),con);
 		}
 	}
 
@@ -1781,7 +1804,7 @@
 			}
 			srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
 
-			fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)), con);
 		}
 	}
 
@@ -1825,10 +1848,10 @@
 	buffer_prepare_copy(p->fcgi_env, 1024);
 
 
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_STR_LEN(PACKAGE_NAME"/"PACKAGE_VERSION));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_STR_LEN(PACKAGE_NAME"/"PACKAGE_VERSION)),con)
 
 	if (con->server_name->used) {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), CONST_BUF_LEN(con->server_name));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), CONST_BUF_LEN(con->server_name)),con)
 	} else {
 #ifdef HAVE_IPV6
 		s = inet_ntop(srv_sock->addr.plain.sa_family,
@@ -1839,10 +1862,10 @@
 #else
 		s = inet_ntoa(srv_sock->addr.ipv4.sin_addr);
 #endif
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), s, strlen(s));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), s, strlen(s)),con)
 	}
 
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1"));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1")),con)
 
 	LI_ltostr(buf,
 #ifdef HAVE_IPV6
@@ -1852,7 +1875,7 @@
 #endif
 	       );
 
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PORT"), buf, strlen(buf));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PORT"), buf, strlen(buf)),con)
 
 	/* get the server-side of the connection to the client */
 	our_addr_len = sizeof(our_addr);
@@ -1862,7 +1885,7 @@
 	} else {
 		s = inet_ntop_cache_get_ip(srv, &(our_addr));
 	}
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s)),con)
 
 	LI_ltostr(buf,
 #ifdef HAVE_IPV6
@@ -1872,10 +1895,10 @@
 #endif
 	       );
 
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_PORT"), buf, strlen(buf));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_PORT"), buf, strlen(buf)),con)
 
 	s = inet_ntop_cache_get_ip(srv, &(con->dst_addr));
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_ADDR"), s, strlen(s));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_ADDR"), s, strlen(s)),con)
 
 	if (!buffer_is_empty(con->authed_user)) {
 		/* AUTH_TYPE fix by Troy Kruthoff (tkruthoff at gmail.com)
@@ -1891,7 +1914,7 @@
 		char *http_authorization = NULL;
 		data_string *ds;
 	  	
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_USER"), CONST_BUF_LEN(con->authed_user));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_USER"), CONST_BUF_LEN(con->authed_user)),con)
 	
 		if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization"))) {
 			http_authorization = ds->value->ptr;
@@ -1915,7 +1938,7 @@
 
 		/* request.content_length < SSIZE_MAX, see request.c */
 		LI_ltostr(buf, con->request.content_length);
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf)),con)
 	}
 
 	if (host->mode != FCGI_AUTHORIZER) {
@@ -1926,10 +1949,10 @@
 		 * For AUTHORIZER mode these headers should be omitted.
 		 */
 
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path)),con)
 
 		if (!buffer_is_empty(con->request.pathinfo)) {
-			fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo)),con)
 
 			/* PATH_TRANSLATED is only defined if PATH_INFO is set */
 
@@ -1939,9 +1962,9 @@
 				buffer_copy_string_buffer(p->path, con->physical.doc_root);
 			}
 			buffer_append_string_buffer(p->path, con->request.pathinfo);
-			fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path)),con)
 		} else {
-			fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_STR_LEN(""));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_STR_LEN("")),con)
 		}
 	}
 
@@ -1962,8 +1985,8 @@
 		buffer_copy_string_buffer(p->path, host->docroot);
 		buffer_append_string_buffer(p->path, con->uri.path);
 
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path));
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)),con)
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot)),con)
 	} else {
 		buffer_copy_string_buffer(p->path, con->physical.path);
 
@@ -1975,8 +1998,8 @@
 			buffer_append_string_buffer(p->path, con->request.pathinfo);
 		}
 
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path));
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)),con)
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root)),con)
 	}
 
 	if (host->strip_request_uri->used > 1) {
@@ -2002,34 +2025,34 @@
 					con->request.orig_uri->ptr + (host->strip_request_uri->used - 2),
 					con->request.orig_uri->used - (host->strip_request_uri->used - 2));
 		} else {
-			fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
+			FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con)
 		}
 	} else {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con)
 	}
 	if (!buffer_is_equal(con->request.uri, con->request.orig_uri)) {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri)),con)
 	}
 	if (!buffer_is_empty(con->uri.query)) {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query)),con)
 	} else {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN(""));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN("")),con)
 	}
 
 	s = get_http_method_name(con->request.http_method);
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_METHOD"), s, strlen(s));
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_STATUS"), CONST_STR_LEN("200")); /* if php is compiled with --force-redirect */
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_METHOD"), s, strlen(s)),con)
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_STATUS"), CONST_STR_LEN("200")),con) /* if php is compiled with --force-redirect */
 	s = get_http_version_name(con->request.http_version);
-	fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PROTOCOL"), s, strlen(s));
+	FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PROTOCOL"), s, strlen(s)),con)
 
 #ifdef USE_OPENSSL
 	if (srv_sock->is_ssl) {
-		fcgi_env_add(p->fcgi_env, CONST_STR_LEN("HTTPS"), CONST_STR_LEN("on"));
+		FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("HTTPS"), CONST_STR_LEN("on")),con)
 	}
 #endif
 
 
-	fcgi_env_add_request_headers(srv, con, p);
+	FCGI_ENV_ADD_CHECK(fcgi_env_add_request_headers(srv, con, p), con);
 
 	fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0);
 	buffer_append_memory(b, (const char *)&header, sizeof(header));
@@ -2924,10 +2947,8 @@
 		}
 
 		/* fall through */
-		fcgi_create_env(srv, hctx, hctx->request_id);
-
+		if (-1 == fcgi_create_env(srv, hctx, hctx->request_id)) return HANDLER_ERROR;
 		fcgi_set_state(srv, hctx, FCGI_STATE_WRITE);
-
 		/* fall through */
 	case FCGI_STATE_WRITE:
 		ret = srv->network_backend_write(srv, con, hctx->fd, hctx->wb);
@@ -3109,7 +3130,7 @@
 
 			buffer_reset(con->physical.path);
 			con->mode = DIRECT;
-			con->http_status = 503;
+			if (con->http_status != 400) con->http_status = 503;
 			joblist_append(srv, con); /* really ? */
 
 			return HANDLER_FINISHED;

Modified: lighttpd/trunk/src/mod_mysql_vhost.c
===================================================================
--- lighttpd/trunk/src/mod_mysql_vhost.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/mod_mysql_vhost.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -222,7 +222,7 @@
 		s->mysql_pre = buffer_init();
 		s->mysql_post = buffer_init();
 
-		if (sel->used && (qmark = index(sel->ptr, '?'))) {
+		if (sel->used && (qmark = strchr(sel->ptr, '?'))) {
 			*qmark = '\0';
 			buffer_copy_string(s->mysql_pre, sel->ptr);
 			buffer_copy_string(s->mysql_post, qmark+1);

Modified: lighttpd/trunk/src/server.c
===================================================================
--- lighttpd/trunk/src/server.c	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/src/server.c	2007-09-11 10:47:39 UTC (rev 276)
@@ -68,6 +68,7 @@
 static volatile sig_atomic_t graceful_shutdown = 0;
 static volatile sig_atomic_t handle_sig_alarm = 1;
 static volatile sig_atomic_t handle_sig_hup = 0;
+static volatile sig_atomic_t forwarded_sig_hup = 0;
 
 #if defined(HAVE_SIGACTION) && defined(SA_SIGINFO)
 static volatile siginfo_t last_sigterm_info;
@@ -94,8 +95,19 @@
 		handle_sig_alarm = 1; 
 		break;
 	case SIGHUP:
-		handle_sig_hup = 1;
-		memcpy(&last_sighup_info, si, sizeof(*si));
+		/** 
+		 * we send the SIGHUP to all procs in the process-group
+		 * this includes ourself
+		 * 
+		 * make sure we only send it once and don't create a 
+		 * infinite loop
+		 */
+		if (!forwarded_sig_hup) {
+			handle_sig_hup = 1;
+			memcpy(&last_sighup_info, si, sizeof(*si));
+		} else {
+			forwarded_sig_hup = 0;
+		}
 		break;
 	case SIGCHLD:
 		break;
@@ -775,7 +787,10 @@
 			setuid(pwd->pw_uid);
 		}
 #endif
-#ifdef HAVE_SYS_PRCTL_H
+#if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_DUMPABLE)
+		/**
+		 * on IRIX 6.5.30 they have prctl() but no DUMPABLE
+		 */
 		if (srv->srvconf.enable_cores) {
 			prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
 		}
@@ -985,7 +1000,7 @@
 	num_childs = srv->srvconf.max_worker;
 	if (num_childs > 0) {
 		int child = 0;
-		while (!child && !srv_shutdown) {
+		while (!child && !srv_shutdown && !graceful_shutdown) {
 			if (num_childs > 0) {
 				switch (fork()) {
 				case -1:
@@ -1000,14 +1015,61 @@
 			} else {
 				int status;
 
-				/* ignore EINTR */
-				if (-1 != wait(&status)) num_childs++;
+				if (-1 != wait(&status)) {
+					/** 
+					 * one of our workers went away 
+					 */
+					num_childs++;
+				} else {
+					switch (errno) {
+					case EINTR:
+						/**
+						 * if we receive a SIGHUP we have to close our logs ourself as we don't 
+						 * have the mainloop who can help us here
+						 */
+						if (handle_sig_hup) {
+							handle_sig_hup = 0;
+
+							log_error_cycle(srv);
+
+							/**
+							 * forward to all procs in the process-group
+							 * 
+							 * we also send it ourself
+							 */
+							if (!forwarded_sig_hup) {
+								forwarded_sig_hup = 1;
+								kill(0, SIGHUP);
+							}
+						}
+						break;
+					default:
+						break;
+					}
+				}
 			}
 		}
-		if (srv_shutdown) {
-			kill(0, SIGTERM);
+
+		/**
+		 * for the parent this is the exit-point 
+		 */
+		if (!child) {
+			/** 
+			 * kill all children too 
+			 */
+			if (graceful_shutdown) {
+				kill(0, SIGINT);
+			} else if (srv_shutdown) {
+				kill(0, SIGTERM);
+			}
+
+			log_error_close(srv);
+			network_close(srv);
+			connections_free(srv);
+			plugins_free(srv);
+			server_free(srv);
+			return 0;
 		}
-		if (!child) return 0;
 	}
 #endif
 
@@ -1098,9 +1160,9 @@
 #ifdef HAVE_SIGACTION
 				log_error_write(srv, __FILE__, __LINE__, "sdsd", 
 					"logfiles cycled UID =",
-					last_sigterm_info.si_uid,
+					last_sighup_info.si_uid,
 					"PID =",
-					last_sigterm_info.si_pid);
+					last_sighup_info.si_pid);
 #else
 				log_error_write(srv, __FILE__, __LINE__, "s", 
 					"logfiles cycled");

Modified: lighttpd/trunk/tests/mod-redirect.t
===================================================================
--- lighttpd/trunk/tests/mod-redirect.t	2007-09-11 10:44:41 UTC (rev 275)
+++ lighttpd/trunk/tests/mod-redirect.t	2007-09-11 10:47:39 UTC (rev 276)
@@ -8,7 +8,7 @@
 
 use strict;
 use IO::Socket;
-use Test::More tests => 6;
+use Test::More tests => 7;
 use LightyTest;
 
 my $tf = LightyTest->new();
@@ -24,6 +24,14 @@
 $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:'.$tf->{PORT}.'/' } ];
 ok($tf->handle_http($t) == 0, 'external redirect');
 
+$t->{REQUEST}  = ( <<EOF
+GET /redirect/ HTTP/1.0
+Host: vvv.example.org
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:'.$tf->{PORT}.'/', 'Content-Length' => '0' } ];
+ok($tf->handle_http($t) == 0, 'external redirect should have a Content-Length: 0');
+
 $t->{REQUEST} = ( <<EOF
 GET /redirect/ HTTP/1.0
 Host: zzz.example.org




More information about the pkg-lighttpd-maintainers mailing list