do not do utime() on links, it acts on link targets, and we don't want that.
rename link_name to link_target, less confusing this way.

diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index 0bb5bfe..76e7edf 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -25,7 +25,8 @@
 		 && (unlink(file_header->name) == -1)
 		 && (errno != ENOENT)
 		) {
-			bb_perror_msg_and_die("cannot remove old file");
+			bb_perror_msg_and_die("cannot remove old file %s",
+					file_header->name);
 		}
 	}
 	else if (archive_handle->flags & ARCHIVE_EXTRACT_NEWER) {
@@ -52,13 +53,16 @@
 
 	/* Handle hard links separately
 	 * We identified hard links as regular files of size 0 with a symlink */
-	if (S_ISREG(file_header->mode) && (file_header->link_name)
+	if (S_ISREG(file_header->mode) && (file_header->link_target)
 	 && (file_header->size == 0)
 	) {
 		/* hard link */
-		res = link(file_header->link_name, file_header->name);
+		res = link(file_header->link_target, file_header->name);
 		if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
-			bb_perror_msg("cannot create hard link");
+			bb_perror_msg("cannot create %slink "
+					"from %s to %s", "hard",
+					file_header->name,
+					file_header->link_target);
 		}
 	} else {
 		/* Create the filesystem entry */
@@ -73,22 +77,22 @@
 		}
 		case S_IFDIR:
 			res = mkdir(file_header->name, file_header->mode);
-			if ((errno != EISDIR) && (res == -1)
+			if ((res == -1) && (errno != EISDIR)
 			 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)
 			) {
-				bb_perror_msg("extract_archive: %s", file_header->name);
+				bb_perror_msg("cannot make dir %s", file_header->name);
 			}
 			break;
 		case S_IFLNK:
 			/* Symlink */
-			res = symlink(file_header->link_name, file_header->name);
+			res = symlink(file_header->link_target, file_header->name);
 			if ((res == -1)
 			 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)
 			) {
-				bb_perror_msg("cannot create symlink "
-					"from %s to '%s'",
+				bb_perror_msg("cannot create %slink "
+					"from %s to %s", "sym",
 					file_header->name,
-					file_header->link_name);
+					file_header->link_target);
 			}
 			break;
 		case S_IFSOCK:
@@ -110,18 +114,18 @@
 	if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_OWN)) {
 		lchown(file_header->name, file_header->uid, file_header->gid);
 	}
-	/* uclibc has no lchmod, glibc is even stranger -
-	 * it has lchmod which seems to do nothing!
-	 * so we use chmod... */
-	if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM)
-	 && (file_header->mode & S_IFMT) != S_IFLNK
-	) {
-		chmod(file_header->name, file_header->mode);
-	}
-
-	if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) {
-		struct utimbuf t;
-		t.actime = t.modtime = file_header->mtime;
-		utime(file_header->name, &t);
+	if ((file_header->mode & S_IFMT) != S_IFLNK) {
+		/* uclibc has no lchmod, glibc is even stranger -
+		 * it has lchmod which seems to do nothing!
+		 * so we use chmod... */
+		if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM)) {
+			chmod(file_header->name, file_header->mode);
+		}
+		/* same for utime */
+		if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) {
+			struct utimbuf t;
+			t.actime = t.modtime = file_header->mtime;
+			utime(file_header->name, &t);
+		}
 	}
 }