From: Tormod Volden <debian.tor...@gmail.com> The way we retrieve these strings we have to make sure the buffer is big enough so we do not truncate the string.
A USB descriptor is limited to 255 bytes since its bLength field is one byte wide. So it can theoretically contain 253 characters if UTF-8 encoding is used. UTF-16 encoding has been mandated since 2005 but we can afford those extra bytes just in case. Rename it to MAX_DESC_STR_LEN since this is about USB descriptor strings and not any generic string length limit. Signed-off-by: Tormod Volden <debian.tor...@gmail.com> --- src/main.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 8baa3be..4a187b0 100644 --- a/src/main.c +++ b/src/main.c @@ -54,6 +54,10 @@ int verbose = 0; /* If we really have to guess (non-compliant devices) */ #define DEFAULT_TRANSFER_SIZE 1024 +/* USB string descriptor should contain max 126 UTF-16 characters + * but 253 would even accomodate any UTF-8 encoding */ +#define MAX_DESC_STR_LEN 253 + /* define a portable function for reading a 16bit little-endian word */ unsigned short get_int16_le(const void *p) { @@ -188,8 +192,6 @@ static int count_matching_dfu_if(struct dfu_if *dif) return dif->count; } -#define MAX_STR_LEN 64 - /* Retrieves alternate interface name string. * Returns string length, or negative on error */ static int get_alt_name(struct dfu_if *dfu_if, unsigned char *name) @@ -213,7 +215,7 @@ static int get_alt_name(struct dfu_if *dfu_if, unsigned char *name) if (dfu_if->dev_handle) ret = libusb_get_string_descriptor_ascii( dfu_if->dev_handle, alt_name_str_idx, - name, MAX_STR_LEN); + name, MAX_DESC_STR_LEN); } libusb_free_config_descriptor(cfg); return ret; @@ -221,7 +223,7 @@ static int get_alt_name(struct dfu_if *dfu_if, unsigned char *name) static int print_dfu_if(struct dfu_if *dfu_if, void *v) { - unsigned char name[MAX_STR_LEN+1] = "UNDEFINED"; + unsigned char name[MAX_DESC_STR_LEN+1] = "UNDEFINED"; get_alt_name(dfu_if, name); @@ -254,7 +256,7 @@ static int list_dfu_interfaces(libusb_context *ctx) static int alt_by_name(struct dfu_if *dfu_if, void *v) { - unsigned char name[MAX_STR_LEN+1]; + unsigned char name[MAX_DESC_STR_LEN+1]; if (get_alt_name(dfu_if, name) < 0) return 0; @@ -527,7 +529,7 @@ int main(int argc, char **argv) libusb_context *ctx; struct dfu_file file; char *alt_name = NULL; /* query alt name if non-NULL */ - unsigned char active_alt_name[MAX_STR_LEN+1]; + unsigned char active_alt_name[MAX_DESC_STR_LEN+1]; char *end; int final_reset = 0; int ret; -- 1.7.5.4 _______________________________________________ devel mailing list devel@lists.openmoko.org https://lists.openmoko.org/mailman/listinfo/devel