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.
This commit is contained in:
Robert Griebl 2002-07-19 00:05:54 +00:00
parent 88947dd05e
commit d378c3149c
18 changed files with 64 additions and 79 deletions

View File

@ -47,7 +47,7 @@ endif
busybox: depend $(libraries-y) busybox: depend $(libraries-y)
$(CC) $(LDFLAGS) $(libraries-y) $(LIBRARIES) -o $@ $(CC) $(LDFLAGS) -o $@ $(libraries-y) $(LIBRARIES)
$(STRIPCMD) $@ $(STRIPCMD) $@
busybox.links: applets/busybox.mkll busybox.links: applets/busybox.mkll

View File

@ -119,8 +119,7 @@ static int gunzip_file (const char *path, int flags)
} else { } else {
error_msg_and_die("Invalid extension"); error_msg_and_die("Invalid extension");
} }
out_path = (char *) xcalloc(sizeof(char), length + 1); out_path = xstrndup(path, length);
strncpy(out_path, path, length);
/* Open output file */ /* Open output file */
out_file = xfopen(out_path, "w"); out_file = xfopen(out_path, "w");

View File

@ -91,8 +91,7 @@ file_header_t *get_header_ar(FILE *src_stream)
} }
} else { } else {
/* short filenames */ /* short filenames */
typed->name = xcalloc(1, 16); typed->name = xstrndup(ar.formated.name, 16);
strncpy(typed->name, ar.formated.name, 16);
} }
typed->name[strcspn(typed->name, " /")]='\0'; typed->name[strcspn(typed->name, " /")]='\0';

View File

@ -58,9 +58,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f
return(NULL); return(NULL);
} }
} }
full_name = xmalloc(strlen(prefix) + strlen(path) + 1); bb_asprintf(&full_name, "%s%s", prefix, path);
strcpy(full_name, prefix);
strcat(full_name, path);
} else { } else {
full_name = file_entry->name; full_name = file_entry->name;
} }

View File

@ -146,12 +146,8 @@ static int null (VALUE *v)
static void tostring (VALUE *v) static void tostring (VALUE *v)
{ {
char *temp;
if (v->type == integer) { if (v->type == integer) {
temp = xmalloc (4 * (sizeof (int) / sizeof (char))); bb_asprintf (&(v->u.s), "%d", v->u.i);
sprintf (temp, "%d", v->u.i);
v->u.s = temp;
v->type = string; v->type = string;
} }
} }
@ -377,9 +373,7 @@ static VALUE *eval6 (void)
else { else {
v = xmalloc (sizeof(VALUE)); v = xmalloc (sizeof(VALUE));
v->type = string; v->type = string;
v->u.s = strncpy ((char *) xmalloc (i2->u.i + 1), v->u.s = xstrndup(l->u.s + i1->u.i - 1, i2->u.i);
l->u.s + i1->u.i - 1, i2->u.i);
v->u.s[i2->u.i] = 0;
} }
freev (l); freev (l);
freev (i1); freev (i1);

View File

@ -43,45 +43,47 @@ static int fs_link(const char *link_destname, const char *link_srcname,
{ {
int status; int status;
int src_is_dir; int src_is_dir;
char *src_name; char *src_name = 0;
const char *src;
if (link_destname==NULL) if (link_destname==NULL)
return(FALSE); return(FALSE);
src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1);
if (link_srcname==NULL) if (link_srcname==NULL)
strcpy(src_name, link_destname); src = link_destname;
else else
strcpy(src_name, link_srcname); src = link_srcname;
if (flag&LN_NODEREFERENCE) if (flag&LN_NODEREFERENCE)
src_is_dir = is_directory(src_name, TRUE, NULL); src_is_dir = is_directory(src, TRUE, NULL);
else 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)) { if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
char* srcdir_name; char* srcdir_name;
srcdir_name = xstrdup(link_destname); srcdir_name = xstrdup(link_destname);
strcat(src_name, "/"); src_name = concat_path_file(src, get_last_path_component(srcdir_name));
strcat(src_name, get_last_path_component(srcdir_name)); src = src_name;
free(srcdir_name); free(srcdir_name);
} }
if (flag&LN_FORCE) if (flag&LN_FORCE)
unlink(src_name); unlink(src);
if (flag&LN_SYMLINK) if (flag&LN_SYMLINK)
status = symlink(link_destname, src_name); status = symlink(link_destname, src);
else else
status = link(link_destname, src_name); status = link(link_destname, src);
if (status != 0) { if (status != 0) {
perror_msg(src_name); perror_msg(src);
return(FALSE); status = FALSE;
} else {
status = TRUE;
} }
return(TRUE); free(src_name);
return status;
} }
extern int ln_main(int argc, char **argv) extern int ln_main(int argc, char **argv)

