diff --git a/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch b/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch new file mode 100644 index 0000000..01b4242 --- /dev/null +++ b/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch @@ -0,0 +1,57 @@ +From 050f32a35898c8ac8ac47322f21f0ec4928aa065 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 14 Jun 2013 09:56:20 +0200 +Subject: [PATCH 4/8] usbredirhost: Use libusb_set_auto_detach_kernel_driver + when available + +Signed-off-by: Hans de Goede +--- + usbredirhost/usbredirhost.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/usbredirhost/usbredirhost.c b/usbredirhost/usbredirhost.c +index 09745c2..0335b37 100644 +--- a/usbredirhost/usbredirhost.c ++++ b/usbredirhost/usbredirhost.c +@@ -499,9 +499,13 @@ static int usbredirhost_claim(struct usbredirhost *host, int initial_claim) + memset(host->alt_setting, 0, MAX_INTERFACES); + + host->claimed = 1; ++#if LIBUSBX_API_VERSION >= 0x01000102 ++ libusb_set_auto_detach_kernel_driver(host->handle, 1); ++#endif + for (i = 0; host->config && i < host->config->bNumInterfaces; i++) { + n = host->config->interface[i].altsetting[0].bInterfaceNumber; + ++#if LIBUSBX_API_VERSION < 0x01000102 + r = libusb_detach_kernel_driver(host->handle, n); + if (r < 0 && r != LIBUSB_ERROR_NOT_FOUND + && r != LIBUSB_ERROR_NOT_SUPPORTED) { +@@ -509,6 +513,7 @@ static int usbredirhost_claim(struct usbredirhost *host, int initial_claim) + n, host->config->bConfigurationValue, libusb_error_name(r)); + return libusb_status_or_error_to_redir_status(host, r); + } ++#endif + + r = libusb_claim_interface(host->handle, n); + if (r < 0) { +@@ -534,6 +539,16 @@ static void usbredirhost_release(struct usbredirhost *host, int attach_drivers) + if (!host->claimed) + return; + ++#if LIBUSBX_API_VERSION >= 0x01000102 ++ /* We want to always do the attach ourselves because: ++ 1) For compound interfaces such as usb-audio we must first release all ++ interfaces before we can attach the driver; ++ 2) When releasing interfaces before calling libusb_set_configuration, ++ we don't want the kernel driver to get attached (our attach_drivers ++ parameter is 0 in this case). */ ++ libusb_set_auto_detach_kernel_driver(host->handle, 0); ++#endif ++ + for (i = 0; host->config && i < host->config->bNumInterfaces; i++) { + n = host->config->interface[i].altsetting[0].bInterfaceNumber; + +-- +1.8.3.1 + diff --git a/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch b/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch new file mode 100644 index 0000000..1081ccf --- /dev/null +++ b/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch @@ -0,0 +1,33 @@ +From 931a41c1c92410639a0e76e6fdd07482f06e4578 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 5 Sep 2013 16:25:13 +0200 +Subject: [PATCH 5/5] usbredirparser: Update header-len inside the + usbredirparser_do_read loop + +If we process the hello packet with the 64 bit id capability bit in the same +loop as other packets (because they were send quickly after one each other), +then we end up reading 48 bytes for the header of the next packets processed +in the same loop, while we should read 64 bytes for them, causing the +sender and receiver to get out of sync. + +Signed-off-by: Hans de Goede +--- + usbredirparser/usbredirparser.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/usbredirparser/usbredirparser.c b/usbredirparser/usbredirparser.c +index b60d3f4..b50ddec 100644 +--- a/usbredirparser/usbredirparser.c ++++ b/usbredirparser/usbredirparser.c +@@ -1011,6 +1011,8 @@ int usbredirparser_do_read(struct usbredirparser *parser_pub) + parser->data = NULL; + if (!r) + return -2; ++ /* header len may change if this was an hello packet */ ++ header_len = usbredirparser_get_header_len(parser_pub); + } + } + } +-- +1.8.3.1 + diff --git a/usbredir.spec b/usbredir.spec index 40cf9c4..f0936ff 100644 --- a/usbredir.spec +++ b/usbredir.spec @@ -1,6 +1,6 @@ Name: usbredir Version: 0.6 -Release: 4%{?dist} +Release: 5%{?dist} Summary: USB network redirection protocol libraries Group: System Environment/Libraries License: LGPLv2+ @@ -10,6 +10,8 @@ Source0: http://spice-space.org/download/%{name}/%{name}-%{version}.tar.b Patch1: 0001-usbredirserver-Allow-connections-from-both-ipv6-and-.patch Patch2: 0002-usbredirserver-testclient-Error-check-fcntl-calls.patch Patch3: 0003-usbredirhost-Fix-coverity-sign_extension-warning.patch +Patch4: 0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch +Patch5: 0005-usbredirparser-Update-header-len-inside-the-usbredir.patch BuildRequires: libusb1-devel >= 1.0.9 %description @@ -52,6 +54,8 @@ A simple USB host TCP server, using libusbredirhost. %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build @@ -85,6 +89,10 @@ rm $RPM_BUILD_ROOT%{_libdir}/libusbredir*.la %changelog +* Tue Sep 10 2013 Hans de Goede - 0.6-5 +- Use the new libusb autodetach kernel driver functionality +- Fix a usbredirparser bug which causes tcp/ip redir to not work (rhbz#1005015) + * Sun Aug 04 2013 Fedora Release Engineering - 0.6-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild