[PATCH 1/6 v7] libselinux: Add overflow checks
James Carter <[email protected]>
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <[email protected]> |
Using "*= 2" is a common idiom to grow an array or buffer, but it is possible for this multiplication to overflow. Use the __builtin_smul_overflow() function that will do the multiplication while checking for overflow. Acked-by: Stephen Smalley <[email protected]> Signed-off-by: James Carter <[email protected]> --- v7: No changes libselinux/src/matchpathcon.c | 6 +++++- libselinux/src/seusers.c | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libselinux/src/matchpathcon.c b/libselinux/src/matchpathcon.c index 2623e5dc..80de61a0 100644 --- a/libselinux/src/matchpathcon.c +++ b/libselinux/src/matchpathcon.c @@ -117,7 +117,11 @@ static int add_array_elt(char *con) char **tmp; if (con_array_size) { while (con_array_used >= con_array_size) { - con_array_size *= 2; + if (__builtin_smul_overflow(con_array_size, 2, + &con_array_size)) { + free_array_elts(); + return -1; + } tmp = (char **)reallocarray(con_array, con_array_size, sizeof(char *)); if (!tmp) { diff --git a/libselinux/src/seusers.c b/libselinux/src/seusers.c index e4a844df..310b1e7c 100644 --- a/libselinux/src/seusers.c +++ b/libselinux/src/seusers.c @@ -114,9 +114,9 @@ static gid_t get_default_gid(const char *name) break; rc = getpwnam_r(name, &pwstorage, rbuf, rbuflen, &pwent); - if (rc == ERANGE && rbuflen < LONG_MAX / 2) { + if (rc == ERANGE && + !__builtin_smull_overflow(rbuflen, 2, &rbuflen)) { free(rbuf); - rbuflen *= 2; continue; } if (rc == 0 && pwent) -- 2.55.0