Skip to content

Commit 2af930f

Browse files
committed
Add std::nothrow and null checks to netsocket lib
1 parent 0c6753b commit 2af930f

File tree

5 files changed

+46
-10
lines changed

5 files changed

+46
-10
lines changed

connectivity/netsocket/include/netsocket/NetworkInterface.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,10 @@ class NetworkInterface: public DNS {
387387
* of both leads to undefined behavior.
388388
*
389389
* @param status_cb The callback for status changes.
390+
* @return NSAPI_ERROR_OK on success
391+
* @return NSAPI_ERROR_NO_MEMORY if the function fails to create a new entry.
390392
*/
391-
void add_event_listener(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
393+
nsapi_error_t add_event_listener(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
392394

393395
#if MBED_CONF_PLATFORM_CALLBACK_COMPARABLE
394396
/** Remove event listener from interface.

connectivity/netsocket/source/NetworkInterface.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "platform/Callback.h"
2222
#include "platform/mbed_error.h"
2323
#include <string.h>
24+
#include <new>
2425

2526
// Default network-interface state
2627
void NetworkInterface::set_as_default()
@@ -142,14 +143,18 @@ static void call_all_event_listeners(NetworkInterface *iface, nsapi_event_t even
142143
}
143144
}
144145

145-
void NetworkInterface::add_event_listener(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
146+
nsapi_error_t NetworkInterface::add_event_listener(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
146147
{
147148
iface_eventlist_t *event_list = get_interface_event_list_head();
148-
iface_eventlist_entry_t *entry = new iface_eventlist_entry_t;
149+
iface_eventlist_entry_t *entry = new (std::nothrow) iface_eventlist_entry_t;
150+
if (!entry) {
151+
return NSAPI_ERROR_NO_MEMORY;
152+
}
149153
entry->iface = this;
150154
entry->status_cb = status_cb;
151155
ns_list_add_to_end(event_list, entry);
152156
attach(mbed::callback(&call_all_event_listeners, this));
157+
return NSAPI_ERROR_OK;
153158
}
154159

155160
#if MBED_CONF_PLATFORM_CALLBACK_COMPARABLE

connectivity/netsocket/source/TCPSocket.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
#include "netsocket/TCPSocket.h"
19+
#include <new>
1920
#include "Timer.h"
2021
#include "mbed_assert.h"
2122

@@ -266,7 +267,12 @@ TCPSocket *TCPSocket::accept(nsapi_error_t *error)
266267
ret = _stack->socket_accept(_socket, &socket, &address);
267268

268269
if (0 == ret) {
269-
connection = new TCPSocket(this, socket, address);
270+
connection = new (std::nothrow) TCPSocket(this, socket, address);
271+
if (!connection) {
272+
_stack->socket_close(socket);
273+
ret = NSAPI_ERROR_NO_MEMORY;
274+
break;
275+
}
270276
_socket_stats.stats_update_peer(connection, address);
271277
_socket_stats.stats_update_socket_state(connection, SOCK_CONNECTED);
272278
break;

connectivity/netsocket/source/TLSSocketWrapper.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
#include "netsocket/TLSSocketWrapper.h"
19+
#include <new>
1920
#include "platform/Callback.h"
2021
#include "drivers/Timer.h"
2122
#include "events/mbed_events.h"
@@ -134,7 +135,10 @@ nsapi_error_t TLSSocketWrapper::set_client_cert_key(const void *client_cert, siz
134135
#else
135136

136137
int ret;
137-
mbedtls_x509_crt *crt = new mbedtls_x509_crt;
138+
mbedtls_x509_crt *crt = new (std::nothrow) mbedtls_x509_crt;
139+
if (!crt) {
140+
return NSAPI_ERROR_NO_MEMORY;
141+
}
138142
mbedtls_x509_crt_init(crt);
139143
if ((ret = mbedtls_x509_crt_parse(crt, static_cast<const unsigned char *>(client_cert),
140144
client_cert_len)) != 0) {
@@ -286,7 +290,11 @@ nsapi_error_t TLSSocketWrapper::continue_handshake()
286290
#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(FEA_TRACE_SUPPORT) && !defined(MBEDTLS_X509_REMOVE_INFO)
287291
/* Prints the server certificate and verify it. */
288292
const size_t buf_size = 1024;
289-
char *buf = new char[buf_size];
293+
char *buf = new (std::nothrow) char[buf_size];
294+
if (!buf) {
295+
print_mbedtls_error("new (std::nothrow) char[buf_size] failed in continue_handshake", NSAPI_ERROR_NO_MEMORY);
296+
return NSAPI_ERROR_NO_MEMORY;
297+
}
290298
mbedtls_x509_crt_info(buf, buf_size, "\r ",
291299
mbedtls_ssl_get_peer_cert(&_ssl));
292300
tr_debug("Server certificate:\r\n%s\r\n", buf);
@@ -427,7 +435,11 @@ void TLSSocketWrapper::print_mbedtls_error(MBED_UNUSED const char *name, MBED_UN
427435
{
428436
// Avoid pulling in mbedtls_strerror when trace is not enabled
429437
#if defined FEA_TRACE_SUPPORT && defined MBEDTLS_ERROR_C
430-
char *buf = new char[128];
438+
char *buf = new (std::nothrow) char[128];
439+
if (!buf) {
440+
tr_err("%s() failed: -0x%04x (%d)", name, -err, err);
441+
return;
442+
}
431443
mbedtls_strerror(err, buf, 128);
432444
tr_err("%s() failed: -0x%04x (%d): %s", name, -err, err, buf);
433445
delete[] buf;
@@ -459,7 +471,11 @@ void TLSSocketWrapper::my_debug(void *ctx, int level, const char *file, int line
459471
int TLSSocketWrapper::my_verify(void *data, mbedtls_x509_crt *crt, int depth, uint32_t *flags)
460472
{
461473
const uint32_t buf_size = 1024;
462-
char *buf = new char[buf_size];
474+
char *buf = new (std::nothrow) char[buf_size];
475+
if (!buf) {
476+
return NSAPI_ERROR_NO_MEMORY;
477+
}
478+
463479
(void) data;
464480

465481
tr_debug("\nVerifying certificate at depth %d:\n", depth);
@@ -569,7 +585,10 @@ mbedtls_ssl_config *TLSSocketWrapper::get_ssl_config()
569585
{
570586
if (!_ssl_conf) {
571587
int ret;
572-
_ssl_conf = new mbedtls_ssl_config;
588+
_ssl_conf = new (std::nothrow) mbedtls_ssl_config;
589+
if (!_ssl_conf) {
590+
retrn nullptr;
591+
}
573592
mbedtls_ssl_config_init(_ssl_conf);
574593
_ssl_conf_allocated = true;
575594

connectivity/netsocket/source/nsapi_dns.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,11 @@ static void nsapi_dns_query_async_create(void *ptr)
982982
}
983983

984984
if (!query->socket_cb_data) {
985-
query->socket_cb_data = new SOCKET_CB_DATA;
985+
query->socket_cb_data = new (std::nothrow) SOCKET_CB_DATA;
986+
if (!query->socket_cb_data) {
987+
nsapi_dns_query_async_resp(query, NSAPI_ERROR_NO_MEMORY, NULL);
988+
return;
989+
}
986990
}
987991
query->socket_cb_data->call_in_cb = query->call_in_cb;
988992
query->socket_cb_data->stack = query->stack;

0 commit comments

Comments
 (0)