X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=64d6e62a5323b573d87c3f32f2ee76618212be59;hb=0b507b17a760b21e33fc52ff377db6aa5086c680;hp=97f766c33c5b043559472d3b6817d442626c4bc1;hpb=e98055de981b568c31f18f470181ae166b56f172;p=elogind.git diff --git a/src/shared/util.c b/src/shared/util.c index 97f766c33..64d6e62a5 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -56,6 +56,7 @@ #include #include #include +#include #include "macro.h" #include "util.h" @@ -71,6 +72,8 @@ int saved_argc = 0; char **saved_argv = NULL; +static int parsed_columns = 0; + size_t page_size(void) { static __thread size_t pgsz = 0; long r; @@ -1686,7 +1689,8 @@ char *xescape(const char *s, const char *bad) { * chars, in \xFF style escaping. May be reversed with * cunescape. */ - if (!(r = new(char, strlen(s)*4+1))) + r = new(char, strlen(s) * 4 + 1); + if (!r) return NULL; for (f = s, t = r; *f; f++) { @@ -3740,7 +3744,7 @@ int fd_columns(int fd) { } static unsigned columns_cached(bool cached) { - static __thread int parsed_columns = 0, env_columns = -1; + static __thread int env_columns = -1; const char *e; if (_likely_(parsed_columns > 0 && cached)) @@ -3776,6 +3780,11 @@ unsigned columns_uncached(void) { return columns_cached(false); } +/* intended to be used as a SIGWINCH sighandler */ +void columns_cache_reset(int signum) { + parsed_columns = 0; +} + int fd_lines(int fd) { struct winsize ws; zero(ws); @@ -5843,3 +5852,39 @@ void closedirp(DIR **d) { void umaskp(mode_t *u) { umask(*u); } + +bool filename_is_safe(const char *p) { + + if (isempty(p)) + return false; + + if (strchr(p, '/')) + return false; + + if (streq(p, ".")) + return false; + + if (streq(p, "..")) + return false; + + if (strlen(p) > FILENAME_MAX) + return false; + + return true; +} + +bool string_is_safe(const char *p) { + const char *t; + + assert(p); + + for (t = p; *t; t++) { + if (*p < ' ') + return false; + + if (strchr("\\\"\'", *p)) + return false; + } + + return true; +}