> -----Original Message----- > From: Tomas Hozza [mailto:thozza@xxxxxxxxxx] > Sent: Friday, November 09, 2012 7:47 AM > To: olaf@xxxxxxxxx; KY Srinivasan > Cc: gregkh@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; > devel@xxxxxxxxxxxxxxxxxxxxxx; apw@xxxxxxxxxxxxx; jasowang@xxxxxxxxxx; > Tomas Hozza > Subject: [PATCH] Tools: hv: Fix for long file names from readdir > > 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 changed to PATH_MAX, include "limits.h" where > PATH_MAX is defined was added and length checks ware added via snprintf. > > Signed-off-by: Tomas Hozza <thozza@xxxxxxxxxx> Acked-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx> > --- > tools/hv/hv_kvp_daemon.c | 26 +++++++++----------------- > 1 file changed, 9 insertions(+), 17 deletions(-) > > diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c > index 13c2a14..54ecb95 100644 > --- a/tools/hv/hv_kvp_daemon.c > +++ b/tools/hv/hv_kvp_daemon.c > @@ -44,6 +44,7 @@ > #include <fcntl.h> > #include <dirent.h> > #include <net/if.h> > +#include <limits.h> > > /* > * KVP protocol: The user mode component first registers with the > @@ -592,26 +593,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) > @@ -684,28 +681,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]; > 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) > -- > 1.7.11.7 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel