Skip to content

Commit 9c6e6d7

Browse files
JordanYatesdkalowsk
authored andcommitted
drivers: lora: rylrxxx: fix snprintf usage
The second argument should unconditionally be the size of the output memory area, not computationally derived from the input payload length. The previous length validations would be incorrect when `cmd_len == CONFIG_LORA_RYLRXX_CMD_BUF_SIZE`, as `snprintf` would be told the output buffer was `CONFIG_LORA_RYLRXX_CMD_BUF_SIZE + 1` bytes long. Fixes zephyrproject-rtos#92619 Fixes zephyrproject-rtos#92624 Signed-off-by: Jordan Yates <jordan@embeint.com>
1 parent ec80ab5 commit 9c6e6d7

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

drivers/lora/rylrxxx.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static void on_rx(struct modem_chat *chat, char **argv, uint16_t argc, void *use
172172

173173
if (RYLR_IS_RX_PENDING(driver_data->pending_async_flags)) {
174174
driver_data->async_rx_cb(driver_data->dev, msg.data, msg.length, msg.rssi, msg.snr,
175-
driver_data->async_user_data);
175+
driver_data->async_user_data);
176176
} else {
177177
err = k_msgq_put(&driver_data->rx_msgq, &msg, K_NO_WAIT);
178178
if (err != 0) {
@@ -390,13 +390,15 @@ int rylr_send(const struct device *dev, uint8_t *payload, uint32_t payload_len)
390390
goto exit;
391391
}
392392

393-
if (cmd_len > CONFIG_LORA_RYLRXX_CMD_BUF_SIZE) {
393+
/* snprintf requires an extra byte for the terminating NULL */
394+
if (cmd_len > (CONFIG_LORA_RYLRXX_CMD_BUF_SIZE - 1)) {
394395
LOG_ERR("payload too long");
395396
err = -EINVAL;
396397
goto exit;
397398
}
398399

399-
snprintf(data->cmd_buffer, cmd_len + 1, RYLR_CMD_SEND_FORMAT, payload_len, payload);
400+
snprintf(data->cmd_buffer, sizeof(data->cmd_buffer), RYLR_CMD_SEND_FORMAT, payload_len,
401+
payload);
400402
data->curr_cmd_len = cmd_len;
401403
err = rylr_send_cmd_buffer(dev);
402404
if (err != 0) {
@@ -437,7 +439,8 @@ int rylr_send_async(const struct device *dev, uint8_t *payload, uint32_t payload
437439
}
438440

439441
cmd_len = RYLR_CMD_SEND_LENGTH(payload_len);
440-
if (cmd_len > CONFIG_LORA_RYLRXX_CMD_BUF_SIZE) {
442+
/* snprintf requires an extra byte for the terminating NULL */
443+
if (cmd_len > (CONFIG_LORA_RYLRXX_CMD_BUF_SIZE - 1)) {
441444
LOG_ERR("payload too long");
442445
err = -EINVAL;
443446
goto bail;
@@ -450,8 +453,8 @@ int rylr_send_async(const struct device *dev, uint8_t *payload, uint32_t payload
450453
}
451454

452455
data->async_tx_signal = async;
453-
data->curr_cmd_len =
454-
snprintf(data->cmd_buffer, cmd_len + 1, RYLR_CMD_SEND_FORMAT, payload_len, payload);
456+
data->curr_cmd_len = snprintf(data->cmd_buffer, sizeof(data->cmd_buffer),
457+
RYLR_CMD_SEND_FORMAT, payload_len, payload);
455458
rylr_reset_dynamic_script(data);
456459
data->dynamic_chat.request = data->cmd_buffer;
457460
data->dynamic_chat.request_size = data->curr_cmd_len;

0 commit comments

Comments
 (0)