summaryrefslogtreecommitdiff
path: root/core/libarchive/libarchive-3.0.x-fix-mtree-writer.patch
blob: dbc89686aa566e0826a78e45c9f9180eb54acf7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--- a/libarchive/archive_write_set_format_mtree.c
+++ b/libarchive/archive_write_set_format_mtree.c
@@ -887,6 +887,19 @@ write_entry(struct archive_write *a, struct mtree_entry *me)
 
 	archive_string_empty(&mtree->ebuf);
 	str = (mtree->indent)? &mtree->ebuf : &mtree->buf;
+
+	/* If the pathname does not have a path separator, we have to
+	 * add "./" to the head of the pathename because mtree reader
+	 * will suppose that it is v1(a.k.a classic) mtree format and
+	 * change the directory unexpectedly and so it will make a wrong
+	 * path. */
+	if (strchr(me->pathname, '/') == NULL &&
+	    strcmp(me->pathname, ".") != 0) {
+		archive_strcat(str, "./");
+	}
+	/* mtree reader does not accept an absolute path. */
+	else if (me->pathname[0] == '/')
+		archive_strappend_char(str, '.');
 	mtree_quote(str, me->pathname);
 	keys = get_keys(mtree, me);
 	if ((keys & F_NLINK) != 0 &&
--- a/libarchive/test/test_read_format_mtree.c
+++ b/libarchive/test/test_read_format_mtree.c
@@ -37,7 +37,8 @@ test_read_format_mtree1(void)
 	 * without relying on overflow.  This assumes that long long
 	 * is at least 64 bits. */
 	static const long long max_int64 = ((((long long)1) << 62) - 1) + (((long long)1) << 62);
-	time_t min_time, t;
+	time_t min_time;
+	volatile time_t t;
 
 	extract_reference_file(reffile);