]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Potential fix for 0-length usb packets seen on OSX
authorMartin Holst Swende <martin@swende.se>
Thu, 16 Jul 2015 22:01:58 +0000 (00:01 +0200)
committerMartin Holst Swende <martin@swende.se>
Thu, 16 Jul 2015 22:01:58 +0000 (00:01 +0200)
armsrc/lfops.c
common/usb_cdc.c
common/usb_cdc.h

index 188d7280f7deab98d763dc8198a180e0a2ed8c19..733bc953ed04a8dd85129c87f9af6d027f8bfcd4 100644 (file)
@@ -399,14 +399,10 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
  #define OPEN_COIL()           HIGH(GPIO_SSC_DOUT)
 
        i = 0;
  #define OPEN_COIL()           HIGH(GPIO_SSC_DOUT)
 
        i = 0;
-       byte_t rx[sizeof(UsbCommand)]; // Storage for usb_read call in loop
        for(;;) {
                //wait until SSC_CLK goes HIGH
                while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
        for(;;) {
                //wait until SSC_CLK goes HIGH
                while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
-                       // Craig Young - Adding a usb_read() here to avoid abort on empty UsbCommand
-                       // My OS X client does this preventing simulation.
-                       // Performance hit should be non-existent since the read is only performed if usb_poll is true
-                       if(BUTTON_PRESS() || (usb_poll() && usb_read(rx,sizeof(UsbCommand)))) {
+                       if(BUTTON_PRESS() || (usb_poll_validate_length() )) {
                                DbpString("Stopped");
                                return;
                        }
                                DbpString("Stopped");
                                return;
                        }
index ccbb3c50e91389a4d733e25f75c7f94e50e77ef5..3c6e928238d11b285e66375ce1ffff2bb28946e2 100644 (file)
@@ -293,6 +293,22 @@ bool usb_poll()
   return (pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank);\r
 }\r
 \r
   return (pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank);\r
 }\r
 \r
+/**\r
+       In github PR #129, some users appears to get a false positive from\r
+       usb_poll, which returns true, but the usb_read operation\r
+       still returns 0.\r
+       This check is basically the same as above, but also checks\r
+       that the length available to read is non-zero, thus hopefully fixes the\r
+       bug.\r
+**/\r
+bool usb_poll_validate_length()\r
+{\r
+\r
+       if (!usb_check()) return false;\r
+       if (!(pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank)) return false;\r
+       return (pUdp->UDP_CSR[AT91C_EP_OUT] >> 16) >  0;\r
+}\r
+\r
 //*----------------------------------------------------------------------------\r
 //* \fn    usb_read\r
 //* \brief Read available data from Endpoint OUT\r
 //*----------------------------------------------------------------------------\r
 //* \fn    usb_read\r
 //* \brief Read available data from Endpoint OUT\r
index 59e73a478f6f37334c681068ed5b22b7bb258b9d..c42da8db90d1717c7c0188c84c29cb652c753d66 100644 (file)
@@ -41,6 +41,7 @@ void usb_disable();
 void usb_enable();\r
 bool usb_check();\r
 bool usb_poll();\r
 void usb_enable();\r
 bool usb_check();\r
 bool usb_poll();\r
+bool usb_poll_validate_length();\r
 uint32_t usb_read(byte_t* data, size_t len);\r
 uint32_t usb_write(const byte_t* data, const size_t len);\r
 \r
 uint32_t usb_read(byte_t* data, size_t len);\r
 uint32_t usb_write(const byte_t* data, const size_t len);\r
 \r
Impressum, Datenschutz