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.
diff --git a/coreutils/expr.c b/coreutils/expr.c
index 0299cc7..55ae3a9 100644
--- a/coreutils/expr.c
+++ b/coreutils/expr.c
@@ -146,12 +146,8 @@
 
 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 @@
 		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 1eb853d..427ffcc 100644
--- a/coreutils/ln.c
+++ b/coreutils/ln.c
@@ -43,45 +43,47 @@
 {
 	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)