Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-09-19 19:57:29 -0500
committerDan McGee <dan@archlinux.org>2011-09-20 10:23:11 -0500
commit8e3b39a9e0c2fbc268919a57fb1e3cf7aa2aedf4 (patch)
tree4586decbe2c03303c0839ca662fd147627ff5984
parent0f92fc59638e5d053966c8f39afd615a870141cc (diff)
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.c25
-rw-r--r--src/pacman/sync.c8
-rw-r--r--src/pacman/util.c10
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);
}
}
}