check for conf.error_handler before using it
[project/uhttpd.git] / file.c
diff --git a/file.c b/file.c
index 5287748..b2e6ade 100644 (file)
--- a/file.c
+++ b/file.c
@@ -176,6 +176,9 @@ uh_path_lookup(struct client *cl, const char *url)
                exists = !!canonpath(uh_buf, path_phys);
                uh_buf[i] = ch;
 
+               if (!exists)
+                       continue;
+
                snprintf(path_info, sizeof(path_info), "%s", uh_buf + i);
                break;
        }
@@ -252,7 +255,7 @@ uh_path_lookup(struct client *cl, const char *url)
 
 static const char * uh_file_mime_lookup(const char *path)
 {
-       struct mimetype *m = &uh_mime_types[0];
+       const struct mimetype *m = &uh_mime_types[0];
        const char *e;
 
        while (m->extn) {
@@ -644,7 +647,7 @@ dispatch_find(const char *url, struct path_info *pi)
        return NULL;
 }
 
-static bool __handle_file_request(struct client *cl, const char *url)
+static bool __handle_file_request(struct client *cl, char *url)
 {
        static const struct blobmsg_policy hdr_policy[__HDR_MAX] = {
                [HDR_AUTHORIZATION] = { "authorization", BLOBMSG_TYPE_STRING },
@@ -684,7 +687,8 @@ static bool __handle_file_request(struct client *cl, const char *url)
 void uh_handle_request(struct client *cl)
 {
        struct dispatch_handler *d;
-       const char *url = blobmsg_data(blob_data(cl->hdr.head));;
+       char *url = blobmsg_data(blob_data(cl->hdr.head));;
+       char *error_handler;
 
        d = dispatch_find(url, NULL);
        if (d) {
@@ -692,9 +696,15 @@ void uh_handle_request(struct client *cl)
                return;
        }
 
-       if (__handle_file_request(cl, url) ||
-           __handle_file_request(cl, conf.error_handler))
+       if (__handle_file_request(cl, url))
                return;
 
+       if (conf.error_handler) {
+               error_handler = alloca(strlen(conf.error_handler) + 1);
+               strcpy(error_handler, conf.error_handler);
+               if (__handle_file_request(cl, error_handler))
+                       return;
+       }
+
        uh_client_error(cl, 404, "Not Found", "The requested URL %s was not found on this server.", url);
 }