[PATCH v2 3/3] libusbg: Use reentrant functions to avoid static buffers usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ether_aton() and ether_ntoa() use static buffers which are
overwritten by next call of this function so those functions
should not be used in multithread environment.

Signed-off-by: Krzysztof Opasiak <k.opasiak@xxxxxxxxxxx>
---
 include/usbg/usbg.h |    1 +
 src/usbg.c          |   16 ++++++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h
index a44203a..e123365 100644
--- a/include/usbg/usbg.h
+++ b/include/usbg/usbg.h
@@ -38,6 +38,7 @@
 #define LANG_US_ENG		0x0409
 #define DEFAULT_CONFIG_LABEL "config"
 
+/* This one has to be at least 18 bytes to hold network addres */
 #define USBG_MAX_STR_LENGTH 256
 #define USBG_MAX_PATH_LENGTH PATH_MAX
 #define USBG_MAX_NAME_LENGTH 40
diff --git a/src/usbg.c b/src/usbg.c
index 251946b..b1b5f44 100644
--- a/src/usbg.c
+++ b/src/usbg.c
@@ -744,6 +744,7 @@ static int usbg_parse_function_net_attrs(usbg_function *f,
 		usbg_function_attrs *f_attrs)
 {
 	struct ether_addr *addr;
+	struct ether_addr addr_buf;
 	char str_addr[USBG_MAX_STR_LENGTH];
 	int ret;
 
@@ -751,7 +752,7 @@ static int usbg_parse_function_net_attrs(usbg_function *f,
 	if (ret != USBG_SUCCESS)
 		goto out;
 
-	addr = ether_aton(str_addr);
+	addr = ether_aton_r(str_addr, &addr_buf);
 	if (addr) {
 		f_attrs->net.dev_addr = *addr;
 	} else {
@@ -763,7 +764,7 @@ static int usbg_parse_function_net_attrs(usbg_function *f,
 	if (ret != USBG_SUCCESS)
 		goto out;
 
-	addr = ether_aton(str_addr);
+	addr = ether_aton_r(str_addr, &addr_buf);
 	if (addr) {
 		f_attrs->net.host_addr = *addr;
 	} else {
@@ -2314,6 +2315,7 @@ int usbg_get_function_attrs(usbg_function *f, usbg_function_attrs *f_attrs)
 int usbg_set_function_net_attrs(usbg_function *f, usbg_f_net_attrs *attrs)
 {
 	int ret = USBG_SUCCESS;
+	char addr_buf[USBG_MAX_STR_LENGTH];
 	char *addr;
 
 	/* ifname is read only so we accept only empty string for this param */
@@ -2322,12 +2324,12 @@ int usbg_set_function_net_attrs(usbg_function *f, usbg_f_net_attrs *attrs)
 		goto out;
 	}
 
-	addr = ether_ntoa(&attrs->dev_addr);
+	addr = ether_ntoa_r(&attrs->dev_addr, addr_buf);
 	ret = usbg_write_string(f->path, f->name, "dev_addr", addr);
 	if (ret != USBG_SUCCESS)
 		goto out;
 
-	addr = ether_ntoa(&attrs->host_addr);
+	addr = ether_ntoa_r(&attrs->host_addr, addr_buf);
 	ret = usbg_write_string(f->path, f->name, "host_addr", addr);
 	if (ret != USBG_SUCCESS)
 		goto out;
@@ -2386,7 +2388,8 @@ int usbg_set_net_dev_addr(usbg_function *f, struct ether_addr *dev_addr)
 	int ret = USBG_SUCCESS;
 
 	if (f && dev_addr) {
-		char *str_addr = ether_ntoa(dev_addr);
+		char str_buf[USBG_MAX_STR_LENGTH];
+		char *str_addr = ether_ntoa_r(dev_addr, str_buf);
 		ret = usbg_write_string(f->path, f->name, "dev_addr", str_addr);
 	} else {
 		ret = USBG_ERROR_INVALID_PARAM;
@@ -2400,7 +2403,8 @@ int usbg_set_net_host_addr(usbg_function *f, struct ether_addr *host_addr)
 	int ret = USBG_SUCCESS;
 
 	if (f && host_addr) {
-		char *str_addr = ether_ntoa(host_addr);
+		char str_buf[USBG_MAX_STR_LENGTH];
+		char *str_addr = ether_ntoa_r(host_addr, str_buf);
 		ret = usbg_write_string(f->path, f->name, "host_addr", str_addr);
 	} else {
 		ret = USBG_ERROR_INVALID_PARAM;
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux