summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/libarchive/files
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-extended/libarchive/files')
-rw-r--r--meta/recipes-extended/libarchive/files/0001-archive_write_disk_posix.c-make-_fsobj-functions-mor.patch245
-rw-r--r--meta/recipes-extended/libarchive/files/0002-Fix-extracting-hardlinks-over-symlinks.patch120
-rw-r--r--meta/recipes-extended/libarchive/files/non-recursive-extract-and-list.patch153
3 files changed, 0 insertions, 518 deletions
diff --git a/meta/recipes-extended/libarchive/files/0001-archive_write_disk_posix.c-make-_fsobj-functions-mor.patch b/meta/recipes-extended/libarchive/files/0001-archive_write_disk_posix.c-make-_fsobj-functions-mor.patch
deleted file mode 100644
index e911a7c1f2..0000000000
--- a/meta/recipes-extended/libarchive/files/0001-archive_write_disk_posix.c-make-_fsobj-functions-mor.patch
+++ /dev/null
@@ -1,245 +0,0 @@
1From 90881d24d3f6d5fb207e97df3b91bbea8598e84e Mon Sep 17 00:00:00 2001
2From: Martin Matuska <martin@matuska.org>
3Date: Tue, 29 Nov 2016 16:47:37 +0100
4Subject: [PATCH 1/2] archive_write_disk_posix.c: make *_fsobj functions more
5 readable
6
7Upstream-Status: Backported
8
9Signed-off-by: Amarnath Valluri <amarnath.valluri@intel.com>
10---
11 libarchive/archive_write_disk_posix.c | 121 +++++++++++++++++-----------------
12 1 file changed, 61 insertions(+), 60 deletions(-)
13
14diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
15index 17c23b0..d786bc2 100644
16--- a/libarchive/archive_write_disk_posix.c
17+++ b/libarchive/archive_write_disk_posix.c
18@@ -336,6 +336,8 @@ struct archive_write_disk {
19
20 #define HFS_BLOCKS(s) ((s) >> 12)
21
22+static void fsobj_error(int *, struct archive_string *, int, const char *,
23+ const char *);
24 static int check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags);
25 static int check_symlinks(struct archive_write_disk *);
26 static int create_filesystem_object(struct archive_write_disk *);
27@@ -2005,8 +2007,9 @@ restore_entry(struct archive_write_disk *a)
28
29 if (en) {
30 /* Everything failed; give up here. */
31- archive_set_error(&a->archive, en, "Can't create '%s'",
32- a->name);
33+ if ((&a->archive)->error == NULL)
34+ archive_set_error(&a->archive, en, "Can't create '%s'",
35+ a->name);
36 return (ARCHIVE_FAILED);
37 }
38
39@@ -2388,6 +2391,17 @@ current_fixup(struct archive_write_disk *a, const char *pathname)
40 return (a->current_fixup);
41 }
42
43+/* Error helper for new *_fsobj functions */
44+static void
45+fsobj_error(int *a_eno, struct archive_string *a_estr,
46+ int err, const char *errstr, const char *path)
47+{
48+ if (a_eno)
49+ *a_eno = err;
50+ if (a_estr)
51+ archive_string_sprintf(a_estr, errstr, path);
52+}
53+
54 /*
55 * TODO: Someday, integrate this with the deep dir support; they both
56 * scan the path and both can be optimized by comparing against other
57@@ -2400,7 +2414,7 @@ current_fixup(struct archive_write_disk *a, const char *pathname)
58 * ARCHIVE_OK if there are none, otherwise puts an error in errmsg.
59 */
60 static int
61-check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags)
62+check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, int flags)
63 {
64 #if !defined(HAVE_LSTAT)
65 /* Platform doesn't have lstat, so we can't look for symlinks. */
66@@ -2474,19 +2488,20 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
67 if (errno == ENOENT) {
68 break;
69 } else {
70- /* Treat any other error as fatal - best to be paranoid here
71- * Note: This effectively disables deep directory
72- * support when security checks are enabled.
73- * Otherwise, very long pathnames that trigger
74- * an error here could evade the sandbox.
75- * TODO: We could do better, but it would probably
76- * require merging the symlink checks with the
77- * deep-directory editing. */
78- if (error_number) *error_number = errno;
79- if (error_string)
80- archive_string_sprintf(error_string,
81- "Could not stat %s",
82- path);
83+ /*
84+ * Treat any other error as fatal - best to be
85+ * paranoid here.
86+ * Note: This effectively disables deep
87+ * directory support when security checks are
88+ * enabled. Otherwise, very long pathnames that
89+ * trigger an error here could evade the
90+ * sandbox.
91+ * TODO: We could do better, but it would
92+ * probably require merging the symlink checks
93+ * with the deep-directory editing.
94+ */
95+ fsobj_error(a_eno, a_estr, errno,
96+ "Could not stat %s", path);
97 res = ARCHIVE_FAILED;
98 break;
99 }
100@@ -2494,11 +2509,8 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
101 if (!last) {
102 if (chdir(head) != 0) {
103 tail[0] = c;
104- if (error_number) *error_number = errno;
105- if (error_string)
106- archive_string_sprintf(error_string,
107- "Could not chdir %s",
108- path);
109+ fsobj_error(a_eno, a_estr, errno,
110+ "Could not chdir %s", path);
111 res = (ARCHIVE_FATAL);
112 break;
113 }
114@@ -2514,11 +2526,9 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
115 */
116 if (unlink(head)) {
117 tail[0] = c;
118- if (error_number) *error_number = errno;
119- if (error_string)
120- archive_string_sprintf(error_string,
121- "Could not remove symlink %s",
122- path);
123+ fsobj_error(a_eno, a_estr, errno,
124+ "Could not remove symlink %s",
125+ path);
126 res = ARCHIVE_FAILED;
127 break;
128 }
129@@ -2529,13 +2539,14 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
130 * symlink with another symlink.
131 */
132 tail[0] = c;
133- /* FIXME: not sure how important this is to restore
134+ /*
135+ * FIXME: not sure how important this is to
136+ * restore
137+ */
138+ /*
139 if (!S_ISLNK(path)) {
140- if (error_number) *error_number = 0;
141- if (error_string)
142- archive_string_sprintf(error_string,
143- "Removing symlink %s",
144- path);
145+ fsobj_error(a_eno, a_estr, 0,
146+ "Removing symlink %s", path);
147 }
148 */
149 /* Symlink gone. No more problem! */
150@@ -2545,22 +2556,17 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
151 /* User asked us to remove problems. */
152 if (unlink(head) != 0) {
153 tail[0] = c;
154- if (error_number) *error_number = 0;
155- if (error_string)
156- archive_string_sprintf(error_string,
157- "Cannot remove intervening symlink %s",
158- path);
159+ fsobj_error(a_eno, a_estr, 0,
160+ "Cannot remove intervening "
161+ "symlink %s", path);
162 res = ARCHIVE_FAILED;
163 break;
164 }
165 tail[0] = c;
166 } else {
167 tail[0] = c;
168- if (error_number) *error_number = 0;
169- if (error_string)
170- archive_string_sprintf(error_string,
171- "Cannot extract through symlink %s",
172- path);
173+ fsobj_error(a_eno, a_estr, 0,
174+ "Cannot extract through symlink %s", path);
175 res = ARCHIVE_FAILED;
176 break;
177 }
178@@ -2577,10 +2583,8 @@ check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error
179 if (restore_pwd >= 0) {
180 r = fchdir(restore_pwd);
181 if (r != 0) {
182- if(error_number) *error_number = errno;
183- if(error_string)
184- archive_string_sprintf(error_string,
185- "chdir() failure");
186+ fsobj_error(a_eno, a_estr, errno,
187+ "chdir() failure", "");
188 }
189 close(restore_pwd);
190 restore_pwd = -1;
191@@ -2688,17 +2692,16 @@ cleanup_pathname_win(struct archive_write_disk *a)
192 * is set) if the path is absolute.
193 */
194 static int
195-cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags)
196+cleanup_pathname_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
197+ int flags)
198 {
199 char *dest, *src;
200 char separator = '\0';
201
202 dest = src = path;
203 if (*src == '\0') {
204- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
205- if (error_string)
206- archive_string_sprintf(error_string,
207- "Invalid empty pathname");
208+ fsobj_error(a_eno, a_estr, ARCHIVE_ERRNO_MISC,
209+ "Invalid empty ", "pathname");
210 return (ARCHIVE_FAILED);
211 }
212
213@@ -2708,10 +2711,8 @@ cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *err
214 /* Skip leading '/'. */
215 if (*src == '/') {
216 if (flags & ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS) {
217- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
218- if (error_string)
219- archive_string_sprintf(error_string,
220- "Path is absolute");
221+ fsobj_error(a_eno, a_estr, ARCHIVE_ERRNO_MISC,
222+ "Path is ", "absolute");
223 return (ARCHIVE_FAILED);
224 }
225
226@@ -2738,11 +2739,11 @@ cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *err
227 } else if (src[1] == '.') {
228 if (src[2] == '/' || src[2] == '\0') {
229 /* Conditionally warn about '..' */
230- if (flags & ARCHIVE_EXTRACT_SECURE_NODOTDOT) {
231- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
232- if (error_string)
233- archive_string_sprintf(error_string,
234- "Path contains '..'");
235+ if (flags
236+ & ARCHIVE_EXTRACT_SECURE_NODOTDOT) {
237+ fsobj_error(a_eno, a_estr,
238+ ARCHIVE_ERRNO_MISC,
239+ "Path contains ", "'..'");
240 return (ARCHIVE_FAILED);
241 }
242 }
243--
2442.7.4
245
diff --git a/meta/recipes-extended/libarchive/files/0002-Fix-extracting-hardlinks-over-symlinks.patch b/meta/recipes-extended/libarchive/files/0002-Fix-extracting-hardlinks-over-symlinks.patch
deleted file mode 100644
index 37418632f3..0000000000
--- a/meta/recipes-extended/libarchive/files/0002-Fix-extracting-hardlinks-over-symlinks.patch
+++ /dev/null
@@ -1,120 +0,0 @@
1From ece28103885a079a129a23c5001252a1648517af Mon Sep 17 00:00:00 2001
2From: Martin Matuska <martin@matuska.org>
3Date: Tue, 29 Nov 2016 16:55:41 +0100
4Subject: [PATCH 2/2] Fix extracting hardlinks over symlinks
5
6Closes #821
7
8Upstream-Status: Backported
9
10Signed-off-by: Amarnath Valluri <amarnath.valluri@intel.com>
11---
12 libarchive/archive_write_disk_posix.c | 43 +++++++++++++++++++++++++++++++++++
13 tar/test/test_symlink_dir.c | 18 ++++++++++++++-
14 2 files changed, 60 insertions(+), 1 deletion(-)
15
16diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
17index d786bc2..80b03cd 100644
18--- a/libarchive/archive_write_disk_posix.c
19+++ b/libarchive/archive_write_disk_posix.c
20@@ -2563,6 +2563,49 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, int
21 break;
22 }
23 tail[0] = c;
24+ } else if ((flags &
25+ ARCHIVE_EXTRACT_SECURE_SYMLINKS) == 0) {
26+ /*
27+ * We are not the last element and we want to
28+ * follow symlinks if they are a directory.
29+ *
30+ * This is needed to extract hardlinks over
31+ * symlinks.
32+ */
33+ r = stat(head, &st);
34+ if (r != 0) {
35+ tail[0] = c;
36+ if (errno == ENOENT) {
37+ break;
38+ } else {
39+ fsobj_error(a_eno, a_estr,
40+ errno,
41+ "Could not stat %s", path);
42+ res = (ARCHIVE_FAILED);
43+ break;
44+ }
45+ } else if (S_ISDIR(st.st_mode)) {
46+ if (chdir(head) != 0) {
47+ tail[0] = c;
48+ fsobj_error(a_eno, a_estr,
49+ errno,
50+ "Could not chdir %s", path);
51+ res = (ARCHIVE_FATAL);
52+ break;
53+ }
54+ /*
55+ * Our view is now from inside
56+ * this dir:
57+ */
58+ head = tail + 1;
59+ } else {
60+ tail[0] = c;
61+ fsobj_error(a_eno, a_estr, 0,
62+ "Cannot extract through "
63+ "symlink %s", path);
64+ res = ARCHIVE_FAILED;
65+ break;
66+ }
67 } else {
68 tail[0] = c;
69 fsobj_error(a_eno, a_estr, 0,
70diff --git a/tar/test/test_symlink_dir.c b/tar/test/test_symlink_dir.c
71index 25bd8b1..852e00b 100644
72--- a/tar/test/test_symlink_dir.c
73+++ b/tar/test/test_symlink_dir.c
74@@ -47,11 +47,18 @@ DEFINE_TEST(test_symlink_dir)
75 assertMakeDir("source/dir3", 0755);
76 assertMakeDir("source/dir3/d3", 0755);
77 assertMakeFile("source/dir3/f3", 0755, "abcde");
78+ assertMakeDir("source/dir4", 0755);
79+ assertMakeFile("source/dir4/file3", 0755, "abcdef");
80+ assertMakeHardlink("source/dir4/file4", "source/dir4/file3");
81
82 assertEqualInt(0,
83 systemf("%s -cf test.tar -C source dir dir2 dir3 file file2",
84 testprog));
85
86+ /* Second archive with hardlinks */
87+ assertEqualInt(0,
88+ systemf("%s -cf test2.tar -C source dir4", testprog));
89+
90 /*
91 * Extract with -x and without -P.
92 */
93@@ -118,9 +125,15 @@ DEFINE_TEST(test_symlink_dir)
94 assertMakeSymlink("dest2/file2", "real_file2");
95 assertEqualInt(0, systemf("%s -xPf test.tar -C dest2", testprog));
96
97- /* dest2/dir symlink should be followed */
98+ /* "dir4" is a symlink to existing "real_dir" */
99+ if (canSymlink())
100+ assertMakeSymlink("dest2/dir4", "real_dir");
101+ assertEqualInt(0, systemf("%s -xPf test2.tar -C dest2", testprog));
102+
103+ /* dest2/dir and dest2/dir4 symlinks should be followed */
104 if (canSymlink()) {
105 assertIsSymlink("dest2/dir", "real_dir");
106+ assertIsSymlink("dest2/dir4", "real_dir");
107 assertIsDir("dest2/real_dir", -1);
108 }
109
110@@ -141,4 +154,7 @@ DEFINE_TEST(test_symlink_dir)
111 /* dest2/file2 symlink should be removed */
112 failure("Symlink to non-existing file should be removed");
113 assertIsReg("dest2/file2", -1);
114+
115+ /* dest2/dir4/file3 and dest2/dir4/file4 should be hard links */
116+ assertIsHardlink("dest2/dir4/file3", "dest2/dir4/file4");
117 }
118--
1192.7.4
120
diff --git a/meta/recipes-extended/libarchive/files/non-recursive-extract-and-list.patch b/meta/recipes-extended/libarchive/files/non-recursive-extract-and-list.patch
deleted file mode 100644
index 61f8f3ec8d..0000000000
--- a/meta/recipes-extended/libarchive/files/non-recursive-extract-and-list.patch
+++ /dev/null
@@ -1,153 +0,0 @@
1From d6271709d2deb980804f92e75f9b5cb600dc42ed Mon Sep 17 00:00:00 2001
2From: Patrick Ohly <patrick.ohly@intel.com>
3Date: Mon, 24 Oct 2016 12:54:48 +0200
4Subject: [PATCH 1/2] non-recursive extract and list
5
6Sometimes it makes sense to extract or list a directory contained in
7an archive without also doing the same for the content of the
8directory, i.e. allowing -n (= --no-recursion) in combination with the
9x and t modes.
10
11bsdtar uses the match functionality in libarchive to track include
12matches. A new libarchive API call
13archive_match_include_directories_recursively() gets introduced to
14influence the matching behavior, with the default behavior as before.
15
16Non-recursive matching can be achieved by anchoring the path match at
17both start and end. Asking for a directory which itself isn't in the
18archive when in non-recursive mode is an error and handled by the
19existing mechanism for tracking unused inclusion entries.
20
21Upstream-Status: Submitted [https://github.com/libarchive/libarchive/pull/812]
22
23Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
24
25---
26 libarchive/archive.h | 2 ++
27 libarchive/archive_match.c | 30 +++++++++++++++++++++++++++++-
28 tar/bsdtar.1 | 3 +--
29 tar/bsdtar.c | 12 ++++++++++--
30 4 files changed, 42 insertions(+), 5 deletions(-)
31
32diff --git a/libarchive/archive.h b/libarchive/archive.h
33index ff401e9..38d8746 100644
34--- a/libarchive/archive.h
35+++ b/libarchive/archive.h
36@@ -1085,6 +1085,8 @@ __LA_DECL int archive_match_excluded(struct archive *,
37 */
38 __LA_DECL int archive_match_path_excluded(struct archive *,
39 struct archive_entry *);
40+/* Control recursive inclusion of directory content when directory is included. Default on. */
41+__LA_DECL int archive_match_include_directories_recursively(struct archive *, int _enabled);
42 /* Add exclusion pathname pattern. */
43 __LA_DECL int archive_match_exclude_pattern(struct archive *, const char *);
44 __LA_DECL int archive_match_exclude_pattern_w(struct archive *,
45diff --git a/libarchive/archive_match.c b/libarchive/archive_match.c
46index 0719cbd..6d03a65 100644
47--- a/libarchive/archive_match.c
48+++ b/libarchive/archive_match.c
49@@ -93,6 +93,9 @@ struct archive_match {
50 /* exclusion/inclusion set flag. */
51 int setflag;
52
53+ /* Recursively include directory content? */
54+ int recursive_include;
55+
56 /*
57 * Matching filename patterns.
58 */
59@@ -223,6 +226,7 @@ archive_match_new(void)
60 return (NULL);
61 a->archive.magic = ARCHIVE_MATCH_MAGIC;
62 a->archive.state = ARCHIVE_STATE_NEW;
63+ a->recursive_include = 1;
64 match_list_init(&(a->inclusions));
65 match_list_init(&(a->exclusions));
66 __archive_rb_tree_init(&(a->exclusion_tree), &rb_ops_mbs);
67@@ -471,6 +475,28 @@ archive_match_path_excluded(struct archive *_a,
68 }
69
70 /*
71+ * When recursive inclusion of directory content is enabled,
72+ * an inclusion pattern that matches a directory will also
73+ * include everything beneath that directory. Enabled by default.
74+ *
75+ * For compatibility with GNU tar, exclusion patterns always
76+ * match if a subset of the full patch matches (i.e., they are
77+ * are not rooted at the beginning of the path) and thus there
78+ * is no corresponding non-recursive exclusion mode.
79+ */
80+int
81+archive_match_include_directories_recursively(struct archive *_a, int _enabled)
82+{
83+ struct archive_match *a;
84+
85+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
86+ ARCHIVE_STATE_NEW, "archive_match_include_directories_recursively");
87+ a = (struct archive_match *)_a;
88+ a->recursive_include = _enabled;
89+ return (ARCHIVE_OK);
90+}
91+
92+/*
93 * Utilty functions to get statistic information for inclusion patterns.
94 */
95 int
96@@ -781,7 +807,9 @@ static int
97 match_path_inclusion(struct archive_match *a, struct match *m,
98 int mbs, const void *pn)
99 {
100- int flag = PATHMATCH_NO_ANCHOR_END;
101+ int flag = a->recursive_include ?
102+ PATHMATCH_NO_ANCHOR_END : /* Prefix match is good enough. */
103+ 0; /* Full match required. */
104 int r;
105
106 if (mbs) {
107diff --git a/tar/bsdtar.1 b/tar/bsdtar.1
108index 9eadaaf..f5d6457 100644
109--- a/tar/bsdtar.1
110+++ b/tar/bsdtar.1
111@@ -346,8 +346,7 @@ In extract or list modes, this option is ignored.
112 Do not extract modification time.
113 By default, the modification time is set to the time stored in the archive.
114 .It Fl n , Fl Fl norecurse , Fl Fl no-recursion
115-(c, r, u modes only)
116-Do not recursively archive the contents of directories.
117+Do not recursively archive (c, r, u), extract (x) or list (t) the contents of directories.
118 .It Fl Fl newer Ar date
119 (c, r, u modes only)
120 Only include files and directories newer than the specified date.
121diff --git a/tar/bsdtar.c b/tar/bsdtar.c
122index 93bf60a..001d5ed 100644
123--- a/tar/bsdtar.c
124+++ b/tar/bsdtar.c
125@@ -738,8 +738,6 @@ main(int argc, char **argv)
126 break;
127 }
128 }
129- if (bsdtar->option_no_subdirs)
130- only_mode(bsdtar, "-n", "cru");
131 if (bsdtar->option_stdout)
132 only_mode(bsdtar, "-O", "xt");
133 if (bsdtar->option_unlink_first)
134@@ -788,6 +786,16 @@ main(int argc, char **argv)
135 only_mode(bsdtar, buff, "cru");
136 }
137
138+ /*
139+ * When creating an archive from a directory tree, the directory
140+ * walking code will already avoid entering directories when
141+ * recursive inclusion of directory content is disabled, therefore
142+ * changing the matching behavior has no effect for creation modes.
143+ * It is relevant for extraction or listing.
144+ */
145+ archive_match_include_directories_recursively(bsdtar->matching,
146+ !bsdtar->option_no_subdirs);
147+
148 /* Filename "-" implies stdio. */
149 if (strcmp(bsdtar->filename, "-") == 0)
150 bsdtar->filename = NULL;
151--
1522.1.4
153