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:
@@ -6,6 +6,8 @@
|
||||
|
||||
#define TAG "CliSrv"
|
||||
|
||||
#define CLI_INPUT_LEN_LIMIT 256
|
||||
|
||||
Cli* cli_alloc() {
|
||||
Cli* cli = malloc(sizeof(Cli));
|
||||
|
||||
@@ -356,7 +358,9 @@ void cli_process_input(Cli* cli) {
|
||||
cli_handle_backspace(cli);
|
||||
} else if(in_chr == CliSymbolAsciiCR) {
|
||||
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)) {
|
||||
furi_string_push_back(cli->line, in_chr);
|
||||
cli_putc(cli, in_chr);
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
#include "usb.h"
|
||||
#include "usb_cdc.h"
|
||||
|
||||
#define CDC0_RXD_EP 0x01
|
||||
#define CDC0_RXD_EP 0x02
|
||||
#define CDC0_TXD_EP 0x82
|
||||
#define CDC0_NTF_EP 0x83
|
||||
#define CDC0_NTF_EP 0x81
|
||||
|
||||
#define CDC1_RXD_EP 0x04
|
||||
#define CDC1_TXD_EP 0x85
|
||||
#define CDC1_NTF_EP 0x86
|
||||
#define CDC1_TXD_EP 0x84
|
||||
#define CDC1_NTF_EP 0x83
|
||||
|
||||
#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);
|
||||
dev_prod_desc->bLength = len * 2 + 2;
|
||||
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();
|
||||
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->bDescriptorType = USB_DTYPE_STRING;
|
||||
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_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) {
|
||||
if(if_num == 0)
|
||||
if(if_num == 0) {
|
||||
usbd_ep_write(usb_dev, CDC0_TXD_EP, buf, len);
|
||||
else
|
||||
} else {
|
||||
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 len = 0;
|
||||
if(if_num == 0)
|
||||
if(if_num == 0) {
|
||||
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);
|
||||
}
|
||||
return ((len < 0) ? 0 : len);
|
||||
}
|
||||
|
||||
@@ -540,14 +546,16 @@ static void cdc_rx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
|
||||
UNUSED(dev);
|
||||
UNUSED(event);
|
||||
uint8_t if_num = 0;
|
||||
if(ep == CDC0_RXD_EP)
|
||||
if(ep == CDC0_RXD_EP) {
|
||||
if_num = 0;
|
||||
else
|
||||
} else {
|
||||
if_num = 1;
|
||||
}
|
||||
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -555,14 +563,16 @@ static void cdc_tx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
|
||||
UNUSED(dev);
|
||||
UNUSED(event);
|
||||
uint8_t if_num = 0;
|
||||
if(ep == CDC0_TXD_EP)
|
||||
if(ep == CDC0_TXD_EP) {
|
||||
if_num = 0;
|
||||
else
|
||||
} else {
|
||||
if_num = 1;
|
||||
}
|
||||
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -642,25 +652,28 @@ static usbd_respond cdc_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal
|
||||
if(((USB_REQ_RECIPIENT | USB_REQ_TYPE) & req->bmRequestType) ==
|
||||
(USB_REQ_INTERFACE | USB_REQ_CLASS) &&
|
||||
(req->wIndex == 0 || req->wIndex == 2)) {
|
||||
if(req->wIndex == 0)
|
||||
if(req->wIndex == 0) {
|
||||
if_num = 0;
|
||||
else
|
||||
} else {
|
||||
if_num = 1;
|
||||
}
|
||||
|
||||
switch(req->bRequest) {
|
||||
case USB_CDC_SET_CONTROL_LINE_STATE:
|
||||
if(callbacks[if_num] != NULL) {
|
||||
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(
|
||||
cb_ctx[if_num], cdc_ctrl_line_state[if_num]);
|
||||
}
|
||||
}
|
||||
return usbd_ack;
|
||||
case USB_CDC_SET_LINE_CODING:
|
||||
memcpy(&cdc_config[if_num], req->data, sizeof(cdc_config[0]));
|
||||
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]);
|
||||
}
|
||||
}
|
||||
return usbd_ack;
|
||||
case USB_CDC_GET_LINE_CODING:
|
||||
|
||||
Reference in New Issue
Block a user