diff options
author | Uros Majstorovic <majstor@majstor.org> | 2024-09-04 21:05:50 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2024-09-04 21:05:50 +0200 |
commit | 84950dbae62a8bf23b47e414951a0f9c042569fa (patch) | |
tree | c6cec365e490689660ca2913cb1d30348f604387 /fw/fe310/eos/net/wifi.c | |
parent | 04674955de2d03ec589c226a9b87902804bad6c4 (diff) |
wifi driver fix
Diffstat (limited to 'fw/fe310/eos/net/wifi.c')
-rw-r--r-- | fw/fe310/eos/net/wifi.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/fw/fe310/eos/net/wifi.c b/fw/fe310/eos/net/wifi.c index 113321b..ebbb9ca 100644 --- a/fw/fe310/eos/net/wifi.c +++ b/fw/fe310/eos/net/wifi.c @@ -44,16 +44,16 @@ eos_evt_handler_t eos_wifi_get_handler(unsigned char mtype) { return NULL; } -int eos_wifi_status_parse(unsigned char *buffer, uint16_t len, uint8_t *status, uint8_t ip_addr[], char *ssid) { +int eos_wifi_status_parse(unsigned char *buffer, uint16_t len, uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size) { if (len < 2) return EOS_ERR_SIZE; if (buffer[0] != EOS_WIFI_MTYPE_STATUS) return EOS_ERR_NET; buffer++; - len -= 1; + len--; *status = buffer[0]; buffer++; - len -= 1; + len--; switch (*status) { case EOS_WIFI_STATUS_GOT_IP: @@ -62,15 +62,17 @@ int eos_wifi_status_parse(unsigned char *buffer, uint16_t len, uint8_t *status, buffer += sizeof(uint32_t); len -= sizeof(uint32_t); case EOS_WIFI_STATUS_CONNECTED: - if ((len == 0) || (len > EOS_WIFI_SIZE_SSID)) return EOS_ERR_SIZE; - buffer[len - 1] = '\0'; - if (ssid) strcpy(ssid, buffer); + if (ssid) { + if ((len == 0) || (len > EOS_WIFI_SIZE_SSID) || (len > ssid_size - 1)) return EOS_ERR_SIZE; + memcpy(ssid, buffer, len); + ssid[len] = '\0'; + } break; } return EOS_OK; } -int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, unsigned char *buffer) { +int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, unsigned char *buffer) { unsigned char type; uint16_t len; int do_release; @@ -93,7 +95,7 @@ int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, unsigned cha rv = EOS_ERR_NET; goto wifi_status_fin; } - rv = eos_wifi_status_parse(buffer, len, status, ip_addr, ssid); + rv = eos_wifi_status_parse(buffer, len, status, ip_addr, ssid, ssid_size); wifi_status_fin: if (do_release) eos_net_free(buffer, 1); @@ -146,8 +148,8 @@ int eos_wifi_connect(char *ssid, char *pwd, unsigned char *buffer, int sync) { ssid_len = strlen(ssid); pwd_len = strlen(pwd); - if (ssid_len > EOS_WIFI_SIZE_SSID - 1) return EOS_ERR_SIZE; - if (pwd_len > EOS_WIFI_SIZE_PWD - 1) return EOS_ERR_SIZE; + if (ssid_len > EOS_WIFI_SIZE_SSID) return EOS_ERR_SIZE; + if (pwd_len > EOS_WIFI_SIZE_PWD) return EOS_ERR_SIZE; if (buffer == NULL) { buffer = eos_net_alloc(); @@ -158,10 +160,19 @@ int eos_wifi_connect(char *ssid, char *pwd, unsigned char *buffer, int sync) { buf = buffer; buf[0] = EOS_WIFI_MTYPE_CONNECT; buf++; - strcpy(buf, ssid); - buf += ssid_len + 1; - strcpy(buf, pwd); - buf += pwd_len + 1; + + *buf = ssid_len; + buf++; + + memcpy(buf, ssid, ssid_len); + buf += ssid_len; + + *buf = pwd_len; + buf++; + + memcpy(buf, pwd, pwd_len); + buf += pwd_len; + return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 3 + ssid_len + pwd_len, async, 1); } |