X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=path.c;h=2ec950b27f1c3e4919ce7d1696360c5a49abb724;hb=c76189875b35ca04d42df915cd902a33fdbcb9b0;hp=00d06332959af03b036b3d0b5ad115dd3b46b920;hpb=c8b1d761f61c4be0b036620ba418ff0e97979fde;p=git.git diff --git a/path.c b/path.c index 00d063329..2ec950b27 100644 --- a/path.c +++ b/path.c @@ -581,3 +581,50 @@ char *strip_path_suffix(const char *path, const char *suffix) return NULL; return xstrndup(path, chomp_trailing_dir_sep(path, path_len)); } + +int daemon_avoid_alias(const char *p) +{ + int sl, ndot; + + /* + * This resurrects the belts and suspenders paranoia check by HPA + * done in <435560F7.4080006@zytor.com> thread, now enter_repo() + * does not do getcwd() based path canonicalizations. + * + * sl becomes true immediately after seeing '/' and continues to + * be true as long as dots continue after that without intervening + * non-dot character. + */ + if (!p || (*p != '/' && *p != '~')) + return -1; + sl = 1; ndot = 0; + p++; + + while (1) { + char ch = *p++; + if (sl) { + if (ch == '.') + ndot++; + else if (ch == '/') { + if (ndot < 3) + /* reject //, /./ and /../ */ + return -1; + ndot = 0; + } + else if (ch == 0) { + if (0 < ndot && ndot < 3) + /* reject /.$ and /..$ */ + return -1; + return 0; + } + else + sl = ndot = 0; + } + else if (ch == 0) + return 0; + else if (ch == '/') { + sl = 1; + ndot = 0; + } + } +}