mesh: Fix keyring app keys directory iteration 35/228935/1
authorInga Stotland <inga.stotland@intel.com>
Fri, 7 Feb 2020 06:39:45 +0000 (22:39 -0800)
committerAnupam Roy <anupam.r@samsung.com>
Thu, 26 Mar 2020 10:25:49 +0000 (15:55 +0530)
This fixes how app key files are accessed when finalizing
Key Refresh procedure. Instead of using open(entry->d_name, ...)
to get file descriptor, use openat(dir_fd, entry->d_name, ...)
since entry->d_name contains a relative app key filename, not an
absolute path.

Change-Id: I943a3b180ed8425d3437a659c50461e167353bfd
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
mesh/keyring.c

index d7bb405..3066c94 100644 (file)
@@ -124,12 +124,12 @@ bool keyring_put_app_key(struct mesh_node *node, uint16_t app_idx,
        return result;
 }
 
-static void finalize(const char *fpath, uint16_t net_idx)
+static void finalize(int dir_fd, const char *fname, uint16_t net_idx)
 {
        struct keyring_app_key key;
        int fd;
 
-       fd = open(fpath, O_RDWR);
+       fd = openat(dir_fd, fname, O_RDWR);
 
        if (fd < 0)
                return;
@@ -138,7 +138,7 @@ static void finalize(const char *fpath, uint16_t net_idx)
                                                key.net_idx != net_idx)
                goto done;
 
-       l_debug("Finalize %s", fpath);
+       l_debug("Finalize %s", fname);
        memcpy(key.old_key, key.new_key, 16);
        lseek(fd, 0, SEEK_SET);
 
@@ -154,6 +154,7 @@ bool keyring_finalize_app_keys(struct mesh_node *node, uint16_t net_idx)
        const char *node_path;
        char key_dir[PATH_MAX];
        DIR *dir;
+       int dir_fd;
        struct dirent *entry;
 
        if (!node)
@@ -174,10 +175,12 @@ bool keyring_finalize_app_keys(struct mesh_node *node, uint16_t net_idx)
                return false;
        }
 
+       dir_fd = dirfd(dir);
+
        while ((entry = readdir(dir)) != NULL) {
                /* AppKeys are stored in regular files */
                if (entry->d_type == DT_REG)
-                       finalize(entry->d_name, net_idx);
+                       finalize(dir_fd, entry->d_name, net_idx);
        }
 
        closedir(dir);