Skip to content

Commit 4579a1b

Browse files
kot-begemot-ukrichardweinberger
authored andcommitted
um: Fix initialization of vector queues
UML vector drivers could derefence uninitialized memory when cleaning up after a queue allocation failure. Fixes: 49da7e6 ("High Performance UML Vector Network Driver") Cc: <[email protected]> Reported-by: Dan Capenter <[email protected]> Signed-off-by: Anton Ivanov <[email protected]> Signed-off-by: Richard Weinberger <[email protected]>
1 parent cca76c1 commit 4579a1b

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

arch/um/drivers/vector_kern.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,15 +504,19 @@ static struct vector_queue *create_queue(
504504

505505
result = kmalloc(sizeof(struct vector_queue), GFP_KERNEL);
506506
if (result == NULL)
507-
goto out_fail;
507+
return NULL;
508508
result->max_depth = max_size;
509509
result->dev = vp->dev;
510510
result->mmsg_vector = kmalloc(
511511
(sizeof(struct mmsghdr) * max_size), GFP_KERNEL);
512+
if (result->mmsg_vector == NULL)
513+
goto out_mmsg_fail;
512514
result->skbuff_vector = kmalloc(
513515
(sizeof(void *) * max_size), GFP_KERNEL);
514-
if (result->mmsg_vector == NULL || result->skbuff_vector == NULL)
515-
goto out_fail;
516+
if (result->skbuff_vector == NULL)
517+
goto out_skb_fail;
518+
519+
/* further failures can be handled safely by destroy_queue*/
516520

517521
mmsg_vector = result->mmsg_vector;
518522
for (i = 0; i < max_size; i++) {
@@ -563,6 +567,11 @@ static struct vector_queue *create_queue(
563567
result->head = 0;
564568
result->tail = 0;
565569
return result;
570+
out_skb_fail:
571+
kfree(result->mmsg_vector);
572+
out_mmsg_fail:
573+
kfree(result);
574+
return NULL;
566575
out_fail:
567576
destroy_queue(result);
568577
return NULL;

0 commit comments

Comments
 (0)