xbps-checkvers: grow buffer if necessary instead of free/malloc for every file

This commit is contained in:
Duncaen 2019-06-15 16:15:25 +02:00 committed by Duncan Overbruck
parent 323ca2f95a
commit 1037a77000

View File

@ -47,9 +47,12 @@
typedef struct _rcv_t { typedef struct _rcv_t {
const char *prog, *fname; const char *prog, *fname;
char *input, *ptr, *xbps_conf, *rootdir, *distdir; char *xbps_conf, *rootdir, *distdir;
uint8_t have_vars; char *buf;
size_t bufsz;
size_t len; size_t len;
char *ptr;
uint8_t have_vars;
xbps_dictionary_t env; xbps_dictionary_t env;
xbps_dictionary_t pkgd; xbps_dictionary_t pkgd;
xbps_dictionary_t cache; xbps_dictionary_t cache;
@ -105,7 +108,7 @@ rcv_init(rcv_t *rcv, const char *prog)
{ {
rcv->prog = prog; rcv->prog = prog;
rcv->have_vars = 0; rcv->have_vars = 0;
rcv->ptr = rcv->input = NULL; rcv->ptr = rcv->buf = NULL;
rcv->cache = xbps_dictionary_internalize_from_file(rcv->cachefile); rcv->cache = xbps_dictionary_internalize_from_file(rcv->cachefile);
if (!rcv->cache) if (!rcv->cache)
@ -127,9 +130,9 @@ rcv_end(rcv_t *rcv)
{ {
xbps_dictionary_externalize_to_file(rcv->cache, rcv->cachefile); xbps_dictionary_externalize_to_file(rcv->cache, rcv->cachefile);
if (rcv->input != NULL) { if (rcv->buf != NULL) {
free(rcv->input); free(rcv->buf);
rcv->input = NULL; rcv->buf = NULL;
} }
if (rcv->env != NULL) { if (rcv->env != NULL) {
xbps_object_release(rcv->env); xbps_object_release(rcv->env);
@ -171,20 +174,28 @@ rcv_load_file(rcv_t *rcv, const char *fname)
} }
rcv->len = (size_t)offset; rcv->len = (size_t)offset;
if (rcv->input != NULL) if (rcv->buf == NULL) {
free(rcv->input); rcv->bufsz = rcv->len+1;
if (!(rcv->buf = calloc(rcv->bufsz, sizeof(char)))) {
if ((rcv->input = calloc(rcv->len + 1, sizeof(char))) == NULL) { fprintf(stderr, "MemError: can't allocate memory: %s\n",
fprintf(stderr, "MemError: can't allocate memory: %s\n", strerror(errno));
strerror(errno)); fclose(file);
fclose(file); return false;
return false; }
} else if (rcv->bufsz <= rcv->len) {
rcv->bufsz = rcv->len+1;
if (!(rcv->buf = realloc(rcv->buf, rcv->bufsz))) {
fprintf(stderr, "MemError: can't allocate memory: %s\n",
strerror(errno));
fclose(file);
return false;
}
} }
(void)fread(rcv->input, sizeof(char), rcv->len, file); (void)fread(rcv->buf, sizeof(char), rcv->len, file);
rcv->input[rcv->len] = '\0'; rcv->buf[rcv->len] = '\0';
fclose(file); fclose(file);
rcv->ptr = rcv->input; rcv->ptr = rcv->buf;
return true; return true;
} }