From 5d8b80236056e229105c158c5aca8ba34d73e468 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 23 Jul 2022 20:17:20 -0700 Subject: Map safepath errors to strings. * safepath.[ch]: New function, safepath_strerr. * testsp.c (main): Use new function to print message, rather than integer code. --- safepath.c | 21 +++++++++++++++++++++ safepath.h | 1 + testsp.c | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/safepath.c b/safepath.c index ba4996c..862b5ed 100644 --- a/safepath.c +++ b/safepath.c @@ -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); diff --git a/safepath.h b/safepath.h index b6a8a39..db83d4c 100644 --- a/safepath.h +++ b/safepath.h @@ -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); diff --git a/testsp.c b/testsp.c index 4691d31..1d9f396 100644 --- a/testsp.c +++ b/testsp.c @@ -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]); -- cgit v1.2.3