]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Add escape_filename_pathsep() function to lib
authorRadosław Korzeniewski <radoslaw@korzeniewski.net>
Fri, 2 Apr 2021 13:11:10 +0000 (15:11 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:03:01 +0000 (09:03 +0100)
bacula/src/lib/Makefile.in
bacula/src/lib/bsys.c
bacula/src/lib/protos.h
regress/scripts/regress-utils.sh

index 06c7c85b9d9228637fe44848f4fb1077715fae14..b5cd151d2c4b74b9d65811a41e097b11ad4c92ad 100644 (file)
@@ -73,8 +73,11 @@ LIBBAC_LOBJS = $(LIBBAC_LOBJS_TMP:.cc=.lo)
 # libbaccfg (config functions)
 #
 LIBBACCFG_SRCS = ini.c parse_conf.c res.c bjson.c
-LIBBACCFG_OBJS = $(LIBBACCFG_SRCS:.c=.o) 
-LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo) 
+LIBBACCFG_OBJS = $(LIBBACCFG_SRCS:.c=.o)
+LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo)
+
+# libbacfind
+LIBBACFINDTARGET = ../findlib/libbacfind.la
 
 .SUFFIXES:     .c .cc .o .lo .ch .dvi .pdf .tex .view .w .1
 .PHONY:
@@ -99,6 +102,9 @@ LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo)
 
 # specific build rules
 
+$(LIBBACFINDTARGET):
+       make -C ../findlib libbacfind.la
+
 #-------------------------------------------------------------------------
 all: Makefile libbac$(DEFAULT_ARCHIVE_TYPE) libbaccfg$(DEFAULT_ARCHIVE_TYPE)
        @echo "==== Make of lib is good ===="
@@ -109,9 +115,9 @@ libbac.a: $(LIBBAC_OBJS)
        $(AR) rc  $@ $(LIBBAC_OBJS)
        $(RANLIB) $@
 
-libbac.la: Makefile $(LIBBAC_LOBJS) 
+libbac.la: Makefile $(LIBBAC_LOBJS)
        @echo "Making $@ ..."
-       $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBAC_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBAC_LT_RELEASE) $(WRAPLIBS) $(CAP_LIBS) $(ZLIBS) $(OPENSSL_LIBS) $(LIBS) $(DLLIBS) 
+       $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBAC_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBAC_LT_RELEASE) $(WRAPLIBS) $(CAP_LIBS) $(ZLIBS) $(OPENSSL_LIBS) $(LIBS) $(DLLIBS)
 
 libbaccfg.a: $(LIBBACCFG_OBJS)
        @echo "Making $@ ..."
@@ -126,7 +132,7 @@ Makefile: $(srcdir)/Makefile.in $(topdir)/config.status
        cd $(topdir) \
          && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
-bsys_test: Makefile bsys.c unittests.o
+bsys_test: Makefile bsys.c unittests.o libbac.la $(LIBBACFINDTARGET)
        $(CXX) -DTEST_PROGRAM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) -o bsys_test.o bsys.c
        $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -L../findlib -o $@ bsys_test.o unittests.o $(DLIB) -lbac -lbacfind -lm $(LIBS) $(OPENSSL_LIBS)
 
@@ -220,7 +226,7 @@ htable_test: Makefile libbac.la htable.c unittests.o
        $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ htable.o unittests.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS)
        $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) $@ $(DESTDIR)$(sbindir)/
        $(RMF) htable.o
-       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) htable.c 
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) htable.c
 
 alist_test: Makefile libbac.la alist.c unittests.o
        $(RMF) alist.o
@@ -271,7 +277,7 @@ sellist_test: Makefile libbac.la sellist.c unittests.o
        $(RMF) sellist.o
        $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) sellist.c
 
-bcrc32sum: Makefile bcrc32.o     
+bcrc32sum: Makefile bcrc32.o
        $(RMF) bcrc32.o
        $(CXX) -DCRC32_SUM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE)  $(CFLAGS) bcrc32.c
        $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ bcrc32.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS)
index c7f0385a98bdf247c770f9df1f4d15ccc91ee890..a92dcedf1be7a891291da5dfa4086bd633736a5c 100644 (file)
@@ -969,6 +969,69 @@ char *escape_filename(const char *file_path)
    return escaped_path;
 }
 
+char * escape_filename_pathsep(const char* fname, char *buf, int len)
+{
+   if (fname != NULL && buf != NULL && len > 0) {
+      memset(buf, 0, len);
+      char ch[2]; // we do a simple one char string
+      ch[0] = fname[0];
+      ch[1] = '\0';
+      for (int i = 0; i < (len - 1) && ch[0] != '\0'; i++)
+      {
+         ch[0] = fname[i];
+         switch (ch[0])
+         {
+         case '/':
+            strcat(buf, "%2F");
+            break;
+         default:
+            strcat(buf, ch);
+            break;
+         }
+      }
+   }
+
+   return buf;
+}
+
+char * unescape_filename_pathsep(const char* fname, char *buf, int len)
+{
+   if (fname != NULL && buf != NULL && len > 0) {
+      memset(buf, 0, len);
+      char ch[2]; // we do a simple one char string
+      ch[0] = fname[0];
+      ch[1] = '\0';
+      for (int i = 0; len > 0 && ch[0] != '\0'; i++)
+      {
+         ch[0] = fname[i];
+         switch (ch[0])
+         {
+         case '%':
+            // we always have the next char available because `nul` character is required
+            if (fname[i + 1] == '2'){
+               // so the next char should be available too
+               if (fname[i + 2] == 'F'){
+                  // bingo, got escaped char, proceed
+                  strcat(buf, "/");
+                  i += 2;
+                  len--;
+                  break;
+               }
+            }
+#if __cplusplus >= 201703L
+            [[fallthrough]];
+#endif
+         default:
+            strcat(buf, ch);
+            len--;
+            break;
+         }
+      }
+   }
+
+   return buf;
+}
+
 #if HAVE_BACKTRACE && HAVE_GCC && HAVE_LINUX_OS
 /* if some names are not resolved you can try using : addr2line, like this
  * $ addr2line -e bin/bacula-sd -a 0x43cd11
@@ -1963,6 +2026,39 @@ int main(int argc, char **argv)
    char type[10];
    bstrncpy(type, p, 8);
    ok(strcmp(type, "/@MYSQL") == 0, "bstrncpy()");
+
+   int len = 100;
+   char buf[len];
+   struct testvectdata
+   {
+      const char * fname;
+      const char *result;
+   };
+   testvectdata vector[] = {
+      {"/ - testvect file", "%2F - testvect file"},
+      {"filename/value", "filename%2Fvalue"},
+      {"directory/value/", "directory%2Fvalue%2F"},
+      {"/path///value/", "%2Fpath%2F%2F%2Fvalue%2F"},
+      {"/////", "%2F%2F%2F%2F%2F"},
+      {NULL, NULL},
+   };
+
+   int i = 0;
+   while (vector[i].fname != NULL)
+   {
+      char *retp = escape_filename_pathsep(vector[i].fname, &buf[0], len);
+      ok(retp != NULL, vector[i].fname);
+      ok(retp == &buf[0], "escape checking value return pointer");
+      ok(strcmp(retp, vector[i].result) == 0, "escape checking result vector");
+
+      retp = unescape_filename_pathsep(vector[i].result, &buf[0], len);
+      ok(retp != NULL, vector[i].result);
+      ok(retp == &buf[0], "unescape checking value return pointer");
+      ok(strcmp(retp, vector[i].fname) == 0, "unescape checking result vector");
+
+      i++;
+   }
+
    return report();
 }
 #endif
index 66b6d570bb998f30c594d797000f842193307d05..3be5b8bd1e59cf29978c21f43600ffce574c5586 100644 (file)
@@ -63,7 +63,7 @@ void display_bit_array(char *array, int num);
 void display_last(HPKT &hpkt);
 void init_hpkt(HPKT &hpkt);
 void term_hpkt(HPKT &hpkt);
-int display_global_item(HPKT &hpkt); // 
+int display_global_item(HPKT &hpkt); //
 void display_collector_types(HPKT &hpkt);
 
 /* bsys.c */
@@ -117,6 +117,8 @@ long long int strtoll            (const char *ptr, char **endptr, int base);
 void      read_state_file(char *dir, const char *progname, int port);
 int       b_strerror(int errnum, char *buf, size_t bufsiz);
 char     *escape_filename(const char *file_path);
+char     *escape_filename_pathsep(const char *fname, char *buf, int len);
+char     *unescape_filename_pathsep(const char *fname, char *buf, int len);
 int       Zdeflate(char *in, int in_len, char *out, int &out_len);
 int       Zinflate(char *in, int in_len, char *out, int &out_len);
 void      stack_trace();
index 07028bc29faa542a7b417d587fda511da647eca2..eb6956b100882185a19fd348c000ca2c4269c092 100644 (file)
@@ -352,6 +352,11 @@ dn: cn=root,dc=$db_name,dc=bacula,dc=com
 objectClass: organizationalRole
 cn: root
 description: Directory Manager
+
+# The regress special object
+dn: cn=other/name,dc=$db_name,dc=bacula,dc=com
+objectClass: top
+objectClass: device
 END_OF_DATA
 
 ldapadd -f $tmp/entries.ldif -x -D "cn=root,dc=$db_name,dc=bacula,dc=com" -w rootroot -H ldap://localhost:3890 2>&1 > ${tmp}/ldap.add.log