Add dup_binstr() to help common binary string tasks

There are quite a few places in the current implementation where a nul
terminated string is generated from binary data. Add a helper function
to simplify the code a bit.

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2013-04-27 23:44:59 +03:00
parent 8b44ad7e16
commit 5e24dc8a4b
18 changed files with 51 additions and 116 deletions

View file

@ -399,15 +399,13 @@ static void ieee802_1x_learn_identity(struct hostapd_data *hapd,
/* Save station identity for future RADIUS packets */ /* Save station identity for future RADIUS packets */
os_free(sm->identity); os_free(sm->identity);
sm->identity = os_malloc(identity_len + 1); sm->identity = (u8 *) dup_binstr(identity, identity_len);
if (sm->identity == NULL) { if (sm->identity == NULL) {
sm->identity_len = 0; sm->identity_len = 0;
return; return;
} }
os_memcpy(sm->identity, identity, identity_len);
sm->identity_len = identity_len; sm->identity_len = identity_len;
sm->identity[identity_len] = '\0';
hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X, hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
HOSTAPD_LEVEL_DEBUG, "STA identity '%s'", sm->identity); HOSTAPD_LEVEL_DEBUG, "STA identity '%s'", sm->identity);
sm->dot1xAuthEapolRespIdFramesRx++; sm->dot1xAuthEapolRespIdFramesRx++;
@ -1272,13 +1270,10 @@ static void ieee802_1x_update_sta_identity(struct hostapd_data *hapd,
NULL) < 0) NULL) < 0)
return; return;
identity = os_malloc(len + 1); identity = (u8 *) dup_binstr(buf, len);
if (identity == NULL) if (identity == NULL)
return; return;
os_memcpy(identity, buf, len);
identity[len] = '\0';
hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X, hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
HOSTAPD_LEVEL_DEBUG, "old identity '%s' updated with " HOSTAPD_LEVEL_DEBUG, "old identity '%s' updated with "
"User-Name from Access-Accept '%s'", "User-Name from Access-Accept '%s'",

View file

@ -2110,14 +2110,8 @@ static int wpa_driver_ndis_get_names(struct wpa_driver_ndis_data *drv)
dlen = dpos - desc; dlen = dpos - desc;
else else
dlen = os_strlen(desc); dlen = os_strlen(desc);
drv->adapter_desc = os_malloc(dlen + 1); drv->adapter_desc = dup_binstr(desc, dlen);
if (drv->adapter_desc) {
os_memcpy(drv->adapter_desc, desc, dlen);
drv->adapter_desc[dlen] = '\0';
}
os_free(b); os_free(b);
if (drv->adapter_desc == NULL) if (drv->adapter_desc == NULL)
return -1; return -1;
@ -2284,14 +2278,8 @@ static int wpa_driver_ndis_get_names(struct wpa_driver_ndis_data *drv)
} else { } else {
dlen = os_strlen(desc[i]); dlen = os_strlen(desc[i]);
} }
drv->adapter_desc = os_malloc(dlen + 1); drv->adapter_desc = dup_binstr(desc[i], dlen);
if (drv->adapter_desc) {
os_memcpy(drv->adapter_desc, desc[i], dlen);
drv->adapter_desc[dlen] = '\0';
}
os_free(names); os_free(names);
if (drv->adapter_desc == NULL) if (drv->adapter_desc == NULL)
return -1; return -1;

View file

@ -502,11 +502,9 @@ static void wpa_driver_wext_event_wireless(struct wpa_driver_wext_data *drv,
"IWEVCUSTOM length"); "IWEVCUSTOM length");
return; return;
} }
buf = os_malloc(iwe->u.data.length + 1); buf = dup_binstr(custom, iwe->u.data.length);
if (buf == NULL) if (buf == NULL)
return; return;
os_memcpy(buf, custom, iwe->u.data.length);
buf[iwe->u.data.length] = '\0';
wpa_driver_wext_event_wireless_custom(drv->ctx, buf); wpa_driver_wext_event_wireless_custom(drv->ctx, buf);
os_free(buf); os_free(buf);
break; break;

View file

@ -644,10 +644,8 @@ static struct wpabuf * eap_mschapv2_failure(struct eap_sm *sm,
* must allocate a large enough temporary buffer to create that since * must allocate a large enough temporary buffer to create that since
* the received message does not include nul termination. * the received message does not include nul termination.
*/ */
buf = os_malloc(len + 1); buf = dup_binstr(msdata, len);
if (buf) { if (buf) {
os_memcpy(buf, msdata, len);
buf[len] = '\0';
retry = eap_mschapv2_failure_txt(sm, data, buf); retry = eap_mschapv2_failure_txt(sm, data, buf);
os_free(buf); os_free(buf);
} }

View file

@ -741,12 +741,10 @@ enum tncc_process_res tncc_process_if_tnccs(struct tncc_data *tncc,
enum tncc_process_res res = TNCCS_PROCESS_OK_NO_RECOMMENDATION; enum tncc_process_res res = TNCCS_PROCESS_OK_NO_RECOMMENDATION;
int recommendation_msg = 0; int recommendation_msg = 0;
buf = os_malloc(len + 1); buf = dup_binstr(msg, len);
if (buf == NULL) if (buf == NULL)
return TNCCS_PROCESS_ERROR; return TNCCS_PROCESS_ERROR;
os_memcpy(buf, msg, len);
buf[len] = '\0';
start = os_strstr(buf, "<TNCCS-Batch "); start = os_strstr(buf, "<TNCCS-Batch ");
end = os_strstr(buf, "</TNCCS-Batch>"); end = os_strstr(buf, "</TNCCS-Batch>");
if (start == NULL || end == NULL || start > end) { if (start == NULL || end == NULL || start > end) {

View file

@ -1480,7 +1480,6 @@ int eap_sim_db_resynchronize(struct eap_sim_db_data *data,
*/ */
char * sim_get_username(const u8 *identity, size_t identity_len) char * sim_get_username(const u8 *identity, size_t identity_len)
{ {
char *username;
size_t pos; size_t pos;
if (identity == NULL) if (identity == NULL)
@ -1491,11 +1490,5 @@ char * sim_get_username(const u8 *identity, size_t identity_len)
break; break;
} }
username = os_malloc(pos + 1); return dup_binstr(identity, pos);
if (username == NULL)
return NULL;
os_memcpy(username, identity, pos);
username[pos] = '\0';
return username;
} }

View file

@ -851,12 +851,10 @@ enum tncs_process_res tncs_process_if_tnccs(struct tncs_data *tncs,
unsigned char *decoded; unsigned char *decoded;
size_t decoded_len; size_t decoded_len;
buf = os_malloc(len + 1); buf = dup_binstr(msg, len);
if (buf == NULL) if (buf == NULL)
return TNCCS_PROCESS_ERROR; return TNCCS_PROCESS_ERROR;
os_memcpy(buf, msg, len);
buf[len] = '\0';
start = os_strstr(buf, "<TNCCS-Batch "); start = os_strstr(buf, "<TNCCS-Batch ");
end = os_strstr(buf, "</TNCCS-Batch>"); end = os_strstr(buf, "</TNCCS-Batch>");
if (start == NULL || end == NULL || start > end) { if (start == NULL || end == NULL || start > end) {

View file

@ -443,17 +443,16 @@ static int x509_parse_name(const u8 *buf, size_t len, struct x509_name *name,
return -1; return -1;
} }
val = os_malloc(hdr.length + 1); val = dup_binstr(hdr.payload, hdr.length);
if (val == NULL) { if (val == NULL) {
x509_free_name(name); x509_free_name(name);
return -1; return -1;
} }
os_memcpy(val, hdr.payload, hdr.length);
val[hdr.length] = '\0';
if (os_strlen(val) != hdr.length) { if (os_strlen(val) != hdr.length) {
wpa_printf(MSG_INFO, "X509: Reject certificate with " wpa_printf(MSG_INFO, "X509: Reject certificate with "
"embedded NUL byte in a string (%s[NUL])", "embedded NUL byte in a string (%s[NUL])",
val); val);
os_free(val);
x509_free_name(name); x509_free_name(name);
return -1; return -1;
} }

View file

@ -517,11 +517,9 @@ char * wpa_config_parse_string(const char *value, size_t *len)
if (pos == NULL || pos[1] != '\0') if (pos == NULL || pos[1] != '\0')
return NULL; return NULL;
*len = pos - value; *len = pos - value;
str = os_malloc(*len + 1); str = dup_binstr(value, *len);
if (str == NULL) if (str == NULL)
return NULL; return NULL;
os_memcpy(str, value, *len);
str[*len] = '\0';
return str; return str;
} else if (*value == 'P' && value[1] == '"') { } else if (*value == 'P' && value[1] == '"') {
const char *pos; const char *pos;
@ -532,11 +530,9 @@ char * wpa_config_parse_string(const char *value, size_t *len)
if (pos == NULL || pos[1] != '\0') if (pos == NULL || pos[1] != '\0')
return NULL; return NULL;
tlen = pos - value; tlen = pos - value;
tstr = os_malloc(tlen + 1); tstr = dup_binstr(value, tlen);
if (tstr == NULL) if (tstr == NULL)
return NULL; return NULL;
os_memcpy(tstr, value, tlen);
tstr[tlen] = '\0';
str = os_malloc(tlen + 1); str = os_malloc(tlen + 1);
if (str == NULL) { if (str == NULL) {
@ -610,3 +606,19 @@ size_t merge_byte_arrays(u8 *res, size_t res_len,
return len; return len;
} }
char * dup_binstr(const void *src, size_t len)
{
char *res;
if (src == NULL)
return NULL;
res = os_malloc(len + 1);
if (res == NULL)
return NULL;
os_memcpy(res, src, len);
res[len] = '\0';
return res;
}

View file

@ -487,6 +487,7 @@ int is_hex(const u8 *data, size_t len);
size_t merge_byte_arrays(u8 *res, size_t res_len, size_t merge_byte_arrays(u8 *res, size_t res_len,
const u8 *src1, size_t src1_len, const u8 *src1, size_t src1_len,
const u8 *src2, size_t src2_len); const u8 *src2, size_t src2_len);
char * dup_binstr(const void *src, size_t len);
static inline int is_zero_ether_addr(const u8 *a) static inline int is_zero_ether_addr(const u8 *a)
{ {

View file

@ -257,11 +257,9 @@ static int wps_process_manufacturer(struct wps_device_data *dev, const u8 *str,
wpa_hexdump_ascii(MSG_DEBUG, "WPS: Manufacturer", str, str_len); wpa_hexdump_ascii(MSG_DEBUG, "WPS: Manufacturer", str, str_len);
os_free(dev->manufacturer); os_free(dev->manufacturer);
dev->manufacturer = os_malloc(str_len + 1); dev->manufacturer = dup_binstr(str, str_len);
if (dev->manufacturer == NULL) if (dev->manufacturer == NULL)
return -1; return -1;
os_memcpy(dev->manufacturer, str, str_len);
dev->manufacturer[str_len] = '\0';
return 0; return 0;
} }
@ -278,11 +276,9 @@ static int wps_process_model_name(struct wps_device_data *dev, const u8 *str,
wpa_hexdump_ascii(MSG_DEBUG, "WPS: Model Name", str, str_len); wpa_hexdump_ascii(MSG_DEBUG, "WPS: Model Name", str, str_len);
os_free(dev->model_name); os_free(dev->model_name);
dev->model_name = os_malloc(str_len + 1); dev->model_name = dup_binstr(str, str_len);
if (dev->model_name == NULL) if (dev->model_name == NULL)
return -1; return -1;
os_memcpy(dev->model_name, str, str_len);
dev->model_name[str_len] = '\0';
return 0; return 0;
} }
@ -299,11 +295,9 @@ static int wps_process_model_number(struct wps_device_data *dev, const u8 *str,
wpa_hexdump_ascii(MSG_DEBUG, "WPS: Model Number", str, str_len); wpa_hexdump_ascii(MSG_DEBUG, "WPS: Model Number", str, str_len);
os_free(dev->model_number); os_free(dev->model_number);
dev->model_number = os_malloc(str_len + 1); dev->model_number = dup_binstr(str, str_len);
if (dev->model_number == NULL) if (dev->model_number == NULL)
return -1; return -1;
os_memcpy(dev->model_number, str, str_len);
dev->model_number[str_len] = '\0';
return 0; return 0;
} }
@ -320,11 +314,9 @@ static int wps_process_serial_number(struct wps_device_data *dev,
wpa_hexdump_ascii(MSG_DEBUG, "WPS: Serial Number", str, str_len); wpa_hexdump_ascii(MSG_DEBUG, "WPS: Serial Number", str, str_len);
os_free(dev->serial_number); os_free(dev->serial_number);
dev->serial_number = os_malloc(str_len + 1); dev->serial_number = dup_binstr(str, str_len);
if (dev->serial_number == NULL) if (dev->serial_number == NULL)
return -1; return -1;
os_memcpy(dev->serial_number, str, str_len);
dev->serial_number[str_len] = '\0';
return 0; return 0;
} }
@ -341,11 +333,9 @@ static int wps_process_dev_name(struct wps_device_data *dev, const u8 *str,
wpa_hexdump_ascii(MSG_DEBUG, "WPS: Device Name", str, str_len); wpa_hexdump_ascii(MSG_DEBUG, "WPS: Device Name", str, str_len);
os_free(dev->device_name); os_free(dev->device_name);
dev->device_name = os_malloc(str_len + 1); dev->device_name = dup_binstr(str, str_len);
if (dev->device_name == NULL) if (dev->device_name == NULL)
return -1; return -1;
os_memcpy(dev->device_name, str, str_len);
dev->device_name[str_len] = '\0';
return 0; return 0;
} }

View file

@ -796,52 +796,31 @@ static struct wps_er_sta * wps_er_add_sta_data(struct wps_er_ap *ap,
if (attr->manufacturer) { if (attr->manufacturer) {
os_free(sta->manufacturer); os_free(sta->manufacturer);
sta->manufacturer = os_malloc(attr->manufacturer_len + 1); sta->manufacturer = dup_binstr(attr->manufacturer,
if (sta->manufacturer) { attr->manufacturer_len);
os_memcpy(sta->manufacturer, attr->manufacturer,
attr->manufacturer_len);
sta->manufacturer[attr->manufacturer_len] = '\0';
}
} }
if (attr->model_name) { if (attr->model_name) {
os_free(sta->model_name); os_free(sta->model_name);
sta->model_name = os_malloc(attr->model_name_len + 1); sta->model_name = dup_binstr(attr->model_name,
if (sta->model_name) { attr->model_name_len);
os_memcpy(sta->model_name, attr->model_name,
attr->model_name_len);
sta->model_name[attr->model_name_len] = '\0';
}
} }
if (attr->model_number) { if (attr->model_number) {
os_free(sta->model_number); os_free(sta->model_number);
sta->model_number = os_malloc(attr->model_number_len + 1); sta->model_number = dup_binstr(attr->model_number,
if (sta->model_number) { attr->model_number_len);
os_memcpy(sta->model_number, attr->model_number,
attr->model_number_len);
sta->model_number[attr->model_number_len] = '\0';
}
} }
if (attr->serial_number) { if (attr->serial_number) {
os_free(sta->serial_number); os_free(sta->serial_number);
sta->serial_number = os_malloc(attr->serial_number_len + 1); sta->serial_number = dup_binstr(attr->serial_number,
if (sta->serial_number) { attr->serial_number_len);
os_memcpy(sta->serial_number, attr->serial_number,
attr->serial_number_len);
sta->serial_number[attr->serial_number_len] = '\0';
}
} }
if (attr->dev_name) { if (attr->dev_name) {
os_free(sta->dev_name); os_free(sta->dev_name);
sta->dev_name = os_malloc(attr->dev_name_len + 1); sta->dev_name = dup_binstr(attr->dev_name, attr->dev_name_len);
if (sta->dev_name) {
os_memcpy(sta->dev_name, attr->dev_name,
attr->dev_name_len);
sta->dev_name[attr->dev_name_len] = '\0';
}
} }
eloop_cancel_timeout(wps_er_sta_timeout, sta, NULL); eloop_cancel_timeout(wps_er_sta_timeout, sta, NULL);

View file

@ -322,11 +322,9 @@ static void subscr_addr_add_url(struct subscription *s, const char *url,
url_len -= 7; url_len -= 7;
/* Make a copy of the string to allow modification during parsing */ /* Make a copy of the string to allow modification during parsing */
scratch_mem = os_malloc(url_len + 1); scratch_mem = dup_binstr(url, url_len);
if (scratch_mem == NULL) if (scratch_mem == NULL)
goto fail; goto fail;
os_memcpy(scratch_mem, url, url_len);
scratch_mem[url_len] = '\0';
wpa_printf(MSG_DEBUG, "WPS UPnP: Adding URL '%s'", scratch_mem); wpa_printf(MSG_DEBUG, "WPS UPnP: Adding URL '%s'", scratch_mem);
host = scratch_mem; host = scratch_mem;
path = os_strchr(host, '/'); path = os_strchr(host, '/');

View file

@ -996,13 +996,11 @@ static void web_connection_parse_subscribe(struct upnp_wps_device_sm *sm,
h++; h++;
len = end - h; len = end - h;
os_free(callback_urls); os_free(callback_urls);
callback_urls = os_malloc(len + 1); callback_urls = dup_binstr(h, len);
if (callback_urls == NULL) { if (callback_urls == NULL) {
ret = HTTP_INTERNAL_SERVER_ERROR; ret = HTTP_INTERNAL_SERVER_ERROR;
goto error; goto error;
} }
os_memcpy(callback_urls, h, len);
callback_urls[len] = 0;
continue; continue;
} }
/* SID is only for renewal */ /* SID is only for renewal */

View file

@ -322,11 +322,9 @@ static int wpa_config_parse_psk(const struct parse_data *data,
return 0; return 0;
ssid->psk_set = 0; ssid->psk_set = 0;
os_free(ssid->passphrase); os_free(ssid->passphrase);
ssid->passphrase = os_malloc(len + 1); ssid->passphrase = dup_binstr(value, len);
if (ssid->passphrase == NULL) if (ssid->passphrase == NULL)
return -1; return -1;
os_memcpy(ssid->passphrase, value, len);
ssid->passphrase[len] = '\0';
return 0; return 0;
#else /* CONFIG_NO_PBKDF2 */ #else /* CONFIG_NO_PBKDF2 */
wpa_printf(MSG_ERROR, "Line %d: ASCII passphrase not " wpa_printf(MSG_ERROR, "Line %d: ASCII passphrase not "

View file

@ -408,11 +408,9 @@ static const u8 * nai_realm_parse_realm(struct nai_realm *r, const u8 *pos,
return NULL; return NULL;
} }
wpa_hexdump_ascii(MSG_DEBUG, "NAI Realm", pos, realm_len); wpa_hexdump_ascii(MSG_DEBUG, "NAI Realm", pos, realm_len);
r->realm = os_malloc(realm_len + 1); r->realm = dup_binstr(pos, realm_len);
if (r->realm == NULL) if (r->realm == NULL)
return NULL; return NULL;
os_memcpy(r->realm, pos, realm_len);
r->realm[realm_len] = '\0';
pos += realm_len; pos += realm_len;
if (pos + 1 > f_end) { if (pos + 1 > f_end) {

View file

@ -173,11 +173,9 @@ static void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
end = os_strchr(txt, ' '); end = os_strchr(txt, ' ');
if (end == NULL) if (end == NULL)
end = txt + os_strlen(txt); end = txt + os_strlen(txt);
buf = os_malloc(end - txt + 1); buf = dup_binstr(txt, end - txt);
if (buf == NULL) if (buf == NULL)
return; return;
os_memcpy(buf, txt, end - txt);
buf[end - txt] = '\0';
cli_txt_list_del(txt_list, buf); cli_txt_list_del(txt_list, buf);
os_free(buf); os_free(buf);
} }
@ -223,11 +221,9 @@ static int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
end = os_strchr(txt, ' '); end = os_strchr(txt, ' ');
if (end == NULL) if (end == NULL)
end = txt + os_strlen(txt); end = txt + os_strlen(txt);
buf = os_malloc(end - txt + 1); buf = dup_binstr(txt, end - txt);
if (buf == NULL) if (buf == NULL)
return -1; return -1;
os_memcpy(buf, txt, end - txt);
buf[end - txt] = '\0';
ret = cli_txt_list_add(txt_list, buf); ret = cli_txt_list_add(txt_list, buf);
os_free(buf); os_free(buf);
return ret; return ret;

View file

@ -573,13 +573,11 @@ wpa_priv_interface_init(const char *dir, const char *params)
iface->fd = -1; iface->fd = -1;
len = pos - params; len = pos - params;
iface->driver_name = os_malloc(len + 1); iface->driver_name = dup_binstr(params, len);
if (iface->driver_name == NULL) { if (iface->driver_name == NULL) {
wpa_priv_interface_deinit(iface); wpa_priv_interface_deinit(iface);
return NULL; return NULL;
} }
os_memcpy(iface->driver_name, params, len);
iface->driver_name[len] = '\0';
for (i = 0; wpa_drivers[i]; i++) { for (i = 0; wpa_drivers[i]; i++) {
if (os_strcmp(iface->driver_name, if (os_strcmp(iface->driver_name,