summaryrefslogtreecommitdiff
path: root/src/tipideed/responses.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-10-19 06:36:35 +0000
committerLaurent Bercot <ska@appnovation.com>2023-10-19 06:36:35 +0000
commite782d9cf91c4b5b92897032277c795126d404889 (patch)
tree71c4793c21350edc3235072e825823494005f5f3 /src/tipideed/responses.c
parent1a7e3d00588725da3d8764fa9d624bc8611be070 (diff)
downloadtipidee-e782d9cf91c4b5b92897032277c795126d404889.tar.xz
Fix custom response, get rid of secondary static stralloc
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/tipideed/responses.c')
-rw-r--r--src/tipideed/responses.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/tipideed/responses.c b/src/tipideed/responses.c
index 0d0840c..70dcddf 100644
--- a/src/tipideed/responses.c
+++ b/src/tipideed/responses.c
@@ -8,6 +8,7 @@
#include <skalibs/types.h>
#include <skalibs/buffer.h>
#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <skalibs/unix-timed.h>
@@ -37,7 +38,14 @@ void response_error (tipidee_rql const *rql, char const *docroot, unsigned int s
{
tain deadline ;
tipidee_defaulttext dt ;
- char const *file = tipidee_conf_get_errorfile(&g.conf, docroot, status) ;
+ char const *file ;
+ size_t salen = g.sa.len ;
+ if (sarealpath(&g.sa, docroot) == -1 || !stralloc_0(&g.sa))
+ die500sys(rql, 111, docroot, "realpath ", docroot) ;
+ if (strncmp(g.sa.s + salen, g.sa.s, g.cwdlen) || g.sa.s[salen + g.cwdlen] != '/')
+ die500x(rql, 102, docroot, "docroot ", docroot, " points outside of the server's root") ;
+ file = tipidee_conf_get_errorfile(&g.conf, g.sa.s + salen + g.cwdlen + 1, status) ;
+ g.sa.len = salen ;
if (!tipidee_util_defaulttext(status, &dt))
{
char fmt[UINT_FMT] ;
@@ -47,20 +55,27 @@ void response_error (tipidee_rql const *rql, char const *docroot, unsigned int s
if (file)
{
- int fd = open_read(file) ;
- if (fd == -1) strerr_warnwu3sys("open ", "custom error file ", file) ;
+ int fd ;
+ if (file[0] == '/')
+ {
+ char fmt[UINT_FMT] ;
+ fmt[uint_fmt(fmt, status)] = 0 ;
+ strerr_dief4x(102, "bad configuration: absolute path for custom ", fmt, " file: ", file) ;
+ }
+ fd = open_read(file) ;
+ if (fd == -1) strerr_warnwu3sys("open ", "custom response file ", file) ;
else
{
struct stat st ;
if (fstat(fd, &st) == -1)
{
fd_close(fd) ;
- strerr_warnwu3sys("stat ", "custom error file ", file) ;
+ strerr_warnwu3sys("stat ", "custom response file ", file) ;
}
else if (!S_ISREG(st.st_mode))
{
fd_close(fd) ;
- strerr_warnw3x("custom error file ", file, " is not a regular file") ;
+ strerr_warnw3x("custom response file ", file, " is not a regular file") ;
}
else
{