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:
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