View File

@ -321,6 +321,8 @@ void reset_ino_dev_hashtable(void);
extern size_t xstrlen(const char *string); extern size_t xstrlen(const char *string);
#define strlen(x) xstrlen(x) #define strlen(x) xstrlen(x)
void bb_asprintf(char **string_ptr, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
#define FAIL_DELAY 3 #define FAIL_DELAY 3
extern void change_identity ( const struct passwd *pw ); extern void change_identity ( const struct passwd *pw );

View File

@ -41,7 +41,7 @@ LIBBB_SRC:= \
simplify_path.c inet_common.c inode_hash.c obscure.c pwd2spwd.c xfuncs.c \ 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 \ correct_password.c change_identity.c setup_environment.c run_shell.c \
pw_encrypt.c restricted_shell.c xgethostbyname2.c create_icmp6_socket.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)) LIBBB_OBJS=$(patsubst %.c,$(LIBBB_DIR)%.o, $(LIBBB_SRC))

View File

@ -38,8 +38,7 @@ extern char *concat_path_file(const char *path, const char *filename)
lc = last_char_is(path, '/'); lc = last_char_is(path, '/');
while (*filename == '/') while (*filename == '/')
filename++; filename++;
outbuf = xmalloc(strlen(path)+strlen(filename)+1+(lc==NULL)); bb_asprintf(&outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename);
sprintf(outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename);
return outbuf; return outbuf;
} }

View File

@ -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 )); args [0] = get_last_path_component ( xstrdup ( shell ));
if ( loginshell ) { if ( loginshell ) {
char *args0 = xmalloc ( xstrlen ( args [0] ) + 2 ); char *args0;
args0 [0] = '-'; bb_asprintf ( &args0, "-%s", args [0] );
strcpy ( args0 + 1, args [0] );
args [0] = args0; args [0] = args0;
} }

View File

@ -6,6 +6,7 @@
* *
*/ */
#include "inet_common.h"
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>

View File

@ -24,7 +24,7 @@ extern char *xreadlink(const char *path)
buf = xrealloc(buf, bufsize += GROWBY); buf = xrealloc(buf, bufsize += GROWBY);
readsize = readlink(path, buf, bufsize); /* 1st try */ readsize = readlink(path, buf, bufsize); /* 1st try */
if (readsize == -1) { if (readsize == -1) {
perror_msg("%s:%s", applet_name, path); perror_msg("%s", path);
return NULL; return NULL;
} }
} }
@ -34,4 +34,3 @@ extern char *xreadlink(const char *path)
return buf; return buf;
} }

View File

@ -40,7 +40,7 @@ needcrypt-$(CONFIG_LOGIN) := y
needcrypt-$(CONFIG_SU) := y needcrypt-$(CONFIG_SU) := y
ifeq ($(needcrypt-y),y) ifeq ($(needcrypt-y),y)
libraries-y +=-lcrypt LIBRARIES += -lcrypt
endif endif
$(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y)) $(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y))

View File

