X-Git-Url: https://git.cameronkatri.com/cgit.git/blobdiff_plain/83a5f35a2724ee60bfd8c5679b98da7008272254..271ac5a7e6b5b67f54fdd16e8542aa282f1c7140:/cache.c diff --git a/cache.c b/cache.c index 1ff1251..372e38d 100644 --- a/cache.c +++ b/cache.c @@ -10,6 +10,27 @@ const int NOLOCK = -1; +char *cache_safe_filename(const char *unsafe) +{ + static char buf[4][PATH_MAX]; + static int bufidx; + char *s; + char c; + + bufidx++; + bufidx &= 3; + s = buf[bufidx]; + + while(unsafe && (c = *unsafe++) != 0) { + if (c == '/' || c == ' ' || c == '&' || c == '|' || + c == '>' || c == '<' || c == '.') + c = '_'; + *s++ = c; + } + *s = '\0'; + return buf[bufidx]; +} + int cache_exist(struct cacheitem *item) { if (stat(item->name, &item->st)) { @@ -27,15 +48,18 @@ int cache_create_dirs() if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; - if (!cgit_query_repo) + if (!cgit_repo) return 0; - path = fmt("%s/%s", cgit_cache_root, cgit_query_repo); + path = fmt("%s/%s", cgit_cache_root, + cache_safe_filename(cgit_repo->url)); + if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; if (cgit_query_page) { - path = fmt("%s/%s/%s", cgit_cache_root, cgit_query_repo, + path = fmt("%s/%s/%s", cgit_cache_root, + cache_safe_filename(cgit_repo->url), cgit_query_page); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0;