aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2019-09-06 19:32:26 +0200
committerAndrey Konovalov <andreyknvl@gmail.com>2019-09-06 20:11:54 +0200
commita60cb4cd840ce786236a00480e8bb1025e0c5fef (patch)
treef67314c08647336590ccb15aac3a32c1d7eefff2
parent3fe4b3b1aa1d5b8c47933aa1c1e32aa9f638561a (diff)
downloadsyzkaller-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.h24
-rw-r--r--pkg/csource/generated.go23
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;