From 8e3b39a9e0c2fbc268919a57fb1e3cf7aa2aedf4 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 19 Sep 2011 19:57:29 -0500 Subject: pacman: use dynamic string allocation where it makes sense None of these are hot-code paths, and at least the target reading has little need for an arbitrary length limitation (however crazy it might be to have longer arguments). Signed-off-by: Dan McGee --- src/pacman/pacman.c | 25 +++++++++++++++++++------ src/pacman/sync.c | 8 ++++++-- src/pacman/util.c | 10 ++++++++-- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 3ec5071d..061d593b 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -821,13 +821,13 @@ int main(int argc, char *argv[]) /* we support reading targets from stdin if a cmdline parameter is '-' */ if(!isatty(fileno(stdin)) && alpm_list_find_str(pm_targets, "-")) { - char line[PATH_MAX]; - int i = 0; + size_t current_size = PATH_MAX, i = 0; + char *line = malloc(current_size); /* remove the '-' from the list */ pm_targets = alpm_list_remove_str(pm_targets, "-", NULL); - while(i < PATH_MAX && (line[i] = (char)fgetc(stdin)) != EOF) { + while((line[i] = (char)fgetc(stdin)) != EOF) { if(isspace((unsigned char)line[i])) { /* avoid adding zero length arg when multiple spaces separate args */ if(i > 0) { @@ -837,11 +837,23 @@ int main(int argc, char *argv[]) } } else { i++; + /* we may be at the end of our allocated buffer now */ + if(i >= current_size) { + char *new = realloc(line, current_size * 2); + if(new) { + line = new; + current_size *= 2; + } else { + free(line); + line = NULL; + break; + } + } } } - /* check for buffer overflow */ - if(i >= PATH_MAX) { - pm_printf(ALPM_LOG_ERROR, _("buffer overflow detected in arg parsing\n")); + /* check for memory exhaustion */ + if(!line) { + pm_printf(ALPM_LOG_ERROR, _("memory exhausted in argument parsing\n")); cleanup(EXIT_FAILURE); } @@ -850,6 +862,7 @@ int main(int argc, char *argv[]) line[i] = '\0'; pm_targets = alpm_list_add(pm_targets, strdup(line)); } + free(line); if(!freopen(ctermid(NULL), "r", stdin)) { pm_printf(ALPM_LOG_ERROR, _("failed to reopen stdin for reading: (%s)\n"), strerror(errno)); diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 15eea955..1f2edb24 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -122,7 +122,7 @@ static int sync_cleandb(const char *dbpath, int keep_used) static int sync_cleandb_all(void) { const char *dbpath; - char newdbpath[PATH_MAX]; + char *newdbpath; int ret = 0; dbpath = alpm_option_get_dbpath(config->handle); @@ -135,8 +135,12 @@ static int sync_cleandb_all(void) * only the unused sync dbs in dbpath/sync/ */ ret += sync_cleandb(dbpath, 0); - sprintf(newdbpath, "%s%s", dbpath, "sync/"); + if(asprintf(&newdbpath, "%s%s", dbpath, "sync/") < 0) { + ret += 1; + return ret; + } ret += sync_cleandb(newdbpath, 1); + free(newdbpath); printf(_("Database directory cleaned up\n")); return ret; diff --git a/src/pacman/util.c b/src/pacman/util.c index 9e390b2d..05873c99 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -680,8 +680,9 @@ void signature_display(const char *title, alpm_siglist_t *siglist) } else { size_t i; for(i = 0; i < siglist->count; i++) { - char sigline[PATH_MAX]; + char *sigline; const char *status, *validity, *name; + int ret; alpm_sigresult_t *result = siglist->results + i; /* Don't re-indent the first result */ if(i != 0) { @@ -726,10 +727,15 @@ void signature_display(const char *title, alpm_siglist_t *siglist) break; } name = result->key.uid ? result->key.uid : result->key.fingerprint; - snprintf(sigline, PATH_MAX, _("%s, %s from \"%s\""), + ret = pm_asprintf(&sigline, _("%s, %s from \"%s\""), status, validity, name); + if(ret < 1) { + pm_fprintf(stderr, ALPM_LOG_ERROR, _("failed to allocate string\n")); + continue; + } indentprint(sigline, len); printf("\n"); + free(sigline); } } } -- cgit v1.2.3-24-g4f1b