[dev][usb] fix a few unchecked mallocs and add some comments

A few routines had unchecked mallocs. One was unused, so remove it but
add fallback code for the rest of them.
This commit is contained in:
Travis Geiselbrecht
2021-10-20 22:12:05 -07:00
parent daf1d671b5
commit 699842fad2
3 changed files with 35 additions and 33 deletions

View File

@@ -64,18 +64,17 @@ status_t usb_setup(usb_config *config);
uint8_t usb_get_current_iface_num_highspeed(void);
uint8_t usb_get_current_iface_num_lowspeed(void);
/* apped new interface descriptors to the existing config if desired */
status_t usb_append_interface_highspeed(const uint8_t *int_descr, size_t len);
status_t usb_append_interface_lowspeed(const uint8_t *int_descr, size_t len);
/* Append new interface descriptors to the existing config.*/
/* Returns interface number selected or error. */
int usb_append_interface_highspeed(const uint8_t *int_descr, size_t len);
int usb_append_interface_lowspeed(const uint8_t *int_descr, size_t len);
/* add a new string to the existing config */
status_t usb_add_string(const char *string, uint8_t id);
status_t usb_start(void);
status_t usb_stop(void);
/* callback api the usbc driver uses */
status_t usbc_callback(usb_callback_op_t op, const union usb_callback_args *args);
/* callback api that anyone can register for */
status_t usb_register_callback(usb_callback_t, void *cookie);

View File

@@ -12,6 +12,7 @@
#include <stdio.h>
#include <sys/types.h>
#include <hw/usb.h>
#include <dev/usb.h>
__BEGIN_CDECLS
@@ -58,6 +59,9 @@ status_t usbc_flush_ep(ep_t ep);
status_t usbc_set_active(bool active);
void usbc_set_address(uint8_t address);
/* callback api the usbc driver uses */
status_t usbc_callback(usb_callback_op_t op, const union usb_callback_args *args);
/* called back from within a callback to handle setup responses */
void usbc_ep0_ack(void);
void usbc_ep0_stall(void);

View File

@@ -5,6 +5,8 @@
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT
*/
#include <dev/usb.h>
#include <lk/debug.h>
#include <lk/trace.h>
#include <lk/err.h>
@@ -13,9 +15,16 @@
#include <assert.h>
#include <lk/list.h>
#include <dev/usbc.h>
#include <dev/usb.h>
#include <lk/init.h>
/*
* USB device side support. Handles configuration and main high level host requests.
* USB device controller must pump the stack via usbc_callback() and implement the
* usbc function interface.
*/
/* TODO: make big endian safe */
#define LOCAL_TRACE 0
#define MAX_STRINGS 8
@@ -38,8 +47,11 @@ typedef struct {
static void usb_do_callbacks(usb_callback_op_t op, const union usb_callback_args *args);
static void append_desc_data(usb_descriptor *desc, const void *dat, size_t len) {
static status_t append_desc_data(usb_descriptor *desc, const void *dat, size_t len) {
uint8_t *ptr = malloc(desc->len + len);
if (!ptr) {
return ERR_NO_MEMORY;
}
memcpy(ptr, desc->desc, desc->len);
memcpy(ptr + desc->len, dat, len);
@@ -51,6 +63,8 @@ static void append_desc_data(usb_descriptor *desc, const void *dat, size_t len)
desc->desc = ptr;
desc->len += len;
return NO_ERROR;
}
static uint8_t usb_get_current_iface_num(const usb_descriptor *desc) {
@@ -67,16 +81,18 @@ uint8_t usb_get_current_iface_num_lowspeed(void) {
return usb_get_current_iface_num(&usb.config->lowspeed.config);
}
/* returns the interface number assigned */
/* returns the interface number assigned or error */
static int usb_append_interface(usb_descriptor *desc, const uint8_t *int_descr, size_t len) {
uint8_t *ptr = malloc(len);
int interface_num;
if (!ptr) {
return ERR_NO_MEMORY;
}
// create a temporary copy of the interface
memcpy(ptr, int_descr, len);
// find the last interface used
interface_num = usb_get_current_iface_num(desc); // current interface
int interface_num = usb_get_current_iface_num(desc); // current interface
// patch our interface descriptor with the new id
ptr[2] = interface_num;
@@ -90,6 +106,7 @@ static int usb_append_interface(usb_descriptor *desc, const uint8_t *int_descr,
interface_num++;
((uint8_t *)desc->desc)[4] = interface_num;
DEBUG_ASSERT(interface_num > 0);
return interface_num - 1;
}
@@ -101,26 +118,6 @@ int usb_append_interface_lowspeed(const uint8_t *int_descr, size_t len) {
return usb_append_interface(&usb.config->lowspeed.config, int_descr, len);
}
void usb_set_string_descriptor(usb_descriptor *desc, const char *string) {
int len = strlen(string);
ushort *data;
int datalen = len * 2 + 2;
data = malloc(datalen);
/* write length field */
data[0] = 0x0300 + datalen;
/* copy the string into the uint16_t based usb string */
int i;
for (i = 0; i < len; i++) {
data[i + 1] = string[i];
}
desc->desc = (void *)data;
desc->len = datalen;
}
static void set_usb_id(uint16_t vendor, uint16_t product) {
// patch the current configuration to with the vendor/product id
((uint16_t *)usb.config->lowspeed.device.desc)[4] = vendor;
@@ -135,8 +132,9 @@ status_t usb_add_string(const char *string, uint8_t id) {
size_t len = strlen(string);
uint16_t *strbuf = malloc(len * 2 + 2);
if (!strbuf)
if (!strbuf) {
return ERR_NO_MEMORY;
}
/* build the usb string descriptor */
strbuf[0] = 0x300 | (len * 2 + 2);
@@ -176,8 +174,9 @@ status_t usb_register_callback(usb_callback_t cb, void *cookie) {
DEBUG_ASSERT(cb);
usb_callback_container_t *c = malloc(sizeof(usb_callback_container_t));
if (!c)
if (!c) {
return ERR_NO_MEMORY;
}
c->cb = cb;
c->cookie = cookie;