#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.
busybox: depend $(libraries-y)
- $(CC) $(LDFLAGS) $(libraries-y) $(LIBRARIES) -o $@
+ $(CC) $(LDFLAGS) -o $@ $(libraries-y) $(LIBRARIES)
$(STRIPCMD) $@
busybox.links: applets/busybox.mkll
} 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");
}
} 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';
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;
}
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;
}
}
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);
{
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)
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 );
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))
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;
}
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;
}
*
*/
+#include "inet_common.h"
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
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;
}
}
return buf;
}
-
needcrypt-$(CONFIG_SU) := y
ifeq ($(needcrypt-y),y)
- libraries-y +=-lcrypt
+ LIBRARIES += -lcrypt
endif
$(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y))
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. */
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). */
(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 */
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;
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) {
#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
#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. */
extern int delete_module(const char *);
static char *m_filename;
-static char m_fullName[FILENAME_MAX];
+static char *m_fullName;
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 {
/* 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
/* 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;
free(BUFFER);
if (!quote) { /* Just copy arg */
- BUFFER=xmalloc(strlen(arg)+1);
-
- strcpy(BUFFER,arg);
+ BUFFER=xstrdup(arg);
return BUFFER;
}
/* 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;
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++;
}
/* 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");
}
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)
case 'o':
if (optstr)
free(optstr);
- optstr=xmalloc(strlen(optarg)+1);
- strcpy(optstr,optarg);
+ optstr=xstrdup(optarg);
break;
case 'l':
add_long_options(optarg);
case 'n':
if (name)
free(name);
- name=xmalloc(strlen(optarg)+1);
- strcpy(name,optarg);
+ name=xstrdup(optarg);
break;
case 'q':
quiet_errors=1;
set_shell(optarg);
break;
case 'T':
- exit(4);
+ return 4;
case 'u':
quote=0;
break;
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++;
}
}
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));
}
/*