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

ggregory 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 666e787  Address CodeQL issues in pack200/unpack200 packages.
666e787 is described below

commit 666e787a17e4e7321b70e99e55acf27b6382ab17
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Tue Feb 8 20:59:31 2022 -0500

    Address CodeQL issues in pack200/unpack200 packages.
    
    Throw ArithmeticExceptioninstead of silently overflowing.
---
 .../compress/archivers/cpio/CpioArchiveEntry.java  |  3 +-
 .../compress/harmony/pack200/BHSDCodec.java        |  6 ++-
 .../compress/harmony/pack200/FileBands.java        |  3 +-
 .../commons/compress/harmony/pack200/RunCodec.java |  8 ++--
 .../compress/harmony/unpack200/BandSet.java        |  3 +-
 .../apache/commons/compress/utils/ExactMath.java   | 44 ++++++++++++++++++++++
 6 files changed, 59 insertions(+), 8 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java
 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java
index 57c77f5..5e5e7ad 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java
@@ -30,6 +30,7 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.utils.ExactMath;
 
 /**
  * A cpio archive consists of a sequence of files. There are several types of
@@ -572,7 +573,7 @@ public class CpioArchiveEntry implements CpioConstants, 
ArchiveEntry {
         }
         int size = this.headerSize + 1; // Name has terminating null
         if (name != null) {
-            size += nameSize;
+            size = ExactMath.add(size, nameSize);
         }
         final int remain = size % this.alignmentBoundary;
         if (remain > 0) {
diff --git 
a/src/main/java/org/apache/commons/compress/harmony/pack200/BHSDCodec.java 
b/src/main/java/org/apache/commons/compress/harmony/pack200/BHSDCodec.java
index 8bd7020..5117481 100644
--- a/src/main/java/org/apache/commons/compress/harmony/pack200/BHSDCodec.java
+++ b/src/main/java/org/apache/commons/compress/harmony/pack200/BHSDCodec.java
@@ -22,6 +22,8 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.compress.utils.ExactMath;
+
 /**
  * A BHSD codec is a means of encoding integer values as a sequence of bytes 
or vice versa using a specified "BHSD"
  * encoding mechanism. It uses a variable-length encoding and a modified sign 
representation such that small numbers are
@@ -243,7 +245,7 @@ public final class BHSDCodec extends Codec {
                     band[i] -= cardinality;
                 }
                 while (band[i] < smallest) {
-                    band[i] += cardinality;
+                    band[i] = ExactMath.add(band[i], cardinality);
                 }
             }
         }
@@ -260,7 +262,7 @@ public final class BHSDCodec extends Codec {
                     band[i] -= cardinality;
                 }
                 while (band[i] < smallest) {
-                    band[i] += cardinality;
+                    band[i] = ExactMath.add(band[i], cardinality);
                 }
             }
         }
diff --git 
a/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java 
b/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java
index 746b900..a394978 100644
--- a/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java
+++ b/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java
@@ -25,6 +25,7 @@ import java.util.TimeZone;
 
 import org.apache.commons.compress.harmony.pack200.Archive.PackingFile;
 import org.apache.commons.compress.harmony.pack200.Archive.SegmentUnit;
+import org.apache.commons.compress.utils.ExactMath;
 import org.objectweb.asm.ClassReader;
 
 /**
@@ -86,7 +87,7 @@ public class FileBands extends BandSet {
             }
             final byte[] bytes = packingFile.getContents();
             file_size[i] = bytes.length;
-            totalSize += file_size[i];
+            totalSize = ExactMath.add(totalSize, file_size[i]);
 
             // update modification time
             modtime = (packingFile.getModtime() + 
TimeZone.getDefault().getRawOffset()) / 1000L;
diff --git 
a/src/main/java/org/apache/commons/compress/harmony/pack200/RunCodec.java 
b/src/main/java/org/apache/commons/compress/harmony/pack200/RunCodec.java
index 41a07c3..f14b822 100644
--- a/src/main/java/org/apache/commons/compress/harmony/pack200/RunCodec.java
+++ b/src/main/java/org/apache/commons/compress/harmony/pack200/RunCodec.java
@@ -20,6 +20,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
 
+import org.apache.commons.compress.utils.ExactMath;
+
 /**
  * A run codec is a grouping of two nested codecs; K values are decoded from 
the first codec, and the remaining codes
  * are decoded from the remaining codec. Note that since this codec maintains 
state, the instances are not reusable.
@@ -68,7 +70,7 @@ public class RunCodec extends Codec {
                     value -= cardinality;
                 }
                 while (value < bhsd.smallest()) {
-                    value += cardinality;
+                    value = ExactMath.add(value, cardinality);
                 }
             }
         }
@@ -98,7 +100,7 @@ public class RunCodec extends Codec {
                         band[i] -= cardinality;
                     }
                     while (band[i] < bhsd.smallest()) {
-                        band[i] += cardinality;
+                        band[i] = ExactMath.add(band[i], cardinality);
                     }
                 }
             }
@@ -117,7 +119,7 @@ public class RunCodec extends Codec {
                             band[i] -= cardinality;
                         }
                         while (band[i] < bhsd.smallest()) {
-                            band[i] += cardinality;
+                            band[i] = ExactMath.add(band[i], cardinality);
                         }
                     }
                 }
diff --git 
a/src/main/java/org/apache/commons/compress/harmony/unpack200/BandSet.java 
b/src/main/java/org/apache/commons/compress/harmony/unpack200/BandSet.java
index 5818623..55c26c0 100644
--- a/src/main/java/org/apache/commons/compress/harmony/unpack200/BandSet.java
+++ b/src/main/java/org/apache/commons/compress/harmony/unpack200/BandSet.java
@@ -36,6 +36,7 @@ import 
org.apache.commons.compress.harmony.unpack200.bytecode.CPMethodRef;
 import org.apache.commons.compress.harmony.unpack200.bytecode.CPNameAndType;
 import org.apache.commons.compress.harmony.unpack200.bytecode.CPString;
 import org.apache.commons.compress.harmony.unpack200.bytecode.CPUTF8;
+import org.apache.commons.compress.utils.ExactMath;
 
 /**
  * Abstract superclass for a set of bands
@@ -118,7 +119,7 @@ public abstract class BandSet {
                         band[i] -= cardinality;
                     }
                     while (band[i] < bhsd.smallest()) {
-                        band[i] += cardinality;
+                        band[i] = ExactMath.add(band[i], cardinality);
                     }
                 }
             }
diff --git a/src/main/java/org/apache/commons/compress/utils/ExactMath.java 
b/src/main/java/org/apache/commons/compress/utils/ExactMath.java
new file mode 100644
index 0000000..860aa0d
--- /dev/null
+++ b/src/main/java/org/apache/commons/compress/utils/ExactMath.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.commons.compress.utils;
+
+/**
+ * PRIVATE.
+ *
+ * Performs exact math through {@link Math} "exact" APIs.
+ */
+public class ExactMath {
+
+    private ExactMath() {
+        // no instances
+    }
+
+    /**
+     * Adds two values and throws an exception on overflow.
+     *
+     * @param intValue the first value.
+     * @param longValue the second value.
+     * @return addition of both values.
+     * @throws ArithmeticException when there is an overflow.
+     */
+    public static int add(final int intValue, final long longValue) {
+        return Math.addExact(intValue, Math.toIntExact(longValue));
+    }
+}

Reply via email to