diff --git a/drivers/modem/modem_context.c b/drivers/modem/modem_context.c index 676362fc835..aeb1c6fe72c 100644 --- a/drivers/modem/modem_context.c +++ b/drivers/modem/modem_context.c @@ -20,23 +20,40 @@ LOG_MODULE_REGISTER(modem_context, CONFIG_MODEM_LOG_LEVEL); static struct modem_context *contexts[CONFIG_MODEM_CONTEXT_MAX_NUM]; -char *modem_context_sprint_ip_addr(const struct sockaddr *addr) +int modem_context_sprint_ip_addr(const struct sockaddr *addr, char *buf, size_t buf_size) { - static char buf[NET_IPV6_ADDR_LEN]; + static const char unknown_str[] = "unk"; if (addr->sa_family == AF_INET6) { - return net_addr_ntop(AF_INET6, &net_sin6(addr)->sin6_addr, - buf, sizeof(buf)); + if (buf_size < NET_IPV6_ADDR_LEN) { + return -ENOMEM; + } + + if (net_addr_ntop(AF_INET6, &net_sin6(addr)->sin6_addr, + buf, buf_size) == NULL) { + return -ENOMEM; + } + return 0; } if (addr->sa_family == AF_INET) { - return net_addr_ntop(AF_INET, &net_sin(addr)->sin_addr, - buf, sizeof(buf)); + if (buf_size < NET_IPV4_ADDR_LEN) { + return -ENOMEM; + } + if (net_addr_ntop(AF_INET, &net_sin(addr)->sin_addr, + buf, buf_size) == NULL) { + return -ENOMEM; + } + return 0; } LOG_ERR("Unknown IP address family:%d", addr->sa_family); - strcpy(buf, "unk"); - return buf; + + if (buf_size < sizeof(unknown_str)) { + return -ENOMEM; + } + strcpy(buf, unknown_str); + return 0; } int modem_context_get_addr_port(const struct sockaddr *addr, uint16_t *port) diff --git a/drivers/modem/modem_context.h b/drivers/modem/modem_context.h index e91b6525362..c5cefb8c920 100644 --- a/drivers/modem/modem_context.h +++ b/drivers/modem/modem_context.h @@ -91,10 +91,12 @@ struct modem_context { * @brief IP address to string * * @param addr: sockaddr to be converted + * @param buf: Buffer to store IP in string form + * @param buf_size: buffer size * - * @retval Buffer with IP in string form + * @retval 0 if ok, < 0 if error. */ -char *modem_context_sprint_ip_addr(const struct sockaddr *addr); +int modem_context_sprint_ip_addr(const struct sockaddr *addr, char *buf, size_t buf_size); /** * @brief Get port from IP address diff --git a/drivers/modem/quectel-bg9x.c b/drivers/modem/quectel-bg9x.c index 5ae52e18c40..4e6f4af1291 100644 --- a/drivers/modem/quectel-bg9x.c +++ b/drivers/modem/quectel-bg9x.c @@ -705,6 +705,7 @@ static int offload_connect(void *obj, const struct sockaddr *addr, struct modem_cmd cmd[] = { MODEM_CMD("+QIOPEN: ", on_cmd_atcmdinfo_sockopen, 2U, ",") }; char buf[sizeof("AT+QIOPEN=#,##,###,####.####.####.####,######")] = {0}; int ret; + char ip_str[NET_IPV6_ADDR_LEN]; if (sock->id < mdata.socket_config.base_socket_num - 1) { LOG_ERR("Invalid socket_id(%d) from fd:%d", @@ -735,9 +736,18 @@ static int offload_connect(void *obj, const struct sockaddr *addr, k_sem_reset(&mdata.sem_sock_conn); + ret = modem_context_sprint_ip_addr(addr, ip_str, sizeof(ip_str)); + if (ret != 0) { + LOG_ERR("Error formatting IP string %d", ret); + LOG_ERR("Closing the socket!!!"); + socket_close(sock); + errno = -ret; + return -1; + } + /* Formulate the complete string. */ snprintk(buf, sizeof(buf), "AT+QIOPEN=%d,%d,\"%s\",\"%s\",%d,0,0", 1, sock->sock_fd, protocol, - modem_context_sprint_ip_addr(addr), dst_port); + ip_str, dst_port); /* Send out the command. */ ret = modem_cmd_send(&mctx.iface, &mctx.cmd_handler, diff --git a/drivers/modem/ublox-sara-r4.c b/drivers/modem/ublox-sara-r4.c index 60eb398ba6a..6190214d550 100644 --- a/drivers/modem/ublox-sara-r4.c +++ b/drivers/modem/ublox-sara-r4.c @@ -358,10 +358,18 @@ static ssize_t send_socket_data(void *obj, mdata.sock_written = 0; if (sock->ip_proto == IPPROTO_UDP) { + char ip_str[NET_IPV6_ADDR_LEN]; + + ret = modem_context_sprint_ip_addr(dst_addr, ip_str, sizeof(ip_str)); + if (ret != 0) { + LOG_ERR("Error formatting IP string %d", ret); + goto exit; + } + ret = modem_context_get_addr_port(dst_addr, &dst_port); snprintk(send_buf, sizeof(send_buf), "AT+USOST=%d,\"%s\",%u,%zu", sock->id, - modem_context_sprint_ip_addr(dst_addr), + ip_str, dst_port, buf_len); } else { snprintk(send_buf, sizeof(send_buf), "AT+USOWR=%d,%zu", @@ -1538,6 +1546,7 @@ static int offload_connect(void *obj, const struct sockaddr *addr, int ret; char buf[sizeof("AT+USOCO=#,!###.###.###.###!,#####,#\r")]; uint16_t dst_port = 0U; + char ip_str[NET_IPV6_ADDR_LEN]; if (!addr) { errno = EINVAL; @@ -1574,8 +1583,15 @@ static int offload_connect(void *obj, const struct sockaddr *addr, return 0; } + ret = modem_context_sprint_ip_addr(addr, ip_str, sizeof(ip_str)); + if (ret != 0) { + errno = -ret; + LOG_ERR("Error formatting IP string %d", ret); + return -1; + } + snprintk(buf, sizeof(buf), "AT+USOCO=%d,\"%s\",%d", sock->id, - modem_context_sprint_ip_addr(addr), dst_port); + ip_str, dst_port); ret = modem_cmd_send(&mctx.iface, &mctx.cmd_handler, NULL, 0U, buf, &mdata.sem_response, MDM_CMD_CONN_TIMEOUT);