aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/libarchive/unsafe_symlink_target.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/archival/libarchive/unsafe_symlink_target.c b/archival/libarchive/unsafe_symlink_target.c
index 8e4cd4380..d9100f30f 100644
--- a/archival/libarchive/unsafe_symlink_target.c
+++ b/archival/libarchive/unsafe_symlink_target.c
@@ -5,29 +5,31 @@
5#include "libbb.h" 5#include "libbb.h"
6#include "bb_archive.h" 6#include "bb_archive.h"
7 7
8/* symlink may not be available for WIN32, just issue a warning */
9#if ENABLE_PLATFORM_MINGW32
10# undef bb_perror_msg_and_die
11# define bb_perror_msg_and_die(...) bb_perror_msg(__VA_ARGS__)
12#endif
13
14void FAST_FUNC create_or_remember_link(llist_t **link_placeholders, 8void FAST_FUNC create_or_remember_link(llist_t **link_placeholders,
15 const char *target, 9 const char *target,
16 const char *linkname, 10 const char *linkname,
17 int hard_link) 11 int hard_link)
18{ 12{
13#if ENABLE_PLATFORM_MINGW32
14 /* defer reporting error if symlink(2) fails on Windows */
15 if (hard_link || target[0] == '/' || strstr(target, "..") ||
16 symlink(target, linkname) != 0) {
17#else
19 if (hard_link || target[0] == '/' || strstr(target, "..")) { 18 if (hard_link || target[0] == '/' || strstr(target, "..")) {
19#endif
20 llist_add_to_end(link_placeholders, 20 llist_add_to_end(link_placeholders,
21 xasprintf("%c%s%c%s", hard_link, linkname, '\0', target) 21 xasprintf("%c%s%c%s", hard_link, linkname, '\0', target)
22 ); 22 );
23 return; 23 return;
24 } 24 }
25#if !ENABLE_PLATFORM_MINGW32
25 if (symlink(target, linkname) != 0) { 26 if (symlink(target, linkname) != 0) {
26 /* shared message */ 27 /* shared message */
27 bb_perror_msg_and_die("can't create %slink '%s' to '%s'", 28 bb_perror_msg_and_die("can't create %slink '%s' to '%s'",
28 "sym", linkname, target 29 "sym", linkname, target
29 ); 30 );
30 } 31 }
32#endif
31} 33}
32 34
33void FAST_FUNC create_links_from_list(llist_t *list) 35void FAST_FUNC create_links_from_list(llist_t *list)
@@ -37,24 +39,11 @@ void FAST_FUNC create_links_from_list(llist_t *list)
37 39
38 target = list->data + 1 + strlen(list->data + 1) + 1; 40 target = list->data + 1 + strlen(list->data + 1) + 1;
39 if ((*list->data ? link : symlink) (target, list->data + 1)) { 41 if ((*list->data ? link : symlink) (target, list->data + 1)) {
40#if !ENABLE_PLATFORM_MINGW32
41 /* shared message */ 42 /* shared message */
42 bb_error_msg_and_die("can't create %slink '%s' to '%s'", 43 bb_error_msg_and_die("can't create %slink '%s' to '%s'",
43 *list->data ? "hard" : "sym", 44 *list->data ? "hard" : "sym",
44 list->data + 1, target 45 list->data + 1, target
45 ); 46 );
46#else
47 if (!*list->data)
48 bb_error_msg("can't create %slink '%s' to '%s'",
49 "sym",
50 list->data + 1, target
51 );
52 else
53 bb_error_msg_and_die("can't create %slink '%s' to '%s'",
54 "hard",
55 list->data + 1, target
56 );
57#endif
58 } 47 }
59 list = list->link; 48 list = list->link;
60 } 49 }