From a3634ce7eb5fc77e22c0d3722fb30e32b0d7d9fa Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Thu, 2 Jul 2015 17:21:02 +0200 Subject: [PATCH] Tools: hv: Fix for long file names from readdir From: Tomas Hozza kvp_get_if_name and kvp_mac_to_if_name copy strings into statically sized buffers which could be too small to store really long names. Buffer sizes have been increased and length checks added via snprintf. Signed-off-by: Vitaly Kuznetsov --- hv_kvp_daemon.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c index 0d9f48e..ac89056 100644 --- a/hv_kvp_daemon.c +++ b/hv_kvp_daemon.c @@ -42,6 +42,7 @@ #include #include #include +#include #include /* @@ -599,26 +600,22 @@ static char *kvp_get_if_name(char *guid) DIR *dir; struct dirent *entry; FILE *file; - char *p, *q, *x; + char *p, *x; char *if_name = NULL; char buf[256]; char *kvp_net_dir = "/sys/class/net/"; - char dev_id[256]; + char dev_id[PATH_MAX]; dir = opendir(kvp_net_dir); if (dir == NULL) return NULL; - snprintf(dev_id, sizeof(dev_id), "%s", kvp_net_dir); - q = dev_id + strlen(kvp_net_dir); - while ((entry = readdir(dir)) != NULL) { /* * Set the state for the next pass. */ - *q = '\0'; - strcat(dev_id, entry->d_name); - strcat(dev_id, "/device/device_id"); + snprintf(dev_id, sizeof(dev_id), "%s%s/device/device_id", kvp_net_dir, + entry->d_name); file = fopen(dev_id, "r"); if (file == NULL) @@ -691,28 +688,23 @@ static char *kvp_mac_to_if_name(char *mac) DIR *dir; struct dirent *entry; FILE *file; - char *p, *q, *x; + char *p, *x; char *if_name = NULL; char buf[256]; char *kvp_net_dir = "/sys/class/net/"; - char dev_id[256]; + char dev_id[PATH_MAX]; unsigned int i; dir = opendir(kvp_net_dir); if (dir == NULL) return NULL; - snprintf(dev_id, sizeof(dev_id), kvp_net_dir); - q = dev_id + strlen(kvp_net_dir); - while ((entry = readdir(dir)) != NULL) { /* * Set the state for the next pass. */ - *q = '\0'; - - strcat(dev_id, entry->d_name); - strcat(dev_id, "/address"); + snprintf(dev_id, sizeof(dev_id), "%s%s/address", kvp_net_dir, + entry->d_name); file = fopen(dev_id, "r"); if (file == NULL) -- 2.4.3