logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/
commit: 4aa2905d9666ac7e4a52357cf9b2f4a84927aeb3
parent d969449bce707083da2f0fecb9406d59428cbd91
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Wed, 25 Jun 2025 02:37:38 +0200

cmd/join: make sure allocs of size 0 doesn't happens

Diffstat:

Mcmd/join.c24+++++++++++++++++-------
Mconfigure4++--
2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/cmd/join.c b/cmd/join.c @@ -35,6 +35,7 @@ #define _BSD_SOURCE // fgetln, strsep +#include "../lib/reallocarray.h" #include "../lib/err.h" #include "../lib/getopt_nolong.h" @@ -300,7 +301,9 @@ slurp(INPUT *F) { cnt = F->setalloc; F->setalloc += 50; - if((F->set = realloc(F->set, F->setalloc * sizeof(LINE))) == NULL) utils_err(1, NULL); + if(F->setalloc <= 0) utils_errx(1, "slurp setalloc overflow"); + if((F->set = reallocarray(F->set, F->setalloc, sizeof(LINE))) == NULL) + utils_err(1, "Failed (re)allocating slurp set"); memset(F->set + cnt, 0, 50 * sizeof(LINE)); /* re-set lastlp in case it moved */ @@ -328,7 +331,9 @@ slurp(INPUT *F) if(lp->linealloc <= len + 1) { lp->linealloc += MAX(100, len + 1 - lp->linealloc); - if((lp->line = realloc(lp->line, lp->linealloc)) == NULL) utils_err(1, NULL); + if(lp->linealloc <= 0) utils_errx(1, "slurp linealloc overflow"); + if((lp->line = realloc(lp->line, lp->linealloc)) == NULL) + utils_err(1, "Failed (re)allocating slurp line"); } memmove(lp->line, bp, len); @@ -347,8 +352,9 @@ slurp(INPUT *F) if(lp->fieldcnt == lp->fieldalloc) { lp->fieldalloc += 50; - if((lp->fields = realloc(lp->fields, lp->fieldalloc * sizeof(char *))) == NULL) - utils_err(1, NULL); + if(lp->fieldalloc < 0) utils_errx(1, "slurp fieldalloc overflow"); + if((lp->fields = reallocarray(lp->fields, lp->fieldalloc, sizeof(char *))) == NULL) + utils_err(1, "Failed (re)allocating slurp fieldalloc"); } lp->fields[lp->fieldcnt++] = fieldp; } @@ -426,8 +432,10 @@ towcs(const char *s) size_t n; if((n = mbsrtowcs(NULL, &s, 0, NULL)) == (size_t)-1) return (NULL); - if((wcs = calloc((n + 1), sizeof(*wcs))) == NULL) return (NULL); - mbsrtowcs(wcs, &s, n + 1, NULL); + n++; + if(n <= 0) return (NULL); + if((wcs = calloc(n, sizeof(*wcs))) == NULL) return (NULL); + mbsrtowcs(wcs, &s, n, NULL); return (wcs); } @@ -569,7 +577,9 @@ fieldarg(char *option) if(olistcnt == olistalloc) { olistalloc += 50; - if((olist = realloc(olist, olistalloc * sizeof(OLIST))) == NULL) utils_err(1, NULL); + if(olistalloc <= 0) utils_errx(1, "fieldarg olistalloc overflow"); + if((olist = reallocarray(olist, olistalloc, sizeof(OLIST))) == NULL) + utils_err(1, "Failed (re)allocating fieldarg"); } olist[olistcnt].filenum = filenum; olist[olistcnt].fieldno = fieldno; diff --git a/configure b/configure @@ -257,8 +257,8 @@ check_conftest configure.d/sendfile_linux.c && cpp_define HAS_SENDFILE check_conftest configure.d/copy_file_range.c && cpp_define HAS_COPY_FILE_RANGE if ! check_conftest configure.d/reallocarray.c; then - echo 'Disabling cmd/tr cmd/cut' - target_filter="${target_filter} -e cmd/tr. -e cmd/cut." + echo 'Disabling cmd/tr cmd/cut cmd/join' + target_filter="${target_filter} -e cmd/tr. -e cmd/cut. -e cmd/join." fi check_conftest configure.d/getopt_long.c && cpp_define HAS_GETOPT_LONG