drivers: modem: Fix reference to stack in modem_context_sprint_ip_addr
Changes the modem_context_sprint_ip addr to write into a provided buffer. This approach fixes a referencing to a non existing stack variable, without using a lot of stack space. Tested using the by building all used modems and tested on HW using IPv4. Fixes: #38459 Signed-off-by: Sjors Hettinga <s.a.hettinga@gmail.com>
This commit is contained in:
parent
774aef0cf8
commit
7f9b4d807c
4 changed files with 58 additions and 13 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue