URI: 
       fix a regression from 980a398da8acca65a13936ff0792c39f3dcb0ede - geomyidae - A small C-based gopherd.
  HTML git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 9526d3d35917770ca5a021d745bcf50d382875b2
   DIR parent fc79d9a4d2cd906e09d9f046e9f1cc91e35b0f7e
  HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Wed,  8 Mar 2023 20:54:44 +0100
       
       fix a regression from 980a398da8acca65a13936ff0792c39f3dcb0ede
       
       Open directory listings did not prefix the entries with / correctly when using
       a chroot.
       
       Signed-off-by: Christoph Lohmann <20h@r-36.net>
       
       Diffstat:
         M handlr.c                            |      22 +++++++++++++++++-----
       
       1 file changed, 17 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/handlr.c b/handlr.c
       @@ -21,6 +21,16 @@
        #include "ind.h"
        #include "arg.h"
        
       +char *
       +make_base_path(char *path, char *base)
       +{
       +        if (!(base[0] == '/' && base[1] == '\0') &&
       +            strlen(path) > strlen(base))
       +                return path + strlen(base);
       +        else
       +                return path;
       +}
       +
        void
        handledir(int sock, char *path, char *port, char *base, char *args,
                        char *sear, char *ohost, char *chost, char *bhost, int istls)
       @@ -37,15 +47,16 @@ handledir(int sock, char *path, char *port, char *base, char *args,
        
                pa = xstrdup(path);
                e = pa + strlen(pa) - 1;
       -        if (e[0] == '/')
       +        if (e > pa && e[0] == '/')
                        *e = '\0';
        
                par = xstrdup(pa);
       -        b = strrchr(par + strlen(base), '/');
       +
       +        b = strrchr(make_base_path(par, base), '/');
                if (b != NULL) {
                        *b = '\0';
                        dprintf(sock, "1..\t%s\t%s\t%s\r\n",
       -                        par + strlen(base), ohost, port);
       +                        make_base_path(par, base), ohost, port);
                }
                free(par);
        
       @@ -62,11 +73,12 @@ handledir(int sock, char *path, char *port, char *base, char *args,
                                }
        
                                type = gettype(dirent[i]->d_name);
       -                        file = smprintf("%s/%s", pa,
       +                        file = smprintf("%s%s%s", pa,
       +                                        pa[0] == '/' && pa[1] == '\0' ? "" : "/",
                                                dirent[i]->d_name);
                                if (stat(file, &st) >= 0 && S_ISDIR(st.st_mode))
                                        type = gettype("index.gph");
       -                        e = file + strlen(base);
       +                        e = make_base_path(file, base);
                                ret = dprintf(sock,
                                                "%c%-50.50s %10s %16s\t%s\t%s\t%s\r\n",
                                                *type->type,