History

ptr_ring: use kmalloc_array()

As found by syzkaller, malicious users can set whatever tx_queue_len on a tun device and eventually crash the kernel. Lets remove the ALIGN(XXX, SMP_CACHE_BYTES) thing since a small ring buffer is not fast anyway.

Eric Dumazet committed 9 years ago

Commit 81fbfe81 parent 120e9da2 files · +7 −5Browse files

Unified · Split

2 files
  1. include/linux/ptr_ring.h +5 −4
  2. include/linux/skb_array.h +2 −1
include/linux/ptr_ring.h+5−4
@@ -436,9 +436,9 @@ static inline int ptr_ring_consume_batched_bh(struct ptr_ring *r, · 435 unmodified lines
436436 __PTR_RING_PEEK_CALL_v; \
437437 })
438438
439−static inline void **__ptr_ring_init_queue_alloc(int size, gfp_t gfp)
439+static inline void **__ptr_ring_init_queue_alloc(unsigned int size, gfp_t gfp)
440440 {
441− return kzalloc(ALIGN(size * sizeof(void *), SMP_CACHE_BYTES), gfp);
441+ return kcalloc(size, sizeof(void *), gfp);
442442 }
443443
444444 static inline void __ptr_ring_set_size(struct ptr_ring *r, int size)
@@ -582,7 +582,8 @@ static inline int ptr_ring_resize(struct ptr_ring *r, int size, gfp_t gfp, · 137 unmodified lines
582582 * In particular if you consume ring in interrupt or BH context, you must
583583 * disable interrupts/BH when doing so.
584584 */
585−static inline int ptr_ring_resize_multiple(struct ptr_ring **rings, int nrings,
585+static inline int ptr_ring_resize_multiple(struct ptr_ring **rings,
586+ unsigned int nrings,
586587 int size,
587588 gfp_t gfp, void (*destroy)(void *))
588589 {
@@ -590,7 +591,7 @@ static inline int ptr_ring_resize_multiple(struct ptr_ring **rings, int nrings, · 1 unmodified line
590591 void ***queues;
591592 int i;
592593
593− queues = kmalloc(nrings * sizeof *queues, gfp);
594+ queues = kmalloc_array(nrings, sizeof(*queues), gfp);
594595 if (!queues)
595596 goto noqueues;
596597
include/linux/skb_array.h+2−1
@@ -193,7 +193,8 @@ static inline int skb_array_resize(struct skb_array *a, int size, gfp_t gfp) · 192 unmodified lines
193193 }
194194
195195 static inline int skb_array_resize_multiple(struct skb_array **rings,
196− int nrings, int size, gfp_t gfp)
196+ int nrings, unsigned int size,
197+ gfp_t gfp)
197198 {
198199 BUILD_BUG_ON(offsetof(struct skb_array, ring));
199200 return ptr_ring_resize_multiple((struct ptr_ring **)rings,