| Index: chrome/browser/extensions/api/usb/usb_device_resource.cc
|
| diff --git a/chrome/browser/extensions/api/usb/usb_device_resource.cc b/chrome/browser/extensions/api/usb/usb_device_resource.cc
|
| index da8efdf499c5239c2131ab0b2e8ea709b6bd1ec1..5193180f479b7c12729c431aa437aa9a235f9959 100644
|
| --- a/chrome/browser/extensions/api/usb/usb_device_resource.cc
|
| +++ b/chrome/browser/extensions/api/usb/usb_device_resource.cc
|
| @@ -111,17 +111,18 @@ static bool GetTransferSize(const T& input, size_t* output) {
|
| template<class T>
|
| static scoped_refptr<net::IOBuffer> CreateBufferForTransfer(const T& input) {
|
| size_t size = 0;
|
| - if (!GetTransferSize(input, &size)) {
|
| + if (!GetTransferSize(input, &size))
|
| return NULL;
|
| - }
|
|
|
| - scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size);
|
| - if (!input.data.get()) {
|
| + // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This
|
| + // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer
|
| + // cannot represent a zero-length buffer, while an URB can.
|
| + scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max(
|
| + static_cast<size_t>(1), size));
|
| + if (!input.data.get())
|
| return buffer;
|
| - }
|
|
|
| memcpy(buffer->data(), input.data->data(), size);
|
| -
|
| return buffer;
|
| }
|
|
|
|
|