From: Mathieu Desnoyers Date: Thu, 8 Mar 2012 15:54:13 +0000 (-0500) Subject: Fix: power of 2 size check should apply to size_t type, not uint32_t X-Git-Tag: v2.0.0-rc3~9 X-Git-Url: http://git.lttng.org/?p=lttng-ust.git;a=commitdiff_plain;h=12bcbbdbd7eb6b3cb111ab91b316b14ac210ceb2 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 --- 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);