| From d92bfe14cf2653157fa5007f8b0a9fd628a4753d Mon Sep 17 00:00:00 2001 |
| From: Leon Romanovsky <leonro@mellanox.com> |
| Date: Sun, 17 Mar 2019 12:11:14 +0200 |
| Subject: overflow: Fix -Wtype-limits compilation warnings |
| |
| [ Upstream commit dc7fe518b0493faa0af0568d6d8c2a33c00f58d0 ] |
| |
| Attempt to use check_shl_overflow() with inputs of unsigned type |
| produces the following compilation warnings. |
| |
| drivers/infiniband/hw/mlx5/qp.c: In function _set_user_rq_size_: |
| ./include/linux/overflow.h:230:6: warning: comparison of unsigned |
| expression >= 0 is always true [-Wtype-limits] |
| _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ |
| ^~ |
| drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ |
| if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, |
| &rwq->buf_size)) |
| ^~~~~~~~~~~~~~~~~~ |
| ./include/linux/overflow.h:232:26: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] |
| (_to_shift != _s || *_d < 0 || _a < 0 || \ |
| ^ |
| drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ |
| if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, &rwq->buf_size)) |
| ^~~~~~~~~~~~~~~~~~ |
| ./include/linux/overflow.h:232:36: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] |
| (_to_shift != _s || *_d < 0 || _a < 0 || \ |
| ^ |
| drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ |
| if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift,&rwq->buf_size)) |
| ^~~~~~~~~~~~~~~~~~ |
| |
| Fixes: 0c66847793d1 ("overflow.h: Add arithmetic shift helper") |
| Reviewed-by: Bart Van Assche <bvanassche@acm.org> |
| Acked-by: Kees Cook <keescook@chromium.org> |
| Signed-off-by: Leon Romanovsky <leonro@mellanox.com> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/overflow.h | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/include/linux/overflow.h b/include/linux/overflow.h |
| index 40b48e2133cb8..15eb85de92269 100644 |
| --- a/include/linux/overflow.h |
| +++ b/include/linux/overflow.h |
| @@ -36,6 +36,12 @@ |
| #define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) |
| #define type_min(T) ((T)((T)-type_max(T)-(T)1)) |
| |
| +/* |
| + * Avoids triggering -Wtype-limits compilation warning, |
| + * while using unsigned data types to check a < 0. |
| + */ |
| +#define is_non_negative(a) ((a) > 0 || (a) == 0) |
| +#define is_negative(a) (!(is_non_negative(a))) |
| |
| #ifdef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW |
| /* |
| @@ -227,10 +233,10 @@ |
| typeof(d) _d = d; \ |
| u64 _a_full = _a; \ |
| unsigned int _to_shift = \ |
| - _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ |
| + is_non_negative(_s) && _s < 8 * sizeof(*d) ? _s : 0; \ |
| *_d = (_a_full << _to_shift); \ |
| - (_to_shift != _s || *_d < 0 || _a < 0 || \ |
| - (*_d >> _to_shift) != _a); \ |
| + (_to_shift != _s || is_negative(*_d) || is_negative(_a) || \ |
| + (*_d >> _to_shift) != _a); \ |
| }) |
| |
| /** |
| -- |
| 2.20.1 |
| |