Fixed invalid endpoint indexes causing memory corruption in device Clear/Set Feature...
[pub/USBasp.git] / LUFA / Drivers / USB / Core / DeviceStandardReq.c
index d21df8d..e296d8d 100644 (file)
@@ -292,6 +292,7 @@ static void USB_Device_GetStatus(void)
        switch (USB_ControlRequest.bmRequestType)
        {
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
        switch (USB_ControlRequest.bmRequestType)
        {
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
+               {
                        #if !defined(NO_DEVICE_SELF_POWER)
                        if (USB_Device_CurrentlySelfPowered)
                          CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
                        #if !defined(NO_DEVICE_SELF_POWER)
                        if (USB_Device_CurrentlySelfPowered)
                          CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
@@ -302,9 +303,16 @@ static void USB_Device_GetStatus(void)
                          CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
                        #endif
                        break;
                          CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
                        #endif
                        break;
+               }
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
+               {
                        #if !defined(CONTROL_ONLY_DEVICE)
                        #if !defined(CONTROL_ONLY_DEVICE)
-                       Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+                       uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+                       if (EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS)
+                               return;
+
+                       Endpoint_SelectEndpoint(EndpointIndex);
 
                        CurrentStatus = Endpoint_IsStalled();
 
 
                        CurrentStatus = Endpoint_IsStalled();
 
@@ -312,6 +320,7 @@ static void USB_Device_GetStatus(void)
                        #endif
 
                        break;
                        #endif
 
                        break;
+               }
                default:
                        return;
        }
                default:
                        return;
        }
@@ -330,20 +339,23 @@ static void USB_Device_ClearSetFeature(void)
        {
                #if !defined(NO_DEVICE_REMOTE_WAKEUP)
                case REQREC_DEVICE:
        {
                #if !defined(NO_DEVICE_REMOTE_WAKEUP)
                case REQREC_DEVICE:
+               {
                        if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
                          USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
                        else
                          return;
 
                        break;
                        if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
                          USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
                        else
                          return;
 
                        break;
+               }
                #endif
                #if !defined(CONTROL_ONLY_DEVICE)
                case REQREC_ENDPOINT:
                #endif
                #if !defined(CONTROL_ONLY_DEVICE)
                case REQREC_ENDPOINT:
+               {
                        if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
                        {
                                uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
 
                        if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
                        {
                                uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
 
-                               if (EndpointIndex == ENDPOINT_CONTROLEP)
+                               if (EndpointIndex == ENDPOINT_CONTROLEP || EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS)
                                  return;
 
                                Endpoint_SelectEndpoint(EndpointIndex);
                                  return;
 
                                Endpoint_SelectEndpoint(EndpointIndex);
@@ -364,6 +376,7 @@ static void USB_Device_ClearSetFeature(void)
                        }
 
                        break;
                        }
 
                        break;
+               }
                #endif
                default:
                        return;
                #endif
                default:
                        return;