diff options
| -rw-r--r-- | drivers/usb/gadget/g_ffs.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 4b0e4a040d6f..d1af253a9105 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c | |||
| @@ -392,6 +392,17 @@ static int __gfs_do_config(struct usb_configuration *c, | |||
| 392 | if (unlikely(ret < 0)) | 392 | if (unlikely(ret < 0)) |
| 393 | return ret; | 393 | return ret; |
| 394 | 394 | ||
| 395 | /* After previous do_configs there may be some invalid | ||
| 396 | * pointers in c->interface array. This happens every time | ||
| 397 | * a user space function with fewer interfaces than a user | ||
| 398 | * space function that was run before the new one is run. The | ||
| 399 | * compasit's set_config() assumes that if there is no more | ||
| 400 | * then MAX_CONFIG_INTERFACES interfaces in a configuration | ||
| 401 | * then there is a NULL pointer after the last interface in | ||
| 402 | * c->interface array. We need to make sure this is true. */ | ||
| 403 | if (c->next_interface_id < ARRAY_SIZE(c->interface)) | ||
| 404 | c->interface[c->next_interface_id] = NULL; | ||
| 405 | |||
| 395 | return 0; | 406 | return 0; |
| 396 | } | 407 | } |
| 397 | 408 | ||
