76 lines
2.4 KiB
Diff
76 lines
2.4 KiB
Diff
From 3c2a2cd94d3b062aa5bf850b82364039ec9c6029 Mon Sep 17 00:00:00 2001
|
|
From: Sergey Poznyakoff <gray@gnu.org>
|
|
Date: Fri, 21 Dec 2018 14:18:14 +0200
|
|
Subject: [PATCH 38/58] Disallow modifications to the global pax extended
|
|
header in update mode.
|
|
|
|
Updating global headers in update mode is not possible, because:
|
|
|
|
1) If the original archive was not in PAX format, writing the
|
|
global header would overwrite first member header (and eventually
|
|
data blocks) in the archive.
|
|
2) Otherwise, using the --pax-option can make the updated header
|
|
occupy more blocks than the original one, which would lead to the
|
|
same effect as in 1.
|
|
|
|
This also fixes
|
|
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00007.html
|
|
|
|
* src/xheader.c (xheader_forbid_global): New function.
|
|
* src/common.h (xheader_forbid_global): New prototype.
|
|
* src/update.c (update_archive): Use xheader_forbid_global, instead
|
|
of trying to write global extended header record.
|
|
---
|
|
src/common.h | 1 +
|
|
src/update.c | 2 +-
|
|
src/xheader.c | 8 ++++++++
|
|
3 files changed, 10 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/common.h b/src/common.h
|
|
index 32e6f8b..885169f 100644
|
|
--- a/src/common.h
|
|
+++ b/src/common.h
|
|
@@ -836,6 +836,7 @@ void xheader_store (char const *keyword, struct tar_stat_info *st,
|
|
void xheader_read (struct xheader *xhdr, union block *header, off_t size);
|
|
void xheader_write (char type, char *name, time_t t, struct xheader *xhdr);
|
|
void xheader_write_global (struct xheader *xhdr);
|
|
+void xheader_forbid_global (void);
|
|
void xheader_finish (struct xheader *hdr);
|
|
void xheader_destroy (struct xheader *hdr);
|
|
char *xheader_xhdr_name (struct tar_stat_info *st);
|
|
diff --git a/src/update.c b/src/update.c
|
|
index 2f823e4..4aa4ac6 100644
|
|
--- a/src/update.c
|
|
+++ b/src/update.c
|
|
@@ -111,7 +111,7 @@ update_archive (void)
|
|
|
|
name_gather ();
|
|
open_archive (ACCESS_UPDATE);
|
|
- buffer_write_global_xheader ();
|
|
+ xheader_forbid_global ();
|
|
|
|
while (!found_end)
|
|
{
|
|
diff --git a/src/xheader.c b/src/xheader.c
|
|
index e938502..010cab7 100644
|
|
--- a/src/xheader.c
|
|
+++ b/src/xheader.c
|
|
@@ -469,6 +469,14 @@ xheader_write_global (struct xheader *xhdr)
|
|
}
|
|
}
|
|
|
|
+/* Forbid modifications of the global extended header */
|
|
+void
|
|
+xheader_forbid_global (void)
|
|
+{
|
|
+ if (keyword_global_override_list)
|
|
+ USAGE_ERROR ((0, 0, _("can't update global extended header record")));
|
|
+}
|
|
+
|
|
void
|
|
xheader_xattr_init (struct tar_stat_info *st)
|
|
{
|
|
--
|
|
2.19.1
|
|
|