diff options
author | Dan McGee <dan@archlinux.org> | 2011-09-19 19:57:29 -0500 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-09-20 10:23:11 -0500 |
commit | 8e3b39a9e0c2fbc268919a57fb1e3cf7aa2aedf4 (patch) | |
tree | 4586decbe2c03303c0839ca662fd147627ff5984 | |
parent | 0f92fc59638e5d053966c8f39afd615a870141cc (diff) | |
download | pacman-8e3b39a9e0c2fbc268919a57fb1e3cf7aa2aedf4.tar.xz |
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 <dan@archlinux.org>
-rw-r--r-- | src/pacman/pacman.c | 25 | ||||
-rw-r--r-- | src/pacman/sync.c | 8 | ||||
-rw-r--r-- | 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); } } } |