Tools: hv: Fix for long file names from readdir
PATCH 1/1 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 increased and length checks added via snprintf.
--- tools/hv/hv_kvp_daemon.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-)
tools/hv/hv_kvp_daemon.c +8 -17
@@ -592,26 +592,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[512 ]; 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 +680,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[512 ];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 )
Signature · 1 line
1.7.11.7
Review
Quoted 5 lines · Tomas Hozza
kvp_get_if_nameandkvp_mac_to_if_namecopy strings into statically sized buffers which could be too small to store really long names.(quoted diff) +1
-1- char dev_id[256]; + char dev_id[512];
Shouldnt that be PATH_MAX or similar?
Olaf
Quoted 4 lines
Review
Quoted 2 lines
(quoted diff) +1
-1- char dev_id[256]; + char dev_id[512];Shouldnt that be
PATH_MAXor similar?
dirent->d_name should be PATH_MAX, but it is mostly not guaranteed. And then the dev_id is concatenated with two strings so it can exceed 256 bytes.
After discussion with K. Y. Srinivasan I just doubled the size and added size checks for sanity.
Tomas
Quoted 11 lines
-----Original Message-----
From: Tomas Hozza [mailto:[email protected]]
Sent: Thursday, November 08, 2012 9:53 AM
To: Olaf Hering
Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; KY Srinivasan
Subject: Re: [PATCH] Tools: hv: Fix for long file names from readdir
Quoted 8 lines
Quoted 4 lines
Review
Quoted 2 lines
(quoted diff) +1
-1- char dev_id[256]; + char dev_id[512];Shouldnt that be
PATH_MAXor similar?
dirent->d_nameshould bePATH_MAX, but it is mostly not guaranteed. And then thedev_idis concatenated with two strings so it can exceed 256 bytes.
PATH_MAX (currently 4096 bytes) I think should suffice.
Regards,
K. Y
���{.n�+�������+%�����ݶ��w��{.n�+����{��G�����{ay�ʇڙ�,j��f���h��������z_�(�階�ݢj"���m������G������?����&���~��iO��z��v�^�m����������?�I�
PATCH 1/1 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.
--- tools/hv/hv_kvp_daemon.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-)
tools/hv/hv_kvp_daemon.c +9 -17
@@ -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 )
Signature · 1 line
1.7.11.7
Quoted 11 lines
-----Original Message-----
From: Tomas Hozza [mailto:[email protected]]
Sent: Friday, November 09, 2012 7:47 AM
To: [email protected]; KY Srinivasan
Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Tomas Hozza
Subject: [PATCH] Tools: hv: Fix for long file names from readdir
Quoted 7 lines
kvp_get_if_nameandkvp_mac_to_if_namecopy 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" wherePATH_MAXis defined was added and length checks ware added via snprintf.Signed-off-by Tomas Hozza <[email protected]>
Quoted 83 lines
--- tools/hv/hv_kvp_daemon.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-)tools/hv/hv_kvp_daemon.c +5
-8@@ -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" );tools/hv/hv_kvp_daemon.c +4
-10if (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