Hi,
I was playing a bit with httpd(8) new "hsts" setting when some
trivial tests with Firefox would sometimes give the following error:
The site specified an invalid Strict-Transport-Security header.
Some pages would also load and reload a few times before appearing in
the browser.
curl would show something strange.
$ curl -s -D- https://www.example.com/ | grep ^Strict
Strict-Transport-Security: max-age=31536000; includeSubDomains??
^^
random junk
It looks like there were some wrong calls to kv_set() and kv_setkey(),
which were easier to find with some __printf__ attributes.
The following diff is an attempt at fixing these.
Cheers.
Index: httpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v
retrieving revision 1.94
diff -u -p -u -r1.94 httpd.h
--- httpd.h 29 Jul 2015 22:03:41 -0000 1.94
+++ httpd.h 30 Jul 2015 20:17:35 -0000
@@ -635,8 +635,8 @@ u_int32_t prefixlen2mask(u_int8_t);
int accept_reserve(int, struct sockaddr *, socklen_t *, int,
volatile int *);
struct kv *kv_add(struct kvtree *, char *, char *);
-int kv_set(struct kv *, char *, ...);
-int kv_setkey(struct kv *, char *, ...);
+int kv_set(struct kv *, char *, ...) __attribute__((__format__
(printf, 2, 3)));
+int kv_setkey(struct kv *, char *, ...) __attribute__((__format__
(printf, 2, 3)));
void kv_delete(struct kvtree *, struct kv *);
struct kv *kv_extend(struct kvtree *, struct kv *, char *);
void kv_purge(struct kvtree *);
Index: server_fcgi.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_fcgi.c,v
retrieving revision 1.61
diff -u -p -u -r1.61 server_fcgi.c
--- server_fcgi.c 29 Jul 2015 22:03:41 -0000 1.61
+++ server_fcgi.c 30 Jul 2015 20:17:35 -0000
@@ -603,7 +603,7 @@ server_fcgi_header(struct client *clt, u
return (-1);
/* Add error codes */
- if (kv_setkey(&resp->http_pathquery, "%lu", code) == -1 ||
+ if (kv_setkey(&resp->http_pathquery, "%u", code) == -1 ||
kv_set(&resp->http_pathquery, "%s", error) == -1)
return (-1);
@@ -640,7 +640,7 @@ server_fcgi_header(struct client *clt, u
if ((cl =
kv_add(&resp->http_headers, "Strict-Transport-Security",
NULL)) == NULL ||
- kv_set(cl, "max-age=%d%s%s%s", srv_conf->hsts_max_age,
+ kv_set(cl, "max-age=%d%s%s", srv_conf->hsts_max_age,
srv_conf->hsts_flags & HSTSFLAG_SUBDOMAINS ?
"; includeSubDomains" : "",
srv_conf->hsts_flags & HSTSFLAG_PRELOAD ?
Index: server_http.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
retrieving revision 1.95
diff -u -p -u -r1.95 server_http.c
--- server_http.c 29 Jul 2015 22:03:41 -0000 1.95
+++ server_http.c 30 Jul 2015 20:17:36 -0000
@@ -1244,7 +1244,7 @@ server_response_http(struct client *clt,
return (-1);
/* Add error codes */
- if (kv_setkey(&resp->http_pathquery, "%lu", code) == -1 ||
+ if (kv_setkey(&resp->http_pathquery, "%u", code) == -1 ||
kv_set(&resp->http_pathquery, "%s", error) == -1)
return (-1);
@@ -1281,7 +1281,7 @@ server_response_http(struct client *clt,
if ((cl =
kv_add(&resp->http_headers, "Strict-Transport-Security",
NULL)) == NULL ||
- kv_set(cl, "max-age=%d%s%s%s", srv_conf->hsts_max_age,
+ kv_set(cl, "max-age=%d%s%s", srv_conf->hsts_max_age,
srv_conf->hsts_flags & HSTSFLAG_SUBDOMAINS ?
"; includeSubDomains" : "",
srv_conf->hsts_flags & HSTSFLAG_PRELOAD ?