This is an automated email from the ASF dual-hosted git repository.

bodewig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git


The following commit(s) were added to refs/heads/master by this push:
     new 02dbe7b  only update name, wnen present in PAX header, deal with 
non-numbers in header
02dbe7b is described below

commit 02dbe7bb52d541271c3048728c156ca2f1034bc0
Author: Stefan Bodewig <bode...@apache.org>
AuthorDate: Sun May 2 17:16:20 2021 +0200

    only update name, wnen present in PAX header, deal with non-numbers in 
header
---
 .../compress/archivers/tar/TarArchiveEntry.java    | 41 ++++++++++++++++------
 .../archivers/tar/TarArchiveInputStream.java       |  3 +-
 .../commons/compress/archivers/tar/TarFile.java    |  3 +-
 3 files changed, 34 insertions(+), 13 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
index f2205c1..e49e180 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
@@ -1298,8 +1298,12 @@ public class TarArchiveEntry implements ArchiveEntry, 
TarConstants, EntryStreamO
      * @param value value of header.
      * @since 1.15
      */
-    public void addPaxHeader(final String name,final String value) {
-         processPaxHeader(name,value);
+    public void addPaxHeader(final String name, final String value) {
+        try {
+            processPaxHeader(name,value);
+        } catch (IOException ex) {
+            throw new IllegalArgumentException("Invalid input", ex);
+        }
     }
 
     /**
@@ -1317,7 +1321,7 @@ public class TarArchiveEntry implements ArchiveEntry, 
TarConstants, EntryStreamO
      * @param headers
      * @since 1.15
      */
-    void updateEntryFromPaxHeaders(final Map<String, String> headers) {
+    void updateEntryFromPaxHeaders(final Map<String, String> headers) throws 
IOException {
         for (final Map.Entry<String, String> ent : headers.entrySet()) {
             final String key = ent.getKey();
             final String val = ent.getValue();
@@ -1332,8 +1336,8 @@ public class TarArchiveEntry implements ArchiveEntry, 
TarConstants, EntryStreamO
      * @param val
      * @since 1.15
      */
-    private void processPaxHeader(final String key, final String val) {
-        processPaxHeader(key,val,extraPaxHeaders);
+    private void processPaxHeader(final String key, final String val) throws 
IOException {
+        processPaxHeader(key, val, extraPaxHeaders);
     }
 
     /**
@@ -1346,7 +1350,8 @@ public class TarArchiveEntry implements ArchiveEntry, 
TarConstants, EntryStreamO
      * @throws NumberFormatException  if encountered errors when parsing the 
numbers
      * @since 1.15
      */
-    private void processPaxHeader(final String key, final String val, final 
Map<String, String> headers) {
+    private void processPaxHeader(final String key, final String val, final 
Map<String, String> headers)
+        throws IOException {
     /*
      * The following headers are defined for Pax.
      * atime, ctime, charset: cannot use these without changing 
TarArchiveEntry fields
@@ -1749,17 +1754,31 @@ public class TarArchiveEntry implements ArchiveEntry, 
TarConstants, EntryStreamO
         }
     }
 
-    void fillGNUSparse1xData(final Map<String, String> headers) {
+    void fillGNUSparse1xData(final Map<String, String> headers) throws 
IOException {
         paxGNUSparse = true;
         paxGNU1XSparse = true;
-        realSize = Integer.parseInt(headers.get("GNU.sparse.realsize"));
-        name = headers.get("GNU.sparse.name");
+        if (headers.containsKey("GNU.sparse.name")) {
+            name = headers.get("GNU.sparse.name");
+        }
+        if (headers.containsKey("GNU.sparse.realsize")) {
+            try {
+                realSize = 
Integer.parseInt(headers.get("GNU.sparse.realsize"));
+            } catch (NumberFormatException ex) {
+                throw new IOException("Corrupted TAR archive. 
GNU.sparse.realsize header for "
+                    + name + " contains non-numeric value");
+            }
+        }
     }
 
-    void fillStarSparseData(final Map<String, String> headers) {
+    void fillStarSparseData(final Map<String, String> headers) throws 
IOException {
         starSparse = true;
         if (headers.containsKey("SCHILY.realsize")) {
-            realSize = Long.parseLong(headers.get("SCHILY.realsize"));
+            try {
+                realSize = Long.parseLong(headers.get("SCHILY.realsize"));
+            } catch (NumberFormatException ex) {
+                throw new IOException("Corrupted TAR archive. SCHILY.realsize 
header for "
+                    + name + " contains non-numeric value");
+            }
         }
     }
 }
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index 63b9109..7ff96eb 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -625,7 +625,8 @@ public class TarArchiveInputStream extends 
ArchiveInputStream {
         buildSparseInputStreams();
     }
 
-    private void applyPaxHeadersToCurrentEntry(final Map<String, String> 
headers, final List<TarArchiveStructSparse> sparseHeaders) {
+    private void applyPaxHeadersToCurrentEntry(final Map<String, String> 
headers, final List<TarArchiveStructSparse> sparseHeaders)
+        throws IOException {
         currEntry.updateEntryFromPaxHeaders(headers);
         currEntry.setSparseHeaders(sparseHeaders);
     }
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
index 378d4a5..8de9260 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
@@ -377,7 +377,8 @@ public class TarFile implements Closeable {
      * @param headers Headers read from the pax header
      * @param sparseHeaders Sparse headers read from pax header
      */
-    private void applyPaxHeadersToCurrentEntry(final Map<String, String> 
headers, final List<TarArchiveStructSparse> sparseHeaders) {
+    private void applyPaxHeadersToCurrentEntry(final Map<String, String> 
headers, final List<TarArchiveStructSparse> sparseHeaders)
+        throws IOException {
         currEntry.updateEntryFromPaxHeaders(headers);
         currEntry.setSparseHeaders(sparseHeaders);
     }

Reply via email to