Added return checks for HashTable_Add
authorArmin Novak <armin.novak@thincast.com>
Wed, 8 Jul 2020 08:26:34 +0000 (10:26 +0200)
committerakallabeth <akallabeth@users.noreply.github.com>
Tue, 1 Dec 2020 14:10:23 +0000 (15:10 +0100)
(cherry picked from commit ea8f93441d523e103746dfeceab98420c05e0bac)

channels/urbdrc/client/libusb/libusb_udevice.c

index c863925..a430ec4 100644 (file)
@@ -1172,7 +1172,16 @@ static int libusb_udev_isoch_transfer(IUDEVICE* idev, URBDRC_CHANNEL_CALLBACK* c
 #endif
        libusb_set_iso_packet_lengths(iso_transfer, iso_packet_size);
 
-       HashTable_Add(pdev->request_queue, (void*)(size_t)streamID, iso_transfer);
+       if ((HashTable_Contains(pdev->request_queue, (void*)(size_t)streamID)) ||
+           (HashTable_Add(pdev->request_queue, (void*)(size_t)streamID, iso_transfer) < 0))
+       {
+               WLog_Print(urbdrc->log, WLOG_WARN,
+                          "Failed to queue iso transfer, streamID %08" PRIx32 " already in use!",
+                          streamID);
+               async_transfer_user_data_free(user_data);
+               libusb_free_transfer(iso_transfer);
+               return -1;
+       }
        return libusb_submit_transfer(iso_transfer);
 }
 
@@ -1282,7 +1291,15 @@ static int libusb_udev_bulk_or_interrupt_transfer(IUDEVICE* idev, URBDRC_CHANNEL
 #else
        user_data->streamID = streamID;
 #endif
-       HashTable_Add(pdev->request_queue, (void*)(size_t)streamID, transfer);
+       if ((HashTable_Contains(pdev->request_queue, (void*)(size_t)streamID)) ||
+           (HashTable_Add(pdev->request_queue, (void*)(size_t)streamID, transfer) < 0))
+       {
+               WLog_Print(urbdrc->log, WLOG_WARN,
+                          "Failed to queue transfer, streamID %08" PRIx32 " already in use!", streamID);
+               async_transfer_user_data_free(user_data);
+               libusb_free_transfer(transfer);
+               return -1;
+       }
        return libusb_submit_transfer(transfer);
 }