X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flocale-root.c;fp=src%2Flocale-root.c;h=c9cdf7ddd5e257ee99dc626d19e461467462358b;hb=15059fa1ed5f94c3b5d96357c9be6adfa5ea37b0;hp=8386e669c77426876d7ae71ee6c6875bf7de327d;hpb=a2efb09440814063cf6472b7111ff72c4582f1b2;p=src%2Fapp-framework-binder.git diff --git a/src/locale-root.c b/src/locale-root.c index 8386e669..c9cdf7dd 100644 --- a/src/locale-root.c +++ b/src/locale-root.c @@ -32,6 +32,7 @@ #include #include "locale-root.h" +#include "subpath.h" /* * Implementation of folder based localisation as described here: @@ -78,62 +79,6 @@ struct locale_root { struct locale_search *default_search; }; -/* a valid subpath is a relative path not looking deeper than root using .. */ -static int validsubpath(const char *subpath) -{ - int l = 0, i = 0; - - /* absolute path is not valid */ - if (subpath[i] == '/') - return 0; - - /* inspect the path */ - while(subpath[i]) { - switch(subpath[i++]) { - case '.': - if (!subpath[i]) - break; - if (subpath[i] == '/') { - i++; - break; - } - if (subpath[i++] == '.') { - if (!subpath[i]) { - l--; - break; - } - if (subpath[i++] == '/') { - l--; - break; - } - } - default: - while(subpath[i] && subpath[i] != '/') - i++; - if (l >= 0) - l++; - case '/': - break; - } - } - return l >= 0; -} - -/* - * Normalizes and checks the 'subpath'. - * Removes any starting '/' and checks that 'subpath' - * does not contains sequence of '..' going deeper than - * root. - * Returns the normalized subpath or NULL in case of - * invalid subpath. - */ -static const char *normalsubpath(const char *subpath) -{ - while(*subpath == '/') - subpath++; - return validsubpath(subpath) ? subpath : NULL; -} - /* * Clear a container content */ @@ -595,7 +540,7 @@ static int do_open(struct locale_search *search, const char *filename, int flags int rootfd, fd; /* check the path and normalize it */ - filename = normalsubpath(filename); + filename = subpath_force(filename); if (filename == NULL) goto inval; @@ -686,7 +631,7 @@ static char *do_resolve(struct locale_search *search, const char *filename, stru int rootfd; /* check the path and normalize it */ - filename = normalsubpath(filename); + filename = subpath_force(filename); if (filename == NULL) goto inval; @@ -768,30 +713,6 @@ char *locale_search_resolve(struct locale_search *search, const char *filename) return do_resolve(search, filename, search->root); } -#if defined(TEST_locale_root_validsubpath) -#include -void t(const char *subpath, int validity) { - printf("%s -> %d = %d, %s\n", subpath, validity, validsubpath(subpath), validsubpath(subpath)==validity ? "ok" : "NOT OK"); -} -int main() { - t("/",0); - t("..",0); - t(".",1); - t("../a",0); - t("a/..",1); - t("a/../////..",0); - t("a/../b/..",1); - t("a/b/c/..",1); - t("a/b/c/../..",1); - t("a/b/c/../../..",1); - t("a/b/c/../../../.",1); - t("./..a/././..b/..c/./.././.././../.",1); - t("./..a/././..b/..c/./.././.././.././..",0); - t("./..a//.//./..b/..c/./.././/./././///.././.././a/a/a/a/a",1); - return 0; -} -#endif - #if defined(TEST_locale_root) int main(int ac,char**av) {