Re: httpd(8): server/location directory index question

2020-10-18 Thread mpfr
It appears the patch can be far more simple.

Comments are welcome.


Index: usr.sbin/httpd/config.c
===
RCS file: /cvs/src/usr.sbin/httpd/config.c,v
retrieving revision 1.61
diff -u -p -u -p -r1.61 config.c
--- usr.sbin/httpd/config.c 21 Sep 2020 09:42:07 -  1.61
+++ usr.sbin/httpd/config.c 18 Oct 2020 12:09:36 -
@@ -489,7 +489,12 @@ config_getserver_config(struct httpd *en
/* Inherit configuration from the parent */
f = SRVFLAG_INDEX|SRVFLAG_NO_INDEX;
if ((srv_conf->flags & f) == 0) {
-   srv_conf->flags |= parent->flags & f;
+   /*
+* Inherit index flags from parent server only if
+* auto-index flag of location is not set
+*/
+   if ((srv_conf->flags & SRVFLAG_AUTO_INDEX) == 0)
+   srv_conf->flags |= parent->flags & f;
(void)strlcpy(srv_conf->index, parent->index,
sizeof(srv_conf->index));
}



On 2020-10-17 14:49, m...@fn.de wrote:
> Given the following httpd.conf snippet
> 
> server "example.com" {
>   ...
>   directory no index
>   ...
>   location "/foo" {
>   ...
>   directory auto index
>   ...
>   }
> }
> 
> the URL http://example.com/foo surprisingly results in a 403
> response.
> 
> With the directory option of the "/foo" location changed to
> 
>   location "/foo" {
>   directory {
>   index "index.html"
>   auto index
>   }
>   }
> 
> the auto-index is being generated (as expected).
> 
> I was wondering if there is any reason why the 'auto index' of
> the location shouldn't implicitly override the 'no index' option
> of the enclosing server (as it happens with the patch below).
> 
> 
> 
> Index: usr.sbin/httpd/config.c
> ===
> RCS file: /cvs/src/usr.sbin/httpd/config.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 config.c
> --- usr.sbin/httpd/config.c   21 Sep 2020 09:42:07 -  1.61
> +++ usr.sbin/httpd/config.c   17 Oct 2020 12:26:20 -
> @@ -488,11 +488,10 @@ config_getserver_config(struct httpd *en
>   if (srv_conf->flags & SRVFLAG_LOCATION) {
>   /* Inherit configuration from the parent */
>   f = SRVFLAG_INDEX|SRVFLAG_NO_INDEX;
> - if ((srv_conf->flags & f) == 0) {
> + if ((srv_conf->flags & f) == 0)
>   srv_conf->flags |= parent->flags & f;
> - (void)strlcpy(srv_conf->index, parent->index,
> - sizeof(srv_conf->index));
> - }
> + (void)strlcpy(srv_conf->index, parent->index,
> + sizeof(srv_conf->index));
>  
>   f = SRVFLAG_AUTO_INDEX|SRVFLAG_NO_AUTO_INDEX;
>   if ((srv_conf->flags & f) == 0)
> Index: usr.sbin/httpd/parse.y
> ===
> RCS file: /cvs/src/usr.sbin/httpd/parse.y,v
> retrieving revision 1.118
> diff -u -p -u -p -r1.118 parse.y
> --- usr.sbin/httpd/parse.y11 Oct 2020 03:21:44 -  1.118
> +++ usr.sbin/httpd/parse.y17 Oct 2020 12:26:20 -
> @@ -1006,6 +1006,8 @@ dirflags: INDEX STRING  {
>   srv_conf->flags |= SRVFLAG_NO_INDEX;
>   }
>   | AUTO INDEX{
> + srv_conf->flags &= ~SRVFLAG_NO_INDEX;
> + srv_conf->flags |= SRVFLAG_INDEX;
>   srv_conf->flags &= ~SRVFLAG_NO_AUTO_INDEX;
>   srv_conf->flags |= SRVFLAG_AUTO_INDEX;
>   }
> 



httpd(8): server/location directory index question

2020-10-17 Thread mpfr
Given the following httpd.conf snippet

server "example.com" {
...
directory no index
...
location "/foo" {
...
directory auto index
...
}
}

the URL http://example.com/foo surprisingly results in a 403
response.

With the directory option of the "/foo" location changed to

location "/foo" {
directory {
index "index.html"
auto index
}
}

the auto-index is being generated (as expected).

I was wondering if there is any reason why the 'auto index' of
the location shouldn't implicitly override the 'no index' option
of the enclosing server (as it happens with the patch below).



Index: usr.sbin/httpd/config.c
===
RCS file: /cvs/src/usr.sbin/httpd/config.c,v
retrieving revision 1.61
diff -u -p -u -p -r1.61 config.c
--- usr.sbin/httpd/config.c 21 Sep 2020 09:42:07 -  1.61
+++ usr.sbin/httpd/config.c 17 Oct 2020 12:26:20 -
@@ -488,11 +488,10 @@ config_getserver_config(struct httpd *en
if (srv_conf->flags & SRVFLAG_LOCATION) {
/* Inherit configuration from the parent */
f = SRVFLAG_INDEX|SRVFLAG_NO_INDEX;
-   if ((srv_conf->flags & f) == 0) {
+   if ((srv_conf->flags & f) == 0)
srv_conf->flags |= parent->flags & f;
-   (void)strlcpy(srv_conf->index, parent->index,
-   sizeof(srv_conf->index));
-   }
+   (void)strlcpy(srv_conf->index, parent->index,
+   sizeof(srv_conf->index));
 
f = SRVFLAG_AUTO_INDEX|SRVFLAG_NO_AUTO_INDEX;
if ((srv_conf->flags & f) == 0)
Index: usr.sbin/httpd/parse.y
===
RCS file: /cvs/src/usr.sbin/httpd/parse.y,v
retrieving revision 1.118
diff -u -p -u -p -r1.118 parse.y
--- usr.sbin/httpd/parse.y  11 Oct 2020 03:21:44 -  1.118
+++ usr.sbin/httpd/parse.y  17 Oct 2020 12:26:20 -
@@ -1006,6 +1006,8 @@ dirflags  : INDEX STRING  {
srv_conf->flags |= SRVFLAG_NO_INDEX;
}
| AUTO INDEX{
+   srv_conf->flags &= ~SRVFLAG_NO_INDEX;
+   srv_conf->flags |= SRVFLAG_INDEX;
srv_conf->flags &= ~SRVFLAG_NO_AUTO_INDEX;
srv_conf->flags |= SRVFLAG_AUTO_INDEX;
}