--- libusb1.py	2015-06-14 23:42:01.000000000 +0200
+++ libusb1-modified.py	2015-06-23 16:14:30.864074896 +0200
@@ -173,6 +173,27 @@ def _strerror(errcode):
     except AttributeError:
         return _str_error_map[errcode]
 
+# buffer protocol
+
+getBuffer = pythonapi.PyObject_GetBuffer
+getBuffer.argtypes = [py_object, c_void_p, c_int]
+bulen = 11*sizeof(c_ssize_t)
+view = create_string_buffer(bulen)
+
+def getBufferInfo(someObject):
+    pointer_to_sO = py_object(someObject)
+    result = getBuffer(pointer_to_sO,view,1) # writeable
+    
+    if result != 0 : return None,None
+    bufadr,objadr,buflen,itemsize,readonly,ndim,bformat,shape,strides,\
+      suboffsets,internal =  unpack("11I",view)
+   
+    result = pythonapi.PyBuffer_Release(view)
+
+    return (bufadr,buflen)
+
+
+
 # Data structures
 
 class _libusb_endpoint_descriptor(Structure):
@@ -914,8 +935,9 @@ class _LibUSB(usb.backend.IBackend):
         return transferred.value
 
     def __read(self, fn, dev_handle, ep, intf, buff, timeout):
-        address, length = buff.buffer_info()
-        length *= buff.itemsize
+        ### changed !!! address, length = buff.buffer_info()
+        address,length = getBufferInfo(buff)
+        ### removed length *= buff.itemsize
         transferred = c_int()
         retval = fn(dev_handle.handle,
                   ep,
