libusbgx: Use reentrant functions to avoid static buffers usage
authorKrzysztof Opasiak <k.opasiak@samsung.com>
Sat, 5 Jul 2014 09:01:17 +0000 (11:01 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Tue, 22 Dec 2015 19:40:53 +0000 (20:40 +0100)
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@samsung.com>
[Port from libusbg and update description]
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
include/usbg/usbg.h
src/usbg.c

index fe38b10..c2c00fe 100644 (file)
@@ -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
index 251946b..b1b5f44 100644 (file)
@@ -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;