aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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]);