@ -232,7 +232,7 @@ static void termio_final(struct options *op, struct termio *tp,
struct chardata *cp); struct chardata *cp);
static int caps_lock(const char *s); static int caps_lock(const char *s);
static int bcode(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. */ /* The following is used for understandable diagnostics. */
@ -299,8 +299,7 @@ int getty_main(int argc, char **argv)
int iv; int iv;
iv = getpid(); iv = getpid();
if (ioctl(0, TIOCSPGRP, &iv) < 0) ioctl(0, TIOCSPGRP, &iv);
perror_msg("ioctl() TIOCSPGRP call failed");
} }
#endif #endif
/* Initialize the termio settings (raw mode, eight-bit, blocking i/o). */ /* 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); (void) execl(options.login, options.login, "--", logname, (char *) 0);
error("%s: can't exec %s: %m", options.tty, options.login); error("%s: can't exec %s: %m", options.tty, options.login);
return (0); /* quiet GCC */
} }
/* parse-args - parse command-line arguments */ /* 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"))) { while (isascii(c = getopt(argc, argv, "I:LH:f:hil:mt:wn"))) {
switch (c) { switch (c) {
case 'I': case 'I':
if (!(op->initstring = strdup(optarg))) { if (!(op->initstring = strdup(optarg)))
error("can't malloc initstring"); error("can't malloc initstring");
break;
}
{ {
char ch, *p, *q; char ch, *p, *q;
int i; int i;

View File

@ -173,7 +173,7 @@ extern int passwd_main(int argc, char **argv)
ruid = getuid(); ruid = getuid();
pw = (struct passwd *) getpwuid(ruid); pw = (struct passwd *) getpwuid(ruid);
if (!pw) { 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); myname = (char *) xstrdup(pw->pw_name);
if (optind < argc) { if (optind < argc) {

View File

@ -233,7 +233,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; 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. /* 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 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 #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; 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. */ /* The relocatable object is manipulated using elfin types. */
@ -740,7 +740,7 @@ static int n_ext_modules_used;
extern int delete_module(const char *); extern int delete_module(const char *);
static char *m_filename; 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'; tmp[len] = '\0';
} }
if (len > (sizeof(m_fullName)-3)) bb_asprintf(&m_fullName, "%s.o", tmp, ".o");
error_msg_and_die("%s: module name too long", tmp);
strcat(strcpy(m_fullName, tmp), ".o");
if (!m_name) { if (!m_name) {
m_name = tmp; m_name = tmp;
} else { } 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`, /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
* but do not error out yet if we fail to find it... */ * but do not error out yet if we fail to find it... */
if (uname(&myuname) == 0) { if (uname(&myuname) == 0) {
char module_dir[FILENAME_MAX]; char *module_dir;
char *tmdn;
char real_module_dir[FILENAME_MAX]; 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` /* Jump through hoops in case /lib/modules/`uname -r`
* is a symlink. We do not want recursive_action to * is a symlink. We do not want recursive_action to
* follow symlinks, but we do want to follow the * follow symlinks, but we do want to follow the
* /lib/modules/`uname -r` dir, So resolve it ourselves * /lib/modules/`uname -r` dir, So resolve it ourselves
* if it is a link... */ * if it is a link... */
if (realpath (module_dir, real_module_dir) == NULL) if (realpath (tmdn, real_module_dir) == NULL)
strcpy(real_module_dir, module_dir); module_dir = tmdn;
recursive_action(real_module_dir, TRUE, FALSE, FALSE, else
module_dir = real_module_dir;
recursive_action(module_dir, TRUE, FALSE, FALSE,
check_module_name_match, 0, m_fullName); check_module_name_match, 0, m_fullName);
free(tmdn);
} }
/* Check if we have found anything yet */ /* Check if we have found anything yet */
if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL))
{ {
char module_dir[FILENAME_MAX]; char module_dir[FILENAME_MAX];
free(m_filename);
m_filename = 0;
if (realpath (_PATH_MODULES, module_dir) == NULL) if (realpath (_PATH_MODULES, module_dir) == NULL)
strcpy(module_dir, _PATH_MODULES); strcpy(module_dir, _PATH_MODULES);
/* No module found under /lib/modules/`uname -r`, this /* No module found under /lib/modules/`uname -r`, this

View File

@ -611,8 +611,7 @@ static char **username_tab_completion(char *ud, int *num_matches)
/* Null usernames should result in all users as possible completions. */ /* Null usernames should result in all users as possible completions. */
if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) { if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) {
temp = xmalloc(3 + strlen(entry->pw_name)); bb_asprintf(&temp, "~%s/", entry->pw_name);
sprintf(temp, "~%s/", entry->pw_name);
matches = xrealloc(matches, (nm + 1) * sizeof(char *)); matches = xrealloc(matches, (nm + 1) * sizeof(char *));
matches[nm++] = temp; matches[nm++] = temp;

View File

@ -96,9 +96,7 @@ const char *normalize(const char *arg)
free(BUFFER); free(BUFFER);
if (!quote) { /* Just copy arg */ if (!quote) { /* Just copy arg */
BUFFER=xmalloc(strlen(arg)+1); BUFFER=xstrdup(arg);
strcpy(BUFFER,arg);
return BUFFER; return BUFFER;
} }
@ -204,7 +202,6 @@ static const int LONG_OPTIONS_INCR = 10;
/* Register a long option. The contents of name is copied. */ /* Register a long option. The contents of name is copied. */
void add_longopt(const char *name,int has_arg) void add_longopt(const char *name,int has_arg)
{ {
char *tmp;
if (!name) { /* init */ if (!name) { /* init */
free(long_options); free(long_options);
long_options=NULL; 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].has_arg=has_arg;
long_options[long_options_nr-1].flag=NULL; long_options[long_options_nr-1].flag=NULL;
long_options[long_options_nr-1].val=LONG_OPT; long_options[long_options_nr-1].val=LONG_OPT;
tmp = xmalloc(strlen(name)+1); long_options[long_options_nr-1].name=xstrdup(name);
strcpy(tmp,name);
long_options[long_options_nr-1].name=tmp;
} }
long_options_nr++; long_options_nr++;
} }
@ -326,7 +321,7 @@ int getopt_main(int argc, char *argv[])
/* For some reason, the original getopt gave no error /* For some reason, the original getopt gave no error
when there were no arguments. */ when there were no arguments. */
printf(" --\n"); printf(" --\n");
exit(0); return 0;
} else } else
error_msg_and_die("missing optstring argument"); error_msg_and_die("missing optstring argument");
} }
@ -336,7 +331,7 @@ int getopt_main(int argc, char *argv[])
optstr=xmalloc(strlen(argv[1])+1); optstr=xmalloc(strlen(argv[1])+1);
strcpy(optstr,argv[1]+strspn(argv[1],"-+")); strcpy(optstr,argv[1]+strspn(argv[1],"-+"));
argv[1]=argv[0]; 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) while ((opt=getopt_long(argc,argv,shortopts,longopts,NULL)) != EOF)
@ -347,8 +342,7 @@ int getopt_main(int argc, char *argv[])
case 'o': case 'o':
if (optstr) if (optstr)
free(optstr); free(optstr);
optstr=xmalloc(strlen(optarg)+1); optstr=xstrdup(optarg);
strcpy(optstr,optarg);
break; break;
case 'l': case 'l':
add_long_options(optarg); add_long_options(optarg);
@ -356,8 +350,7 @@ int getopt_main(int argc, char *argv[])
case 'n': case 'n':
if (name) if (name)
free(name); free(name);
name=xmalloc(strlen(optarg)+1); name=xstrdup(optarg);
strcpy(name,optarg);
break; break;
case 'q': case 'q':
quiet_errors=1; quiet_errors=1;
@ -369,7 +362,7 @@ int getopt_main(int argc, char *argv[])
set_shell(optarg); set_shell(optarg);
break; break;
case 'T': case 'T':
exit(4); return 4;
case 'u': case 'u':
quote=0; quote=0;
break; break;
@ -381,8 +374,7 @@ int getopt_main(int argc, char *argv[])
if (optind >= argc) if (optind >= argc)
error_msg_and_die("missing optstring argument"); error_msg_and_die("missing optstring argument");
else { else {
optstr=xmalloc(strlen(argv[optind])+1); optstr=xstrdup(argv[optind]);
strcpy(optstr,argv[optind]);
optind++; optind++;
} }
} }
@ -390,7 +382,7 @@ int getopt_main(int argc, char *argv[])
argv[optind-1]=name; argv[optind-1]=name;
else else
argv[optind-1]=argv[0]; 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));
} }
/* /*