1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 12:42:30 +04:00

[FL-3672] CLI: cat command crash workaround (#3358)

* Cli input len limit, CDC EP type fix

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Nikolay Minaylov
2024-02-09 11:59:24 +03:00
committed by GitHub
parent c0db3d541e
commit b2a7bb0696
2 changed files with 38 additions and 21 deletions

View File

@@ -6,6 +6,8 @@
#define TAG "CliSrv" #define TAG "CliSrv"
#define CLI_INPUT_LEN_LIMIT 256
Cli* cli_alloc() { Cli* cli_alloc() {
Cli* cli = malloc(sizeof(Cli)); Cli* cli = malloc(sizeof(Cli));
@@ -356,7 +358,9 @@ void cli_process_input(Cli* cli) {
cli_handle_backspace(cli); cli_handle_backspace(cli);
} else if(in_chr == CliSymbolAsciiCR) { } else if(in_chr == CliSymbolAsciiCR) {
cli_handle_enter(cli); cli_handle_enter(cli);
} else if(in_chr >= 0x20 && in_chr < 0x7F) { //-V560 } else if(
(in_chr >= 0x20 && in_chr < 0x7F) && //-V560
(furi_string_size(cli->line) < CLI_INPUT_LEN_LIMIT)) {
if(cli->cursor_position == furi_string_size(cli->line)) { if(cli->cursor_position == furi_string_size(cli->line)) {
furi_string_push_back(cli->line, in_chr); furi_string_push_back(cli->line, in_chr);
cli_putc(cli, in_chr); cli_putc(cli, in_chr);

View File

@@ -7,13 +7,13 @@
#include "usb.h" #include "usb.h"
#include "usb_cdc.h" #include "usb_cdc.h"
#define CDC0_RXD_EP 0x01 #define CDC0_RXD_EP 0x02
#define CDC0_TXD_EP 0x82 #define CDC0_TXD_EP 0x82
#define CDC0_NTF_EP 0x83 #define CDC0_NTF_EP 0x81
#define CDC1_RXD_EP 0x04 #define CDC1_RXD_EP 0x04
#define CDC1_TXD_EP 0x85 #define CDC1_TXD_EP 0x84
#define CDC1_NTF_EP 0x86 #define CDC1_NTF_EP 0x83
#define CDC_NTF_SZ 0x08 #define CDC_NTF_SZ 0x08
@@ -438,7 +438,9 @@ static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) {
struct usb_string_descriptor* dev_prod_desc = malloc(len * 2 + 2); struct usb_string_descriptor* dev_prod_desc = malloc(len * 2 + 2);
dev_prod_desc->bLength = len * 2 + 2; dev_prod_desc->bLength = len * 2 + 2;
dev_prod_desc->bDescriptorType = USB_DTYPE_STRING; dev_prod_desc->bDescriptorType = USB_DTYPE_STRING;
for(uint8_t i = 0; i < len; i++) dev_prod_desc->wString[i] = name[i]; for(uint8_t i = 0; i < len; i++) {
dev_prod_desc->wString[i] = name[i];
}
name = (char*)furi_hal_version_get_name_ptr(); name = (char*)furi_hal_version_get_name_ptr();
len = (name == NULL) ? (0) : (strlen(name)); len = (name == NULL) ? (0) : (strlen(name));
@@ -446,7 +448,9 @@ static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) {
dev_serial_desc->bLength = (len + 5) * 2 + 2; dev_serial_desc->bLength = (len + 5) * 2 + 2;
dev_serial_desc->bDescriptorType = USB_DTYPE_STRING; dev_serial_desc->bDescriptorType = USB_DTYPE_STRING;
memcpy(dev_serial_desc->wString, "f\0l\0i\0p\0_\0", 5 * 2); memcpy(dev_serial_desc->wString, "f\0l\0i\0p\0_\0", 5 * 2);
for(uint8_t i = 0; i < len; i++) dev_serial_desc->wString[i + 5] = name[i]; for(uint8_t i = 0; i < len; i++) {
dev_serial_desc->wString[i + 5] = name[i];
}
cdc_if_cur->str_prod_descr = dev_prod_desc; cdc_if_cur->str_prod_descr = dev_prod_desc;
cdc_if_cur->str_serial_descr = dev_serial_desc; cdc_if_cur->str_serial_descr = dev_serial_desc;
@@ -500,18 +504,20 @@ uint8_t furi_hal_cdc_get_ctrl_line_state(uint8_t if_num) {
} }
void furi_hal_cdc_send(uint8_t if_num, uint8_t* buf, uint16_t len) { void furi_hal_cdc_send(uint8_t if_num, uint8_t* buf, uint16_t len) {
if(if_num == 0) if(if_num == 0) {
usbd_ep_write(usb_dev, CDC0_TXD_EP, buf, len); usbd_ep_write(usb_dev, CDC0_TXD_EP, buf, len);
else } else {
usbd_ep_write(usb_dev, CDC1_TXD_EP, buf, len); usbd_ep_write(usb_dev, CDC1_TXD_EP, buf, len);
} }
}
int32_t furi_hal_cdc_receive(uint8_t if_num, uint8_t* buf, uint16_t max_len) { int32_t furi_hal_cdc_receive(uint8_t if_num, uint8_t* buf, uint16_t max_len) {
int32_t len = 0; int32_t len = 0;
if(if_num == 0) if(if_num == 0) {
len = usbd_ep_read(usb_dev, CDC0_RXD_EP, buf, max_len); len = usbd_ep_read(usb_dev, CDC0_RXD_EP, buf, max_len);
else } else {
len = usbd_ep_read(usb_dev, CDC1_RXD_EP, buf, max_len); len = usbd_ep_read(usb_dev, CDC1_RXD_EP, buf, max_len);
}
return ((len < 0) ? 0 : len); return ((len < 0) ? 0 : len);
} }
@@ -540,31 +546,35 @@ static void cdc_rx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
UNUSED(dev); UNUSED(dev);
UNUSED(event); UNUSED(event);
uint8_t if_num = 0; uint8_t if_num = 0;
if(ep == CDC0_RXD_EP) if(ep == CDC0_RXD_EP) {
if_num = 0; if_num = 0;
else } else {
if_num = 1; if_num = 1;
}
if(callbacks[if_num] != NULL) { if(callbacks[if_num] != NULL) {
if(callbacks[if_num]->rx_ep_callback != NULL) if(callbacks[if_num]->rx_ep_callback != NULL) {
callbacks[if_num]->rx_ep_callback(cb_ctx[if_num]); callbacks[if_num]->rx_ep_callback(cb_ctx[if_num]);
} }
} }
}
static void cdc_tx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) { static void cdc_tx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
UNUSED(dev); UNUSED(dev);
UNUSED(event); UNUSED(event);
uint8_t if_num = 0; uint8_t if_num = 0;
if(ep == CDC0_TXD_EP) if(ep == CDC0_TXD_EP) {
if_num = 0; if_num = 0;
else } else {
if_num = 1; if_num = 1;
}
if(callbacks[if_num] != NULL) { if(callbacks[if_num] != NULL) {
if(callbacks[if_num]->tx_ep_callback != NULL) if(callbacks[if_num]->tx_ep_callback != NULL) {
callbacks[if_num]->tx_ep_callback(cb_ctx[if_num]); callbacks[if_num]->tx_ep_callback(cb_ctx[if_num]);
} }
} }
}
static void cdc_txrx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) { static void cdc_txrx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
if(event == usbd_evt_eptx) { if(event == usbd_evt_eptx) {
@@ -642,26 +652,29 @@ static usbd_respond cdc_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal
if(((USB_REQ_RECIPIENT | USB_REQ_TYPE) & req->bmRequestType) == if(((USB_REQ_RECIPIENT | USB_REQ_TYPE) & req->bmRequestType) ==
(USB_REQ_INTERFACE | USB_REQ_CLASS) && (USB_REQ_INTERFACE | USB_REQ_CLASS) &&
(req->wIndex == 0 || req->wIndex == 2)) { (req->wIndex == 0 || req->wIndex == 2)) {
if(req->wIndex == 0) if(req->wIndex == 0) {
if_num = 0; if_num = 0;
else } else {
if_num = 1; if_num = 1;
}
switch(req->bRequest) { switch(req->bRequest) {
case USB_CDC_SET_CONTROL_LINE_STATE: case USB_CDC_SET_CONTROL_LINE_STATE:
if(callbacks[if_num] != NULL) { if(callbacks[if_num] != NULL) {
cdc_ctrl_line_state[if_num] = req->wValue; cdc_ctrl_line_state[if_num] = req->wValue;
if(callbacks[if_num]->ctrl_line_callback != NULL) if(callbacks[if_num]->ctrl_line_callback != NULL) {
callbacks[if_num]->ctrl_line_callback( callbacks[if_num]->ctrl_line_callback(
cb_ctx[if_num], cdc_ctrl_line_state[if_num]); cb_ctx[if_num], cdc_ctrl_line_state[if_num]);
} }
}
return usbd_ack; return usbd_ack;
case USB_CDC_SET_LINE_CODING: case USB_CDC_SET_LINE_CODING:
memcpy(&cdc_config[if_num], req->data, sizeof(cdc_config[0])); memcpy(&cdc_config[if_num], req->data, sizeof(cdc_config[0]));
if(callbacks[if_num] != NULL) { if(callbacks[if_num] != NULL) {
if(callbacks[if_num]->config_callback != NULL) if(callbacks[if_num]->config_callback != NULL) {
callbacks[if_num]->config_callback(cb_ctx[if_num], &cdc_config[if_num]); callbacks[if_num]->config_callback(cb_ctx[if_num], &cdc_config[if_num]);
} }
}
return usbd_ack; return usbd_ack;
case USB_CDC_GET_LINE_CODING: case USB_CDC_GET_LINE_CODING:
dev->status.data_ptr = &cdc_config[if_num]; dev->status.data_ptr = &cdc_config[if_num];