mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-12-01 11:48:23 -05:00
WPS UFD: Use private data structure for oob_device_data
This gets rid of global variable use and may be needed to allow concurrent access in some case if the interface is extended.
This commit is contained in:
parent
390cd3105d
commit
70e070461d
@ -532,10 +532,10 @@ struct wps_context {
|
|||||||
|
|
||||||
struct oob_device_data {
|
struct oob_device_data {
|
||||||
char *device_path;
|
char *device_path;
|
||||||
int (*init_func)(struct wps_context *, int);
|
void * (*init_func)(struct wps_context *, int);
|
||||||
struct wpabuf * (*read_func)(void);
|
struct wpabuf * (*read_func)(void *);
|
||||||
int (*write_func)(struct wpabuf *);
|
int (*write_func)(void *, struct wpabuf *);
|
||||||
int (*deinit_func)(void);
|
void (*deinit_func)(void *);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wps_registrar *
|
struct wps_registrar *
|
||||||
|
@ -473,10 +473,12 @@ int wps_process_oob(struct wps_context *wps, int registrar)
|
|||||||
struct oob_device_data *oob_dev = wps->oob_dev;
|
struct oob_device_data *oob_dev = wps->oob_dev;
|
||||||
struct wpabuf *data;
|
struct wpabuf *data;
|
||||||
int ret, write_f, oob_method = wps->oob_conf.oob_method;
|
int ret, write_f, oob_method = wps->oob_conf.oob_method;
|
||||||
|
void *oob_priv;
|
||||||
|
|
||||||
write_f = oob_method == OOB_METHOD_DEV_PWD_E ? !registrar : registrar;
|
write_f = oob_method == OOB_METHOD_DEV_PWD_E ? !registrar : registrar;
|
||||||
|
|
||||||
if (oob_dev->init_func(wps, registrar) < 0) {
|
oob_priv = oob_dev->init_func(wps, registrar);
|
||||||
|
if (oob_priv == NULL) {
|
||||||
wpa_printf(MSG_ERROR, "WPS: Failed to initialize OOB device");
|
wpa_printf(MSG_ERROR, "WPS: Failed to initialize OOB device");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -488,12 +490,15 @@ int wps_process_oob(struct wps_context *wps, int registrar)
|
|||||||
data = wps_get_oob_dev_pwd(wps);
|
data = wps_get_oob_dev_pwd(wps);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (data == NULL || wps->oob_dev->write_func(data) < 0)
|
if (data == NULL ||
|
||||||
|
wps->oob_dev->write_func(oob_priv, data) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
} else {
|
} else {
|
||||||
data = oob_dev->read_func();
|
data = oob_dev->read_func(oob_priv);
|
||||||
if (data == NULL)
|
if (data == NULL) {
|
||||||
|
oob_dev->deinit_func(oob_priv);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (oob_method == OOB_METHOD_CRED)
|
if (oob_method == OOB_METHOD_CRED)
|
||||||
ret = wps_parse_oob_cred(wps, data);
|
ret = wps_parse_oob_cred(wps, data);
|
||||||
@ -503,14 +508,11 @@ int wps_process_oob(struct wps_context *wps, int registrar)
|
|||||||
wpabuf_free(data);
|
wpabuf_free(data);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
wpa_printf(MSG_ERROR, "WPS: Failed to process OOB data");
|
wpa_printf(MSG_ERROR, "WPS: Failed to process OOB data");
|
||||||
|
oob_dev->deinit_func(oob_priv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oob_dev->deinit_func() < 0) {
|
oob_dev->deinit_func(oob_priv);
|
||||||
wpa_printf(MSG_ERROR, "WPS: Failed to deinitialize OOB "
|
|
||||||
"device");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,9 @@
|
|||||||
|
|
||||||
#include "wps/wps.h"
|
#include "wps/wps.h"
|
||||||
|
|
||||||
static int ufd_fd = -1;
|
struct wps_ufd_data {
|
||||||
|
int ufd_fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static int dev_pwd_e_file_filter(const struct dirent *entry)
|
static int dev_pwd_e_file_filter(const struct dirent *entry)
|
||||||
@ -105,28 +107,33 @@ static int ufd_mkdir(const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int init_ufd(struct wps_context *wps, int registrar)
|
static void * init_ufd(struct wps_context *wps, int registrar)
|
||||||
{
|
{
|
||||||
int write_f;
|
int write_f;
|
||||||
char temp[128];
|
char temp[128];
|
||||||
char *path = wps->oob_dev->device_path;
|
char *path = wps->oob_dev->device_path;
|
||||||
char filename[13];
|
char filename[13];
|
||||||
|
struct wps_ufd_data *data;
|
||||||
|
int ufd_fd;
|
||||||
|
|
||||||
|
if (path == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
write_f = wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_E ?
|
write_f = wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_E ?
|
||||||
!registrar : registrar;
|
!registrar : registrar;
|
||||||
|
|
||||||
if (get_file_name(wps, registrar, filename) < 0) {
|
if (get_file_name(wps, registrar, filename) < 0) {
|
||||||
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to get file name");
|
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to get file name");
|
||||||
return -1;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_f) {
|
if (write_f) {
|
||||||
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY", path);
|
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY", path);
|
||||||
if (ufd_mkdir(temp))
|
if (ufd_mkdir(temp))
|
||||||
return -1;
|
return NULL;
|
||||||
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY/WFAWSC", path);
|
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY/WFAWSC", path);
|
||||||
if (ufd_mkdir(temp))
|
if (ufd_mkdir(temp))
|
||||||
return -1;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY/WFAWSC/%s", path,
|
os_snprintf(temp, sizeof(temp), "%s/SMRTNTKY/WFAWSC/%s", path,
|
||||||
@ -139,20 +146,25 @@ static int init_ufd(struct wps_context *wps, int registrar)
|
|||||||
if (ufd_fd < 0) {
|
if (ufd_fd < 0) {
|
||||||
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to open %s: %s",
|
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to open %s: %s",
|
||||||
temp, strerror(errno));
|
temp, strerror(errno));
|
||||||
return -1;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
data = os_zalloc(sizeof(*data));
|
||||||
|
if (data == NULL)
|
||||||
|
return NULL;
|
||||||
|
data->ufd_fd = ufd_fd;
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct wpabuf * read_ufd(void)
|
static struct wpabuf * read_ufd(void *priv)
|
||||||
{
|
{
|
||||||
|
struct wps_ufd_data *data = priv;
|
||||||
struct wpabuf *buf;
|
struct wpabuf *buf;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
size_t file_size;
|
size_t file_size;
|
||||||
|
|
||||||
if (fstat(ufd_fd, &s) < 0) {
|
if (fstat(data->ufd_fd, &s) < 0) {
|
||||||
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to get file size");
|
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to get file size");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -165,7 +177,8 @@ static struct wpabuf * read_ufd(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (read(ufd_fd, wpabuf_mhead(buf), file_size) != (int) file_size) {
|
if (read(data->ufd_fd, wpabuf_mhead(buf), file_size) !=
|
||||||
|
(int) file_size) {
|
||||||
wpabuf_free(buf);
|
wpabuf_free(buf);
|
||||||
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to read");
|
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to read");
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -175,9 +188,11 @@ static struct wpabuf * read_ufd(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int write_ufd(struct wpabuf *buf)
|
static int write_ufd(void *priv, struct wpabuf *buf)
|
||||||
{
|
{
|
||||||
if (write(ufd_fd, wpabuf_mhead(buf), wpabuf_len(buf)) !=
|
struct wps_ufd_data *data = priv;
|
||||||
|
|
||||||
|
if (write(data->ufd_fd, wpabuf_mhead(buf), wpabuf_len(buf)) !=
|
||||||
(int) wpabuf_len(buf)) {
|
(int) wpabuf_len(buf)) {
|
||||||
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to write");
|
wpa_printf(MSG_ERROR, "WPS (UFD): Failed to write");
|
||||||
return -1;
|
return -1;
|
||||||
@ -186,11 +201,11 @@ static int write_ufd(struct wpabuf *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int deinit_ufd(void)
|
static void deinit_ufd(void *priv)
|
||||||
{
|
{
|
||||||
close(ufd_fd);
|
struct wps_ufd_data *data = priv;
|
||||||
ufd_fd = -1;
|
close(data->ufd_fd);
|
||||||
return 0;
|
os_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user