aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2024-12-31 11:52:44 +0000
committerLaurent Bercot <ska@appnovation.com>2024-12-31 11:52:44 +0000
commite0eb28e36b05121a8e71b74da98f609f5439d390 (patch)
tree6ebe33747632a652117faaa85bfc90b80ce6e279
parent228a00c9ac7c9f8a31eecbe69851c8a9c9a23b52 (diff)
downloadtipidee-e0eb28e36b05121a8e71b74da98f609f5439d390.tar.gz
Fix AUTH_TYPE off-by-one
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--src/tipideed/cgi.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/tipideed/cgi.c b/src/tipideed/cgi.c
index 4a7f9f2..648f257 100644
--- a/src/tipideed/cgi.c
+++ b/src/tipideed/cgi.c
@@ -27,16 +27,17 @@
#define dienomem(rql, docroot) die500sys(rql, 111, (docroot), "stralloc_catb")
-static void addenv_ (tipidee_rql const *rql, char const *docroot, char const *k, char const *v, int slash)
+static void addenv_ (tipidee_rql const *rql, char const *docroot, char const *k, char const *v, size_t vlen, int slash)
{
if (!stralloc_cats(&g.sa, k)
|| !stralloc_catb(&g.sa, "=/", 1 + !!slash)
- || !stralloc_cats(&g.sa, v)
+ || !stralloc_catb(&g.sa, v, vlen)
|| !stralloc_0(&g.sa)) dienomem(rql, docroot) ;
}
-#define addenv(rql, d, k, v) addenv_(rql, d, k, (v), 0)
-#define addenvslash(rql, d, k, v) addenv_(rql, d, k, (v), 1)
+#define addenv(rql, d, k, v) addenv_(rql, d, k, (v), strlen(v), 0)
+#define addenvb(rql, d, k, v, vlen) addenv_(rql, d, k, v, (vlen), 0)
+#define addenvslash(rql, d, k, v) addenv_(rql, d, k, (v), strlen(v), 1)
static void delenv (tipidee_rql const *rql, char const *docroot, char const *k)
{
@@ -92,13 +93,11 @@ static inline void modify_env (tipidee_rql const *rql, char const *docroot, tipi
char const *val = hdr->buf + hdr->list[i].right ;
if (!strcasecmp(key, "Authorization"))
{
- size_t n = str_chr(val, ' ') ;
- if (n)
+ size_t len = strlen(val) ;
+ size_t n = byte_chr(val, len, ' ') ;
+ if (n < len)
{
- char scheme[n] ;
- memcpy(scheme, val, n-1) ;
- scheme[n-1] = 0 ;
- addenv(rql, docroot, "AUTH_TYPE", scheme) ;
+ addenvb(rql, docroot, "AUTH_TYPE", val, n) ;
got |= 1 ;
}
}