From a61c465d47d08d7a20810057065056a7a586a56a Mon Sep 17 00:00:00 2001 From: Krzysztof Opasiak Date: Sat, 5 Jul 2014 11:01:17 +0200 Subject: [PATCH] libusbgx: Use reentrant functions to avoid static buffers usage 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 [Port from libusbg and update description] Signed-off-by: Krzysztof Opasiak --- 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 fe38b10..c2c00fe 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; -- 2.7.4