From: Radosław Korzeniewski Date: Fri, 2 Apr 2021 13:11:10 +0000 (+0200) Subject: Add escape_filename_pathsep() function to lib X-Git-Tag: Release-11.3.2~636 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7114ffd1d5dd68844af5188c0e057fc3e758f9c8;p=thirdparty%2Fbacula.git Add escape_filename_pathsep() function to lib --- diff --git a/bacula/src/lib/Makefile.in b/bacula/src/lib/Makefile.in index 06c7c85b9..b5cd151d2 100644 --- a/bacula/src/lib/Makefile.in +++ b/bacula/src/lib/Makefile.in @@ -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) diff --git a/bacula/src/lib/bsys.c b/bacula/src/lib/bsys.c index c7f0385a9..a92dcedf1 100644 --- a/bacula/src/lib/bsys.c +++ b/bacula/src/lib/bsys.c @@ -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 diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 66b6d570b..3be5b8bd1 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -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(); diff --git a/regress/scripts/regress-utils.sh b/regress/scripts/regress-utils.sh index 07028bc29..eb6956b10 100644 --- a/regress/scripts/regress-utils.sh +++ b/regress/scripts/regress-utils.sh @@ -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