diff options
author | Andrey Konovalov <andreyknvl@google.com> | 2019-09-06 19:32:26 +0200 |
---|---|---|
committer | Andrey Konovalov <andreyknvl@gmail.com> | 2019-09-06 20:11:54 +0200 |
commit | a60cb4cd840ce786236a00480e8bb1025e0c5fef (patch) | |
tree | f67314c08647336590ccb15aac3a32c1d7eefff2 | |
parent | 3fe4b3b1aa1d5b8c47933aa1c1e32aa9f638561a (diff) | |
download | syzkaller-a60cb4cd840ce786236a00480e8bb1025e0c5fef.tar.gz |
executor/usb: use UTF16 encoding for default string
Also respond with lang ID when string #0 is requested.
-rw-r--r-- | executor/common_usb.h | 24 | ||||
-rw-r--r-- | pkg/csource/generated.go | 23 |
2 files changed, 36 insertions, 11 deletions
diff --git a/executor/common_usb.h b/executor/common_usb.h index eaffd8108..6e181836e 100644 --- a/executor/common_usb.h +++ b/executor/common_usb.h @@ -188,7 +188,15 @@ struct vusb_connect_descriptors { struct vusb_connect_string_descriptor strs[0]; } __attribute__((packed)); -static const char* default_string = "syzkaller"; +static const char default_string[] = { + 8, USB_DT_STRING, + 's', 0, 'y', 0, 'z', 0 // UTF16-encoded "syz" +}; + +static const char default_lang_id[] = { + 4, USB_DT_STRING, + 0x09, 0x04 // English (United States) +}; static bool lookup_connect_response(struct vusb_connect_descriptors* descs, struct usb_device_index* index, struct usb_ctrlrequest* ctrl, char** response_data, uint32* response_length) @@ -210,14 +218,18 @@ static bool lookup_connect_response(struct vusb_connect_descriptors* descs, stru return true; case USB_DT_STRING: str_idx = (uint8)ctrl->wValue; - if (!descs || str_idx >= descs->strs_len) { - // Use the default string if we ran out. - *response_data = (char*)default_string; - *response_length = strlen(default_string); - } else { + if (descs && str_idx < descs->strs_len) { *response_data = descs->strs[str_idx].str; *response_length = descs->strs[str_idx].len; + return true; + } + if (str_idx == 0) { + *response_data = (char*)&default_lang_id[0]; + *response_length = default_lang_id[0]; + return true; } + *response_data = (char*)&default_string[0]; + *response_length = default_string[0]; return true; case USB_DT_BOS: *response_data = descs->bos; diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 9c70c3fa5..987dc0152 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -1936,7 +1936,15 @@ struct vusb_connect_descriptors { struct vusb_connect_string_descriptor strs[0]; } __attribute__((packed)); -static const char* default_string = "syzkaller"; +static const char default_string[] = { + 8, USB_DT_STRING, + 's', 0, 'y', 0, 'z', 0 +}; + +static const char default_lang_id[] = { + 4, USB_DT_STRING, + 0x09, 0x04 +}; static bool lookup_connect_response(struct vusb_connect_descriptors* descs, struct usb_device_index* index, struct usb_ctrlrequest* ctrl, char** response_data, uint32* response_length) @@ -1958,13 +1966,18 @@ static bool lookup_connect_response(struct vusb_connect_descriptors* descs, stru return true; case USB_DT_STRING: str_idx = (uint8)ctrl->wValue; - if (!descs || str_idx >= descs->strs_len) { - *response_data = (char*)default_string; - *response_length = strlen(default_string); - } else { + if (descs && str_idx < descs->strs_len) { *response_data = descs->strs[str_idx].str; *response_length = descs->strs[str_idx].len; + return true; + } + if (str_idx == 0) { + *response_data = (char*)&default_lang_id[0]; + *response_length = default_lang_id[0]; + return true; } + *response_data = (char*)&default_string[0]; + *response_length = default_string[0]; return true; case USB_DT_BOS: *response_data = descs->bos; |