diff options
author | jkh <jkh@FreeBSD.org> | 1995-04-26 11:43:20 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1995-04-26 11:43:20 +0000 |
commit | 4d406202b113fd4ac8d578c24fdfd836572ed762 (patch) | |
tree | 88d454b2c750da908f8e38751428897d3faf00a3 /usr.sbin | |
parent | 9f7c1b77acb518b161fa64c37b40fcae91f1229a (diff) | |
download | FreeBSD-src-4d406202b113fd4ac8d578c24fdfd836572ed762.zip FreeBSD-src-4d406202b113fd4ac8d578c24fdfd836572ed762.tar.gz |
As per Bruce's advice, use sysconf to get the max argument size and
dynamically allocate that much space, also using snprintf() and strncat()
to do proper bounds checking.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/pkg_install/create/perform.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/usr.sbin/pkg_install/create/perform.c b/usr.sbin/pkg_install/create/perform.c index 0efb41ac..309eaac 100644 --- a/usr.sbin/pkg_install/create/perform.c +++ b/usr.sbin/pkg_install/create/perform.c @@ -1,5 +1,5 @@ #ifndef lint -static const char *rcsid = "$Id: perform.c,v 1.21 1995/04/22 14:55:07 jkh Exp $"; +static const char *rcsid = "$Id: perform.c,v 1.22 1995/04/24 21:50:11 jkh Exp $"; #endif /* @@ -179,44 +179,48 @@ static void make_dist(char *home, char *pkg, char *suffix, Package *plist) { char tball[FILENAME_MAX]; - char cmd[ARG_MAX]; - int ret; + char *cmd; + int ret, max; PackingList p; + max = sysconf(_SC_ARG_MAX); + cmd = alloca(max); + if (!cmd) + barf("Couldn't allocate temporary storage for dist name!"); strcpy(cmd, "tar "); if (*pkg == '/') - sprintf(tball, "%s.%s", pkg, suffix); + snprintf(tball, max, "%s.%s", pkg, suffix); else - sprintf(tball, "%s/%s.%s", home, pkg, suffix); + snprintf(tball, max, "%s/%s.%s", home, pkg, suffix); if (index(suffix, 'z')) /* Compress/gzip? */ - strcat(cmd, "-z"); + stnrcat(cmd, "-z", max - strlen(cmd)); if (Dereference) - strcat(cmd, "h"); + strncat(cmd, "h", max - strlen(cmd)); if (Verbose) printf("Creating gzip'd tar ball in '%s'\n", tball); - strcat(cmd, "cf "); - strcat(cmd, tball); + strncat(cmd, "cf ", max - strlen(cmd)); + strncat(cmd, tball, max - strlen(cmd)); if (ExcludeFrom) - sprintf(&cmd[strlen(cmd)], " -X %s", ExcludeFrom); - sprintf(&cmd[strlen(cmd)], " %s %s %s", CONTENTS_FNAME, + snprintf(&cmd[strlen(cmd)], max, " -X %s", ExcludeFrom); + snprintf(&cmd[strlen(cmd)], max, " %s %s %s", CONTENTS_FNAME, COMMENT_FNAME, DESC_FNAME); if (Install) - sprintf(&cmd[strlen(cmd)], " %s", INSTALL_FNAME); + snprintf(&cmd[strlen(cmd)], max, " %s", INSTALL_FNAME); if (DeInstall) - sprintf(&cmd[strlen(cmd)], " %s", DEINSTALL_FNAME); + snprintf(&cmd[strlen(cmd)], max, " %s", DEINSTALL_FNAME); if (Require) - sprintf(&cmd[strlen(cmd)], " %s", REQUIRE_FNAME); + snprintf(&cmd[strlen(cmd)], max, " %s", REQUIRE_FNAME); if (Display) - sprintf(&cmd[strlen(cmd)], " %s", DISPLAY_FNAME); + snprintf(&cmd[strlen(cmd)], max, " %s", DISPLAY_FNAME); if (Mtree) - sprintf(&cmd[strlen(cmd)], " %s", MTREE_FNAME); + snprintf(&cmd[strlen(cmd)], max, " %s", MTREE_FNAME); for (p = plist->head; p; p = p->next) { if (p->type == PLIST_FILE) - sprintf(&cmd[strlen(cmd)], " %s", p->name); + snprintf(&cmd[strlen(cmd)], max, " %s", p->name); else if (p->type == PLIST_CWD) - sprintf(&cmd[strlen(cmd)], " -C %s", p->name); + snprintf(&cmd[strlen(cmd)], max, " -C %s", p->name); else if (p->type == PLIST_SRC) - sprintf(&cmd[strlen(cmd)], " -C %s", p->name); + snprintf(&cmd[strlen(cmd)], max, " -C %s", p->name); else if (p->type == PLIST_IGNORE) p = p->next; } |