summaryrefslogtreecommitdiff
path: root/coreutils/ln.c
diff options
context:
space:
mode:
authorRobert Griebl2002-07-19 00:05:54 +0000
committerRobert Griebl2002-07-19 00:05:54 +0000
commitd378c3149c6c24e7788f04a6d20ba360f3ea407e (patch)
tree945ff88bbbde5a32c2b3342b22d801be90ea40f2 /coreutils/ln.c
parent88947dd05e28a3b793b16dfd6db1b5414ca99017 (diff)
downloadbusybox-d378c3149c6c24e7788f04a6d20ba360f3ea407e.zip
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/ln.c')
-rw-r--r--coreutils/ln.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/coreutils/ln.c b/coreutils/ln.c
index 1eb853d..427ffcc 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)