Add checks to the endpoint and pipe configure functions and fail if the requested...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 10 Jun 2012 19:53:20 +0000 (19:53 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 10 Jun 2012 19:53:20 +0000 (19:53 +0000)
LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c
LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c

index 056981a..57d9b0d 100644 (file)
                                                                      const uint16_t Size,
                                                                      const uint8_t Banks)
                        {
-                               return Endpoint_ConfigureEndpoint_Prv((Address & ENDPOINT_EPNUM_MASK),
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+                       
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+                       
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
                                                                      ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)),
                                                                      ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Endpoint_BytesToEPSizeMask(Size)));
                        }
index 1ddffb5..b643708 100644 (file)
@@ -66,6 +66,9 @@ bool Pipe_ConfigurePipe(const uint8_t Address,
        uint8_t Number = (Address & PIPE_EPNUM_MASK);
        uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
        
+       if (Number >= PIPE_TOTAL_PIPES)
+         return false;
+
        if (Type == EP_TYPE_CONTROL)
          Token = PIPE_TOKEN_SETUP;
 
index 3bd9c55..1356952 100644 (file)
                                                                      const uint16_t Size,
                                                                      const uint8_t Banks)
                        {
-                               return Endpoint_ConfigureEndpoint_Prv((Address & ENDPOINT_EPNUM_MASK),
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+                       
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
                                                                      (AVR32_USBB_ALLOC_MASK |
                                                                       ((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
                                                                       ((Address & ENDPOINT_DIR_IN) ? AVR32_USBB_UECFG0_EPDIR_MASK : 0) |
index 196eb07..23c004d 100644 (file)
@@ -69,6 +69,9 @@ bool Pipe_ConfigurePipe(const uint8_t Address,
        uint8_t Number = (Address & PIPE_EPNUM_MASK);
        uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
        
+       if (Number >= PIPE_TOTAL_PIPES)
+         return false;
+
        if (Type == EP_TYPE_CONTROL)
          Token = PIPE_TOKEN_SETUP;
 
index 8be20d2..3d2926c 100644 (file)
                        {
                                uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size));
 
+                               if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
                                // TODO - Fix once limitations are lifted
-                               if ((Banks > 1) || (Size > 64))
+                               EPConfigMask &= ~USB_EP_PINGPONG_bm;
+                               if (Size > 64)
                                  return false;
 
                                switch (Type)
index 844ef65..09d4ab6 100644 (file)
@@ -76,7 +76,7 @@ void USB_Init(
        USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
        NVM.CMD  = 0;
 
-       /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for 8-bit AVR-GCC */
+       /* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toochain */
        USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0));
        USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp));