From 8827e7bd1b8fb835435e4466db77f61b0a066880 Mon Sep 17 00:00:00 2001
From: Tomasz Kramkowski <tk@the-tk.com>
Date: Thu, 24 Nov 2016 21:06:47 +0000
Subject: params.c: Move params over to eprintf utils

---
 params.c | 58 ++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 34 insertions(+), 24 deletions(-)

diff --git a/params.c b/params.c
index 6e0286c..17bf91d 100644
--- a/params.c
+++ b/params.c
@@ -25,9 +25,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <glob.h>
+#include <limits.h>
 
 #include "halfkay.h"
-#include "log.h"
+/*#include "log.h"*/
+#include "eprintf.h"
 #include "params.h"
 #include "util.h"
 
@@ -55,12 +57,14 @@ static void addparams(struct params *p)
 	}
 
 	if (paramc >= avail - 1) {
-		avail = szmul(avail, 2);
-		paramv = xrealloc(paramv, szmul(avail, sizeof *paramv));
+		avail *= 2;
+		if ((unsigned)avail >= INT_MAX / 2 / sizeof *paramv)
+			eprintf("Too many parameter files (%d)", paramc);
+		paramv = erealloc(paramv, avail * sizeof *paramv);
 	}
 
-	paramv[paramc].chip = xstrdup(p->chip);
-	paramv[paramc].board = p->board != NULL ? xstrdup(p->board) : NULL;
+	paramv[paramc].chip = estrdup(p->chip);
+	paramv[paramc].board = p->board != NULL ? estrdup(p->board) : NULL;
 	paramv[paramc].fp = p->fp;
 	paramc++;
 }
@@ -120,19 +124,19 @@ static struct params *readparams(const char *file)
 
 	f = fopen(file, "r");
 	if (f == NULL) {
-		warning(errno, EMSG_OPEN, file);
+		weprintf("Could not open '%s':", file);
 		NULL;
 	}
 
 	contsz = fread(cont, 1, SZMAX_PFILE, f);
 	if (contsz >= sizeof cont) {
-		warning(0, "Parameter file '%s' is longer than %zu",
-			file, sizeof cont - 1);
+		weprintf("Parameter file '%s' is longer than %zu", file,
+			 sizeof cont - 1);
 		contsz = sizeof cont - 1;
 	}
 	for (size_t i = 0; i < contsz; i++) {
 		if (cont[i] == '\0') {
-			warning(0, "Parameter file '%s' contains null byte", file);
+			weprintf("Parameter file '%s' contains null byte", file);
 			cont[i] = ' ';
 		} else if (isspace(cont[i]) || !isprint(cont[i])) {
 			cont[i] = ' ';
@@ -166,14 +170,14 @@ static struct params *readparams(const char *file)
 
 	board = strtok(NULL, "");
 
-	par = xmalloc(sizeof *par);
-	par->chip = xstrdup(chip);
-	par->board = board != NULL ? xstrdup(board) : NULL;
+	par = emalloc(sizeof *par);
+	par->chip = estrdup(chip);
+	par->board = board != NULL ? estrdup(board) : NULL;
 	par->fp = fp;
 
 fail:
 	if (par == NULL)
-		warning(0, "Parameter file '%s' is malformed", file);
+		weprintf("Parameter file '%s' is malformed", file);
 	fclose(f);
 
 	return par;
@@ -184,12 +188,14 @@ static char **getdirs(void)
 {
 	static const char *globsuffix = "/hktool/*";
 	char **dirs, *xddirs, *tok;
-	size_t len = 0, avail = 1;
+	int len = 0, avail = 1;
 
 	xddirs = getenv("XDG_DATA_DIRS");
 	if (!xddirs || !*xddirs)
 		xddirs = "/usr/local/share:/usr/share";
-	xddirs = xstrdup(xddirs);
+	xddirs = estrdup(xddirs);
+
+	dirs = emalloc(sizeof *dirs);
 
 	for (char *s = xddirs; tok = strtok(s, ":"), tok != NULL; s = NULL) {
 		size_t slen;
@@ -198,20 +204,24 @@ static char **getdirs(void)
 			continue;
 
 		if (len >= avail - 1) {
-			avail = szmul(avail, 2);
-			dirs = xrealloc(dirs, szmul(avail, sizeof *dirs));
+			avail *= 2;
+			if ((unsigned)avail >= INT_MAX / 2 / sizeof *dirs)
+				eprintf("Too many data dirs (%d)", len);
+			dirs = erealloc(dirs, avail * sizeof *dirs);
 		}
 
-		slen = szadd(strlen(tok), strlen(globsuffix));
-		dirs[len] = xstrmalloc(slen);
-		snprintf(dirs[len], slen + 1, "%s%s", tok, globsuffix);
+		if (SIZE_MAX - (strlen(tok) + 1) < strlen(globsuffix))
+			eprintf("Data dir too long (\"%.20s\")", tok);
+		slen = strlen(tok) + strlen(globsuffix) + 1;
+		dirs[len] = emalloc(slen);
+		snprintf(dirs[len], slen, "%s%s", tok, globsuffix);
 		len++;
 	}
 
 	free(xddirs);
 
 	dirs[len++] = NULL;
-	dirs = xrealloc(dirs, szmul(len, sizeof *dirs));
+	dirs = erealloc(dirs, len * sizeof *dirs);
 
 	return dirs;
 }
@@ -242,11 +252,11 @@ static void loadparams(void)
 
 		ret = glob(dirs[i], i != 0 ? GLOB_APPEND : 0, NULL, &globbuf);
 		if (ret == GLOB_NOSPACE)
-			error(0, EMSG_GNOMEM);
+			eprintf("glob ran out of memory");
 		if (ret == GLOB_NOMATCH)
 			continue;
 		if (ret == GLOB_ABORTED) {
-			warning(0, "A call to glob resulted in a read error");
+			weprintf("A call to glob resulted in a read error");
 			continue;
 		}
 	}
@@ -324,7 +334,7 @@ int getparams(struct flashparams *fp, const char *mcufile)
 		}
 	}
 
-	warning(0, "'%s' is not a valid MCU name", mcufile);
+	weprintf("'%s' is not a valid MCU name", mcufile);
 
 	return -1;
 }
-- 
cgit v1.2.3-70-g09d2