afb-hook & afb-trace: Fix usage of readlink 75/15375/2
authorJosé Bollo <jose.bollo@iot.bzh>
Fri, 13 Jul 2018 12:33:56 +0000 (14:33 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Fri, 13 Jul 2018 13:24:14 +0000 (15:24 +0200)
The function readlink doesn't add a terminating null.
This patch fixes that were needed.

Change-Id: Ie15309471fe8203c8e98b97315c4ea30de3ccd75
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-hook.c
src/afb-trace.c

index d9fd1a3..48eb582 100644 (file)
@@ -736,11 +736,14 @@ static void hook_api_event_make_cb(void *closure, const struct afb_hookid *hooki
 static void hook_api_rootdir_get_fd_cb(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, int result)
 {
        char path[PATH_MAX], proc[100];
+       ssize_t s;
+
        if (result < 0)
                _hook_api_(export, "rootdir_get_fd() -> %d, %m", result);
        else {
                snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
-               readlink(proc, path, sizeof path);
+               s = readlink(proc, path, sizeof path);
+               path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
                _hook_api_(export, "rootdir_get_fd() -> %d = %s", result, path);
        }
 }
@@ -748,13 +751,16 @@ static void hook_api_rootdir_get_fd_cb(void *closure, const struct afb_hookid *h
 static void hook_api_rootdir_open_locale_cb(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *filename, int flags, const char *locale, int result)
 {
        char path[PATH_MAX], proc[100];
+       ssize_t s;
+
        if (!locale)
                locale = "(null)";
        if (result < 0)
                _hook_api_(export, "rootdir_open_locale(%s, %d, %s) -> %d, %m", filename, flags, locale, result);
        else {
                snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
-               readlink(proc, path, sizeof path);
+               s = readlink(proc, path, sizeof path);
+               path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
                _hook_api_(export, "rootdir_open_locale(%s, %d, %s) -> %d = %s", filename, flags, locale, result, path);
        }
 }
index dd6e863..e7ae9fc 100644 (file)
@@ -687,10 +687,12 @@ static void hook_api_rootdir_get_fd(void *closure, const struct afb_hookid *hook
 {
        char path[PATH_MAX], proc[100];
        const char *key, *val;
+       ssize_t s;
 
        if (result >= 0) {
                snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
-               readlink(proc, path, sizeof path);
+               s = readlink(proc, path, sizeof path);
+               path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
                key = "path";
                val = path;
        } else {
@@ -705,10 +707,12 @@ static void hook_api_rootdir_open_locale(void *closure, const struct afb_hookid
 {
        char path[PATH_MAX], proc[100];
        const char *key, *val;
+       ssize_t s;
 
        if (result >= 0) {
                snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
-               readlink(proc, path, sizeof path);
+               s = readlink(proc, path, sizeof path);
+               path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
                key = "path";
                val = path;
        } else {