From d378c3149c6c24e7788f04a6d20ba360f3ea407e Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Fri, 19 Jul 2002 00:05:54 +0000 Subject: [PATCH] Applied vodz' patches #49 and #50 (with a small correction in runshell.c) #49: I found one memory overflow and memory leak in "ln" applet. Last patch reduced also 54 bytes. ;) #50: I found bug in loginutils/Makefile.in. New patch have also new function to libbb and aplied this to applets and other cosmetic changes. --- Makefile | 2 +- archival/gunzip.c | 3 +-- archival/libunarchive/get_header_ar.c | 3 +-- archival/libunarchive/unarchive.c | 4 +--- coreutils/expr.c | 10 ++------- coreutils/ln.c | 32 ++++++++++++++------------- include/libbb.h | 2 ++ libbb/Makefile.in | 2 +- libbb/concat_path_file.c | 3 +-- libbb/run_shell.c | 5 ++--- libbb/xconnect.c | 1 + libbb/xreadlink.c | 3 +-- loginutils/Makefile.in | 2 +- loginutils/getty.c | 11 ++++----- loginutils/passwd.c | 2 +- modutils/insmod.c | 29 ++++++++++++++---------- shell/cmdedit.c | 3 +-- util-linux/getopt.c | 26 ++++++++-------------- 18 files changed, 64 insertions(+), 79 deletions(-) diff --git a/Makefile b/Makefile index a112e5781..1e1eddbc5 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ endif busybox: depend $(libraries-y) - $(CC) $(LDFLAGS) $(libraries-y) $(LIBRARIES) -o $@ + $(CC) $(LDFLAGS) -o $@ $(libraries-y) $(LIBRARIES) $(STRIPCMD) $@ busybox.links: applets/busybox.mkll diff --git a/archival/gunzip.c b/archival/gunzip.c index 83ed5e84a..4ab197f09 100644 --- a/archival/gunzip.c +++ b/archival/gunzip.c @@ -119,8 +119,7 @@ static int gunzip_file (const char *path, int flags) } else { error_msg_and_die("Invalid extension"); } - out_path = (char *) xcalloc(sizeof(char), length + 1); - strncpy(out_path, path, length); + out_path = xstrndup(path, length); /* Open output file */ out_file = xfopen(out_path, "w"); diff --git a/archival/libunarchive/get_header_ar.c b/archival/libunarchive/get_header_ar.c index 1618b767f..f172fa7c9 100644 --- a/archival/libunarchive/get_header_ar.c +++ b/archival/libunarchive/get_header_ar.c @@ -91,8 +91,7 @@ file_header_t *get_header_ar(FILE *src_stream) } } else { /* short filenames */ - typed->name = xcalloc(1, 16); - strncpy(typed->name, ar.formated.name, 16); + typed->name = xstrndup(ar.formated.name, 16); } typed->name[strcspn(typed->name, " /")]='\0'; diff --git a/archival/libunarchive/unarchive.c b/archival/libunarchive/unarchive.c index 312b498a1..03e3c3ec2 100644 --- a/archival/libunarchive/unarchive.c +++ b/archival/libunarchive/unarchive.c @@ -58,9 +58,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f return(NULL); } } - full_name = xmalloc(strlen(prefix) + strlen(path) + 1); - strcpy(full_name, prefix); - strcat(full_name, path); + bb_asprintf(&full_name, "%s%s", prefix, path); } else { full_name = file_entry->name; } diff --git a/coreutils/expr.c b/coreutils/expr.c index 0299cc73a..55ae3a969 100644 --- a/coreutils/expr.c +++ b/coreutils/expr.c @@ -146,12 +146,8 @@ static int null (VALUE *v) static void tostring (VALUE *v) { - char *temp; - if (v->type == integer) { - temp = xmalloc (4 * (sizeof (int) / sizeof (char))); - sprintf (temp, "%d", v->u.i); - v->u.s = temp; + bb_asprintf (&(v->u.s), "%d", v->u.i); v->type = string; } } @@ -377,9 +373,7 @@ static VALUE *eval6 (void) else { v = xmalloc (sizeof(VALUE)); v->type = string; - v->u.s = strncpy ((char *) xmalloc (i2->u.i + 1), - l->u.s + i1->u.i - 1, i2->u.i); - v->u.s[i2->u.i] = 0; + v->u.s = xstrndup(l->u.s + i1->u.i - 1, i2->u.i); } freev (l); freev (i1); diff --git a/coreutils/ln.c b/coreutils/ln.c index 1eb853d2f..427ffcc6e 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -43,45 +43,47 @@ static int fs_link(const char *link_destname, const char *link_srcname, { int status; int src_is_dir; - char *src_name; + char *src_name = 0; + const char *src; if (link_destname==NULL) return(FALSE); - src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1); - if (link_srcname==NULL) - strcpy(src_name, link_destname); + src = link_destname; else - strcpy(src_name, link_srcname); + src = link_srcname; if (flag&LN_NODEREFERENCE) - src_is_dir = is_directory(src_name, TRUE, NULL); + src_is_dir = is_directory(src, TRUE, NULL); else - src_is_dir = is_directory(src_name, FALSE, NULL); + src_is_dir = is_directory(src, FALSE, NULL); if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) { char* srcdir_name; srcdir_name = xstrdup(link_destname); - strcat(src_name, "/"); - strcat(src_name, get_last_path_component(srcdir_name)); + src_name = concat_path_file(src, get_last_path_component(srcdir_name)); + src = src_name; free(srcdir_name); } if (flag&LN_FORCE) - unlink(src_name); + unlink(src); if (flag&LN_SYMLINK) - status = symlink(link_destname, src_name); + status = symlink(link_destname, src); else - status = link(link_destname, src_name); + status = link(link_destname, src); if (status != 0) { - perror_msg(src_name); - return(FALSE); + perror_msg(src); + status = FALSE; + } else { + status = TRUE; } - return(TRUE); + free(src_name); + return status; } extern int ln_main(int argc, char **argv) diff --git a/include/libbb.h b/include/libbb.h index 02babb884..55a0ff809 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -321,6 +321,8 @@ void reset_ino_dev_hashtable(void); extern size_t xstrlen(const char *string); #define strlen(x) xstrlen(x) +void bb_asprintf(char **string_ptr, const char *format, ...) __attribute__ ((format (printf, 2, 3))); + #define FAIL_DELAY 3 extern void change_identity ( const struct passwd *pw ); diff --git a/libbb/Makefile.in b/libbb/Makefile.in index 70cc26dc1..e7ca9aa55 100644 --- a/libbb/Makefile.in +++ b/libbb/Makefile.in @@ -41,7 +41,7 @@ LIBBB_SRC:= \ simplify_path.c inet_common.c inode_hash.c obscure.c pwd2spwd.c xfuncs.c \ correct_password.c change_identity.c setup_environment.c run_shell.c \ pw_encrypt.c restricted_shell.c xgethostbyname2.c create_icmp6_socket.c \ - xconnect.c + xconnect.c bb_asprintf.c LIBBB_OBJS=$(patsubst %.c,$(LIBBB_DIR)%.o, $(LIBBB_SRC)) diff --git a/libbb/concat_path_file.c b/libbb/concat_path_file.c index e62b99ef6..0146606a1 100644 --- a/libbb/concat_path_file.c +++ b/libbb/concat_path_file.c @@ -38,8 +38,7 @@ extern char *concat_path_file(const char *path, const char *filename) lc = last_char_is(path, '/'); while (*filename == '/') filename++; - outbuf = xmalloc(strlen(path)+strlen(filename)+1+(lc==NULL)); - sprintf(outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename); + bb_asprintf(&outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename); return outbuf; } diff --git a/libbb/run_shell.c b/libbb/run_shell.c index 30050fecb..b26eba115 100644 --- a/libbb/run_shell.c +++ b/libbb/run_shell.c @@ -60,9 +60,8 @@ void run_shell ( const char *shell, int loginshell, const char *command, const c args [0] = get_last_path_component ( xstrdup ( shell )); if ( loginshell ) { - char *args0 = xmalloc ( xstrlen ( args [0] ) + 2 ); - args0 [0] = '-'; - strcpy ( args0 + 1, args [0] ); + char *args0; + bb_asprintf ( &args0, "-%s", args [0] ); args [0] = args0; } diff --git a/libbb/xconnect.c b/libbb/xconnect.c index d6d144f3f..9e771495d 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c @@ -6,6 +6,7 @@ * */ +#include "inet_common.h" #include #include #include diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c index 932e487a5..9944b5129 100644 --- a/libbb/xreadlink.c +++ b/libbb/xreadlink.c @@ -24,7 +24,7 @@ extern char *xreadlink(const char *path) buf = xrealloc(buf, bufsize += GROWBY); readsize = readlink(path, buf, bufsize); /* 1st try */ if (readsize == -1) { - perror_msg("%s:%s", applet_name, path); + perror_msg("%s", path); return NULL; } } @@ -34,4 +34,3 @@ extern char *xreadlink(const char *path) return buf; } - diff --git a/loginutils/Makefile.in b/loginutils/Makefile.in index cb6452c39..1c5680aa5 100644 --- a/loginutils/Makefile.in +++ b/loginutils/Makefile.in @@ -40,7 +40,7 @@ needcrypt-$(CONFIG_LOGIN) := y needcrypt-$(CONFIG_SU) := y ifeq ($(needcrypt-y),y) - libraries-y +=-lcrypt + LIBRARIES += -lcrypt endif $(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y)) diff --git a/loginutils/getty.c b/loginutils/getty.c index 2144c95ff..0176d621c 100644 --- a/loginutils/getty.c +++ b/loginutils/getty.c @@ -232,7 +232,7 @@ static void termio_final(struct options *op, struct termio *tp, struct chardata *cp); static int caps_lock(const char *s); static int bcode(const char *s); -static void error(const char *fmt, ...); +static void error(const char *fmt, ...) __attribute__ ((noreturn)); /* The following is used for understandable diagnostics. */ @@ -299,8 +299,7 @@ int getty_main(int argc, char **argv) int iv; iv = getpid(); - if (ioctl(0, TIOCSPGRP, &iv) < 0) - perror_msg("ioctl() TIOCSPGRP call failed"); + ioctl(0, TIOCSPGRP, &iv); } #endif /* Initialize the termio settings (raw mode, eight-bit, blocking i/o). */ @@ -368,7 +367,6 @@ int getty_main(int argc, char **argv) (void) execl(options.login, options.login, "--", logname, (char *) 0); error("%s: can't exec %s: %m", options.tty, options.login); - return (0); /* quiet GCC */ } /* parse-args - parse command-line arguments */ @@ -382,10 +380,9 @@ static void parse_args(int argc, char **argv, struct options *op) while (isascii(c = getopt(argc, argv, "I:LH:f:hil:mt:wn"))) { switch (c) { case 'I': - if (!(op->initstring = strdup(optarg))) { + if (!(op->initstring = strdup(optarg))) error("can't malloc initstring"); - break; - } + { char ch, *p, *q; int i; diff --git a/loginutils/passwd.c b/loginutils/passwd.c index 079791c4c..c8756211a 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c @@ -173,7 +173,7 @@ extern int passwd_main(int argc, char **argv) ruid = getuid(); pw = (struct passwd *) getpwuid(ruid); if (!pw) { - error_msg_and_die("Cannot determine your user name.\n"); + error_msg_and_die("Cannot determine your user name."); } myname = (char *) xstrdup(pw->pw_name); if (optind < argc) { diff --git a/modutils/insmod.c b/modutils/insmod.c index 5a40e4199..4f2e9a779 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -233,7 +233,7 @@ #ifndef MODUTILS_MODULE_H static const int MODUTILS_MODULE_H = 1; -#ident "$Id: insmod.c,v 1.87 2002/07/02 19:14:23 andersen Exp $" +#ident "$Id: insmod.c,v 1.88 2002/07/19 00:05:48 sandman Exp $" /* This file contains the structures used by the 2.0 and 2.1 kernels. We do not use the kernel headers directly because we do not wish @@ -454,7 +454,7 @@ int delete_module(const char *); #ifndef MODUTILS_OBJ_H static const int MODUTILS_OBJ_H = 1; -#ident "$Id: insmod.c,v 1.87 2002/07/02 19:14:23 andersen Exp $" +#ident "$Id: insmod.c,v 1.88 2002/07/19 00:05:48 sandman Exp $" /* The relocatable object is manipulated using elfin types. */ @@ -740,7 +740,7 @@ static int n_ext_modules_used; extern int delete_module(const char *); static char *m_filename; -static char m_fullName[FILENAME_MAX]; +static char *m_fullName; @@ -3503,10 +3503,8 @@ extern int insmod_main( int argc, char **argv) tmp[len] = '\0'; } - if (len > (sizeof(m_fullName)-3)) - error_msg_and_die("%s: module name too long", tmp); + bb_asprintf(&m_fullName, "%s.o", tmp, ".o"); - strcat(strcpy(m_fullName, tmp), ".o"); if (!m_name) { m_name = tmp; } else { @@ -3522,25 +3520,32 @@ extern int insmod_main( int argc, char **argv) /* Hmm. Could not open it. First search under /lib/modules/`uname -r`, * but do not error out yet if we fail to find it... */ if (uname(&myuname) == 0) { - char module_dir[FILENAME_MAX]; + char *module_dir; + char *tmdn; char real_module_dir[FILENAME_MAX]; - snprintf (module_dir, sizeof(module_dir), "%s/%s", - _PATH_MODULES, myuname.release); + + tmdn = concat_path_file(_PATH_MODULES, myuname.release); /* Jump through hoops in case /lib/modules/`uname -r` * is a symlink. We do not want recursive_action to * follow symlinks, but we do want to follow the * /lib/modules/`uname -r` dir, So resolve it ourselves * if it is a link... */ - if (realpath (module_dir, real_module_dir) == NULL) - strcpy(real_module_dir, module_dir); - recursive_action(real_module_dir, TRUE, FALSE, FALSE, + if (realpath (tmdn, real_module_dir) == NULL) + module_dir = tmdn; + else + module_dir = real_module_dir; + recursive_action(module_dir, TRUE, FALSE, FALSE, check_module_name_match, 0, m_fullName); + free(tmdn); } /* Check if we have found anything yet */ if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) { char module_dir[FILENAME_MAX]; + + free(m_filename); + m_filename = 0; if (realpath (_PATH_MODULES, module_dir) == NULL) strcpy(module_dir, _PATH_MODULES); /* No module found under /lib/modules/`uname -r`, this diff --git a/shell/cmdedit.c b/shell/cmdedit.c index c5f2e9da2..5cbc81131 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -611,8 +611,7 @@ static char **username_tab_completion(char *ud, int *num_matches) /* Null usernames should result in all users as possible completions. */ if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) { - temp = xmalloc(3 + strlen(entry->pw_name)); - sprintf(temp, "~%s/", entry->pw_name); + bb_asprintf(&temp, "~%s/", entry->pw_name); matches = xrealloc(matches, (nm + 1) * sizeof(char *)); matches[nm++] = temp; diff --git a/util-linux/getopt.c b/util-linux/getopt.c index 95ecba6e6..2390f3056 100644 --- a/util-linux/getopt.c +++ b/util-linux/getopt.c @@ -96,9 +96,7 @@ const char *normalize(const char *arg) free(BUFFER); if (!quote) { /* Just copy arg */ - BUFFER=xmalloc(strlen(arg)+1); - - strcpy(BUFFER,arg); + BUFFER=xstrdup(arg); return BUFFER; } @@ -204,7 +202,6 @@ static const int LONG_OPTIONS_INCR = 10; /* Register a long option. The contents of name is copied. */ void add_longopt(const char *name,int has_arg) { - char *tmp; if (!name) { /* init */ free(long_options); long_options=NULL; @@ -228,9 +225,7 @@ void add_longopt(const char *name,int has_arg) long_options[long_options_nr-1].has_arg=has_arg; long_options[long_options_nr-1].flag=NULL; long_options[long_options_nr-1].val=LONG_OPT; - tmp = xmalloc(strlen(name)+1); - strcpy(tmp,name); - long_options[long_options_nr-1].name=tmp; + long_options[long_options_nr-1].name=xstrdup(name); } long_options_nr++; } @@ -326,7 +321,7 @@ int getopt_main(int argc, char *argv[]) /* For some reason, the original getopt gave no error when there were no arguments. */ printf(" --\n"); - exit(0); + return 0; } else error_msg_and_die("missing optstring argument"); } @@ -336,7 +331,7 @@ int getopt_main(int argc, char *argv[]) optstr=xmalloc(strlen(argv[1])+1); strcpy(optstr,argv[1]+strspn(argv[1],"-+")); argv[1]=argv[0]; - exit(generate_output(argv+1,argc-1,optstr,long_options)); + return (generate_output(argv+1,argc-1,optstr,long_options)); } while ((opt=getopt_long(argc,argv,shortopts,longopts,NULL)) != EOF) @@ -347,8 +342,7 @@ int getopt_main(int argc, char *argv[]) case 'o': if (optstr) free(optstr); - optstr=xmalloc(strlen(optarg)+1); - strcpy(optstr,optarg); + optstr=xstrdup(optarg); break; case 'l': add_long_options(optarg); @@ -356,8 +350,7 @@ int getopt_main(int argc, char *argv[]) case 'n': if (name) free(name); - name=xmalloc(strlen(optarg)+1); - strcpy(name,optarg); + name=xstrdup(optarg); break; case 'q': quiet_errors=1; @@ -369,7 +362,7 @@ int getopt_main(int argc, char *argv[]) set_shell(optarg); break; case 'T': - exit(4); + return 4; case 'u': quote=0; break; @@ -381,8 +374,7 @@ int getopt_main(int argc, char *argv[]) if (optind >= argc) error_msg_and_die("missing optstring argument"); else { - optstr=xmalloc(strlen(argv[optind])+1); - strcpy(optstr,argv[optind]); + optstr=xstrdup(argv[optind]); optind++; } } @@ -390,7 +382,7 @@ int getopt_main(int argc, char *argv[]) argv[optind-1]=name; else argv[optind-1]=argv[0]; - exit(generate_output(argv+optind-1,argc-optind+1,optstr,long_options)); + return (generate_output(argv+optind-1,argc-optind+1,optstr,long_options)); } /*