From 12bcbbdbd7eb6b3cb111ab91b316b14ac210ceb2 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 8 Mar 2012 10:54:13 -0500 Subject: [PATCH] Fix: power of 2 size check should apply to size_t type, not uint32_t Fix this by using the much simpler x & (x - 1) check (rather than hweight(x) == 1). Signed-off-by: Mathieu Desnoyers --- libringbuffer/backend_internal.h | 16 ---------------- libringbuffer/ring_buffer_backend.c | 7 ++++--- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/libringbuffer/backend_internal.h b/libringbuffer/backend_internal.h index 36d53dfd..c4fb7604 100644 --- a/libringbuffer/backend_internal.h +++ b/libringbuffer/backend_internal.h @@ -475,20 +475,4 @@ static inline int get_count_order(unsigned int count) return order; } -static inline -unsigned int hweight32(unsigned int value) -{ - unsigned int r; - - r = value; - r = r - ((r >> 1) & 0x55555555); - r = (r & 0x33333333) + ((r >> 2) & 0x33333333); - r += r >> 4; - r &= 0x0F0F0F0F; - r += r >> 8; - r += r >> 16; - r &= 0x000000FF; - return r; -} - #endif /* _LINUX_RING_BUFFER_BACKEND_INTERNAL_H */ diff --git a/libringbuffer/ring_buffer_backend.c b/libringbuffer/ring_buffer_backend.c index 769e24bf..e949a5e2 100644 --- a/libringbuffer/ring_buffer_backend.c +++ b/libringbuffer/ring_buffer_backend.c @@ -218,11 +218,12 @@ int channel_backend_init(struct channel_backend *chanb, return -EINVAL; /* - * Make sure the number of subbuffers and subbuffer size are power of 2. + * Make sure the number of subbuffers and subbuffer size are + * power of 2, and nonzero. */ - if (hweight32(subbuf_size) != 1) + if (!subbuf_size || (subbuf_size & (subbuf_size - 1))) return -EINVAL; - if (hweight32(num_subbuf) != 1) + if (!num_subbuf || (num_subbuf & (num_subbuf - 1))) return -EINVAL; ret = subbuffer_id_check_index(config, num_subbuf); -- 2.34.1