diff options
author | Robert Griebl <griebl@gmx.de> | 2002-07-19 00:05:54 +0000 |
---|---|---|
committer | Robert Griebl <griebl@gmx.de> | 2002-07-19 00:05:54 +0000 |
commit | d378c3149c6c24e7788f04a6d20ba360f3ea407e (patch) | |
tree | 945ff88bbbde5a32c2b3342b22d801be90ea40f2 /coreutils | |
parent | 88947dd05e28a3b793b16dfd6db1b5414ca99017 (diff) | |
download | busybox-d378c3149c6c24e7788f04a6d20ba360f3ea407e.tar.gz |
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.
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/expr.c | 10 | ||||
-rw-r--r-- | coreutils/ln.c | 32 |
2 files changed, 19 insertions, 23 deletions
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) |