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;
> }
>