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); }