diff options
-rw-r--r-- | safepath.c | 21 | ||||
-rw-r--r-- | safepath.h | 1 | ||||
-rw-r--r-- | testsp.c | 2 |
3 files changed, 23 insertions, 1 deletions
@@ -337,6 +337,27 @@ out: return ret; } +const char *safepath_strerr(int err) +{ + const char *str[] = { + [SAFEPATH_OK] = "path appears safe", + [SAFEPATH_UNSAFE] = "path contains untrusted component", + [SAFEPATH_PERM] = "path contains inaccessible component", + [SAFEPATH_NOENT] = "path contains nonexistent component", + [SAFEPATH_INVAL] = "path is syntactically invalid", + [SAFEPATH_NOMEM] = "out of memory", + [SAFEPATH_LOOP] = "too many symlink resolutions" + }; + const char *ret = "SAFEPATH_BAD_ERROR_CODE"; + + if (err >= 0 && err <= (int) (sizeof str / sizeof str[0]) && str[err] != 0) + { + ret = str[err]; + } + + return ret; +} + int safepath_open(const char *name, int flags) { int res = safepath_check(name); @@ -47,6 +47,7 @@ enum { }; int safepath_check(const char *name); +const char *safepath_strerr(int err); /* Common POSIX API wrappers */ int safepath_open(const char *name, int flags); @@ -37,7 +37,7 @@ int main(int argc, char **argv) if (argv[0] && argv[1] && !argv[2]) { int res = safepath_check(argv[1]); - printf("safepath_check(\"%s\") == %d\n", argv[1], res); + printf("safepath_check(\"%s\") == %s\n", argv[1], safepath_strerr(res)); return res == SAFEPATH_OK ? 0 : EXIT_FAILURE; } else if (argv[0]) { printf("%s: requires exactly one argument\n", argv[0]); |