Package: dhttpd
Version: 1.02a-11
Followup-For: Bug #293234
See attached patch
cd src/
patch -p1 < *diff
2005-02-02 Jari Aalto <[EMAIL PROTECTED]>
* httpsock.cc: Added extern ROOT_DIR.
(error): Use ROOT_DIR, not WEBDIRPREFIX.
* main.cc
(top level): Added char ROOT_DIR[]. Default value is
initialized from WEBDIRPREFIX (main): Added option '-r' to
select ROOT WWW dir.
-- System Information:
Debian Release: 3.1
APT prefers unstable
APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Kernel: Linux 2.6.9-1-686
Locale: LANG=C, LC_CTYPE=C (charmap=ISO-8859-1) (ignored: LC_ALL set to en_US)
Versions of packages dhttpd depends on:
ii libc6 2.3.2.ds1-20 GNU C Library: Shared libraries an
ii libgcc1 1:3.4.3-7 GCC support library
ii libstdc++5 1:3.3.5-8 The GNU Standard C++ Library v3
-- no debconf information
Only in src: ChangeLog
Only in src: dhttpd
diff -u src.orig/httpsock.cc src/httpsock.cc
--- src.orig/httpsock.cc 2005-02-02 16:04:18.000000000 +0200
+++ src/httpsock.cc 2005-02-02 16:43:05.000000000 +0200
@@ -45,6 +45,8 @@
#define NOT_FOUND 2
#define NOT_MOD 3
+extern char ROOT_DIR[];
+
char *dayName[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
@@ -190,7 +192,8 @@
fprintf( out, "Content-type: text/html\r\n" );
fprintf( out, "\r\n" );
- asprintf( &file, WEBDIRPREFIX"/..ERROR%i.html", num );
+ asprintf( &file, "%s/..ERROR%i.html", ROOT_DIR, num );
+
in = fopen( file, "r" );
if( in!=NULL )
{
@@ -519,7 +522,7 @@
char *decodedfile = decodeURI (file);
char *file2;
asprintf( &file2, "%s%s%s%s"
- ,WEBDIRPREFIX
+ ,ROOT_DIR
,file[ 0 ]=='/' ? "" : "/"
,decodedfile ? decodedfile : file
,((file[0]=='\0') || (file[strlen(file)-1]=='/'))?
Only in src: httpsock.o
diff -u src.orig/main.cc src/main.cc
--- src.orig/main.cc 2005-02-02 16:04:18.000000000 +0200
+++ src/main.cc 2005-02-02 16:42:48.000000000 +0200
@@ -33,9 +33,15 @@
#include "socket.hh"
#include "httpsock.hh"
#include "version.hh"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
int numProc;
+const int ROOT_MAX_LEN = 500;
+char ROOT_DIR[ROOT_MAX_LEN] = WEBDIRPREFIX;
+
void handleChildTerm( int )
{
if( waitpid( 0, NULL, WNOHANG )>0 )
@@ -97,7 +103,7 @@
for( ;; )
{
- o = getopt( argc, argv, "p:hd" );
+ o = getopt( argc, argv, "p:hdr:" );
if( o==-1 )
{
break;
@@ -118,6 +124,27 @@
case 'p':
sscanf( optarg, "%i", &portnum );
break;
+ case 'r':
+ if ( strlen(optarg) > ROOT_MAX_LEN )
+ {
+ // Prevent overflows
+ fprintf(stderr,
+ "[ERROR] Too long WWW root path: %s\n"
+ , optarg );
+
+ exit(1);
+ }
+
+ if ( optarg[strlen(optarg) -1] == '/' )
+ {
+ fprintf(stderr,
+ "[ERROR] No trailing slash allowed: %s\n"
+ , optarg );
+ exit(1);
+ }
+
+ sscanf( optarg, "%s", ROOT_DIR );
+ break;
case 'd':
nofork=true;
break;
Only in src: main.o
Only in src: socket.o