Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
svm: check if fifo free list index is valid on alloc
[vpp.git]
/
src
/
svm
/
fifo_segment.c
diff --git
a/src/svm/fifo_segment.c
b/src/svm/fifo_segment.c
index
cfc7954
..
06b7f06
100644
(file)
--- a/
src/svm/fifo_segment.c
+++ b/
src/svm/fifo_segment.c
@@
-615,6
+615,9
@@
fs_try_alloc_fifo (fifo_segment_header_t * fsh, fifo_segment_slice_t * fss,
min_size = clib_max ((fsh->pct_first_alloc * data_bytes) / 100, 4096);
fl_index = fs_freelist_for_size (min_size);
min_size = clib_max ((fsh->pct_first_alloc * data_bytes) / 100, 4096);
fl_index = fs_freelist_for_size (min_size);
+ if (fl_index >= vec_len (fss->free_chunks))
+ return 0;
+
clib_spinlock_lock (&fss->chunk_lock);
if (fss->free_fifos && fss->free_chunks[fl_index])
clib_spinlock_lock (&fss->chunk_lock);
if (fss->free_fifos && fss->free_chunks[fl_index])
@@
-691,6
+694,7
@@
fsh_alloc_chunk (fifo_segment_header_t * fsh, u32 slice_index, u32 chunk_size)
clib_spinlock_lock (&fss->chunk_lock);
clib_spinlock_lock (&fss->chunk_lock);
+ ASSERT (vec_len (fss->free_chunks) > fl_index);
c = fss->free_chunks[fl_index];
if (c)
c = fss->free_chunks[fl_index];
if (c)
@@
-834,6
+838,9
@@
fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, u32 slice_index,
ASSERT (slice_index < fs->n_slices);
ASSERT (slice_index < fs->n_slices);
+ if (PREDICT_FALSE (data_bytes > 1 << fsh->max_log2_chunk_size))
+ return 0;
+
fss = fsh_slice_get (fsh, slice_index);
f = fs_try_alloc_fifo (fsh, fss, data_bytes);
if (!f)
fss = fsh_slice_get (fsh, slice_index);
f = fs_try_alloc_fifo (fsh, fss, data_bytes);
if (!f)