aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-07-23 20:17:20 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-07-23 20:17:20 -0700
commit5d8b80236056e229105c158c5aca8ba34d73e468 (patch)
treec13d377b2db1de47b0b618f390c20f4d3cc24790
parent06540c9cef675fd8665325301384f3cc491e9f66 (diff)
downloadsafepath-5d8b80236056e229105c158c5aca8ba34d73e468.tar.gz
safepath-5d8b80236056e229105c158c5aca8ba34d73e468.tar.bz2
safepath-5d8b80236056e229105c158c5aca8ba34d73e468.zip
Map safepath errors to strings.
* safepath.[ch]: New function, safepath_strerr. * testsp.c (main): Use new function to print message, rather than integer code.
-rw-r--r--safepath.c21
-rw-r--r--safepath.h1
-rw-r--r--testsp.c2
3 files changed, 23 insertions, 1 deletions
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]);