Geir Thomassen wrote, regarding networking/httpd.c line 1358

Hello, I think the test for an unconfigured httpd is wrong in
    the CVS (busybox-unstable-20030620.tar.bz2)

    flg_deny_all is default 0

vodz then wrote:

    Oops. You are right.
    Also, this mistake haved from two place.
    Last patch rewroted to my new get_ularg() function for overcompensate size
    from this error found ;-)
This commit is contained in:
Eric Andersen
2003-06-26 09:05:32 +00:00
parent fd10c70521
commit a3bb3e6e0b
4 changed files with 73 additions and 76 deletions

View File

@@ -122,7 +122,7 @@
#include "busybox.h"
static const char httpdVersion[] = "busybox httpd/1.27 25-May-2003";
static const char httpdVersion[] = "busybox httpd/1.28 22-Jun-2003";
static const char default_path_httpd_conf[] = "/etc";
static const char httpd_conf[] = "httpd.conf";
static const char home[] = "./";
@@ -647,11 +647,12 @@ static char *encodeString(const char *string)
* $Errors: None
*
****************************************************************************/
static char *decodeString(char *string, int flag_plus_to_space)
static char *decodeString(char *orig, int flag_plus_to_space)
{
/* note that decoded string is always shorter than original */
char *orig = string;
char *string = orig;
char *ptr = string;
while (*ptr)
{
if (*ptr == '+' && flag_plus_to_space) { *string++ = ' '; ptr++; }
@@ -706,6 +707,7 @@ static void addEnv(const char *name_before_underline,
}
}
#if defined(CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV) || !defined(CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY)
/* set environs SERVER_PORT and REMOTE_PORT */
static void addEnvPort(const char *port_name)
{
@@ -714,6 +716,7 @@ static void addEnvPort(const char *port_name)
sprintf(buf, "%u", config->port);
addEnv(port_name, "PORT", buf);
}
#endif
#endif /* CONFIG_FEATURE_HTTPD_CGI */
#ifdef CONFIG_FEATURE_HTTPD_SET_CGI_VARS_TO_ENV
@@ -1332,7 +1335,7 @@ static int checkPerm(const char *path, const char *request)
} /* for */
if(ipaddr)
return config->flg_deny_all;
return !config->flg_deny_all;
return prev == NULL;
}
@@ -1355,7 +1358,7 @@ static int checkPermIP(const char *request)
}
/* if uncofigured, return 1 - access from all */
return config->flg_deny_all;
return !config->flg_deny_all;
}
#define checkPerm(null, request) checkPermIP(request)
#endif /* CONFIG_FEATURE_HTTPD_BASIC_AUTH */
@@ -1675,9 +1678,6 @@ static int miniHttpd(int server)
exit(0);
}
close(s);
#ifdef TEST
return 0; // exit after processing one request
#endif
}
}
} // while (1)
@@ -1721,16 +1721,52 @@ static void sighup_handler(int sig)
}
#endif
static const char httpd_opts[]="c:d:h:"
#ifdef CONFIG_FEATURE_HTTPD_ENCODE_URL_STR
"e:"
#define OPT_INC_1 1
#else
#define OPT_INC_1 0
#endif
#ifdef CONFIG_FEATURE_HTTPD_BASIC_AUTH
"r:"
#define OPT_INC_2 1
#else
#define OPT_INC_2 0
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
"p:v"
#ifdef CONFIG_FEATURE_HTTPD_SETUID
"u:"
#endif
#endif
;
#define OPT_CONFIG_FILE (1<<0)
#define OPT_DECODE_URL (1<<1)
#define OPT_HOME_HTTPD (1<<2)
#define OPT_ENCODE_URL (1<<(2+OPT_INC_1))
#define OPT_REALM (1<<(2+OPT_INC_1+OPT_INC_2))
#define OPT_PORT (1<<(3+OPT_INC_1+OPT_INC_2))
#define OPT_DEBUG (1<<(4+OPT_INC_1+OPT_INC_2))
#define OPT_SETUID (1<<(5+OPT_INC_1+OPT_INC_2))
#ifdef HTTPD_STANDALONE
int main(int argc, char *argv[])
#else
int httpd_main(int argc, char *argv[])
#endif
{
unsigned long opt;
const char *home_httpd = home;
#ifdef TEST
const char *testArgs[5];
int numTestArgs=0;
char *url_for_decode;
#ifdef CONFIG_FEATURE_HTTPD_ENCODE_URL_STR
const char *url_for_encode;
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
const char *s_port;
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
@@ -1738,6 +1774,7 @@ int httpd_main(int argc, char *argv[])
#endif
#ifdef CONFIG_FEATURE_HTTPD_SETUID
const char *s_uid;
long uid = -1;
#endif
@@ -1752,77 +1789,48 @@ int httpd_main(int argc, char *argv[])
config->ContentLength = -1;
/* check if user supplied a port number */
for (;;) {
int c = getopt( argc, argv, "c:d:h:"
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
"p:v"
#endif
opt = bb_getopt_ulflags(argc, argv, httpd_opts,
&(config->configFile), &url_for_decode, &home_httpd
#ifdef CONFIG_FEATURE_HTTPD_ENCODE_URL_STR
"e:"
, &url_for_encode
#endif
#ifdef CONFIG_FEATURE_HTTPD_BASIC_AUTH
"r:"
, &(config->realm)
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
, &s_port
#ifdef CONFIG_FEATURE_HTTPD_SETUID
"u:"
, &s_uid
#endif
#ifdef TEST
"t:"
#endif
);
if (c == EOF) break;
switch (c) {
case 'c':
config->configFile = optarg;
break;
case 'h':
home_httpd = optarg;
break;
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
case 'v':
config->debugHttpd = 1;
break;
case 'p':
config->port = bb_xgetlarg(optarg, 10, 1, 0xffff);
break;
#endif
case 'd':
printf("%s", decodeString(optarg, 1));
if(opt & OPT_DECODE_URL) {
printf("%s", decodeString(url_for_decode, 1));
return 0;
}
#ifdef CONFIG_FEATURE_HTTPD_ENCODE_URL_STR
case 'e':
printf("%s", encodeString(optarg));
if(opt & OPT_ENCODE_URL) {
printf("%s", encodeString(url_for_encode));
return 0;
}
#endif
#ifdef CONFIG_FEATURE_HTTPD_BASIC_AUTH
case 'r':
config->realm = optarg;
break;
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
if(opt & OPT_PORT)
config->port = bb_xgetlarg(s_port, 10, 1, 0xffff);
config->debugHttpd = opt & OPT_DEBUG;
#ifdef CONFIG_FEATURE_HTTPD_SETUID
case 'u':
{
if(opt & OPT_SETUID) {
char *e;
uid = strtol(optarg, &e, 0);
uid = strtol(s_uid, &e, 0);
if(*e != '\0') {
/* not integer */
uid = my_getpwnam(optarg);
uid = my_getpwnam(s_uid);
}
}
break;
#endif
#ifdef TEST
case 't':
testArgs[numTestArgs++]=optarg;
break;
#endif
default:
bb_error_msg("%s", httpdVersion);
bb_show_usage();
}
}
if(chdir(home_httpd)) {
bb_perror_msg_and_die("can`t chdir to %s", home_httpd);
@@ -1845,18 +1853,6 @@ int httpd_main(int argc, char *argv[])
parse_conf(default_path_httpd_conf, FIRST_PARSE);
#endif
#ifdef TEST
if (numTestArgs)
{
int result;
if (strcmp(testArgs[0], "ip") == 0) testArgs[0] = 0;
if (numTestArgs > 2)
parse_conf(testArgs[2], SUBDIR_PARSE);
result = printf("%d\n", checkPerm(testArgs[0], testArgs[1]));
return result;
}
#endif
#ifndef CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
if (!config->debugHttpd) {
if (daemon(1, 0) < 0) /* don`t change curent directory */