From 20aac083b9cc84ea7da48b8c038307c09b4019f7 Mon Sep 17 00:00:00 2001
From: aschaich <108736614+aschaich@users.noreply.github.com>
Date: Wed, 28 Sep 2022 16:41:38 +0000
Subject: [PATCH] [commons-bcel] Initial integration (#8544)
---
projects/apache-commons-bcel/Dockerfile | 33 ++++++++
projects/apache-commons-bcel/build.sh | 75 +++++++++++++++++++
projects/apache-commons-bcel/pom.xml | 58 ++++++++++++++
projects/apache-commons-bcel/project.yaml | 14 ++++
projects/apache-commons-bcel/remove-rat.diff | 11 +++
.../src/main/java/ossfuzz/BcelFuzzer.java | 49 ++++++++++++
6 files changed, 240 insertions(+)
create mode 100644 projects/apache-commons-bcel/Dockerfile
create mode 100644 projects/apache-commons-bcel/build.sh
create mode 100644 projects/apache-commons-bcel/pom.xml
create mode 100644 projects/apache-commons-bcel/project.yaml
create mode 100644 projects/apache-commons-bcel/remove-rat.diff
create mode 100644 projects/apache-commons-bcel/src/main/java/ossfuzz/BcelFuzzer.java
diff --git a/projects/apache-commons-bcel/Dockerfile b/projects/apache-commons-bcel/Dockerfile
new file mode 100644
index 000000000..9fe174437
--- /dev/null
+++ b/projects/apache-commons-bcel/Dockerfile
@@ -0,0 +1,33 @@
+# Copyright 2022 Google LLC
+#
+# Licensed 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.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder-jvm
+
+RUN curl -L https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip -o maven.zip && \
+unzip maven.zip -d $SRC/maven && \
+rm -rf maven.zip
+
+ENV MVN $SRC/maven/apache-maven-3.6.3/bin/mvn
+
+WORKDIR ${SRC}
+#
+# clone repository
+#
+RUN git clone https://github.com/apache/commons-bcel.git
+
+ADD pom.xml build.sh ${SRC}/
+ADD src/ ${SRC}/src/
+WORKDIR ${SRC}/commons-bcel
\ No newline at end of file
diff --git a/projects/apache-commons-bcel/build.sh b/projects/apache-commons-bcel/build.sh
new file mode 100644
index 000000000..7a563926f
--- /dev/null
+++ b/projects/apache-commons-bcel/build.sh
@@ -0,0 +1,75 @@
+#!/bin/bash -eu
+# Copyright 2022 Google LLC
+#
+# Licensed 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.
+#
+################################################################################
+
+MVN_FLAGS="-Djavac.src.version=15 -Djavac.target.version=15 -DskipTests"
+ALL_JARS=""
+
+# Install the build servers' jazzer-api into the maven repository.
+pushd "/tmp"
+ ${MVN} install:install-file -Dfile=${JAZZER_API_PATH} \
+ -DgroupId="com.code-intelligence" \
+ -DartifactId="jazzer-api" \
+ -Dversion="0.12.0" \
+ -Dpackaging=jar
+popd
+
+pushd "${SRC}/commons-bcel"
+ ${MVN} package ${MVN_FLAGS}
+ ${MVN} install ${MVN_FLAGS}
+ CURRENT_VERSION=$(${MVN} org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate \
+ -Dexpression=project.version -q -DforceStdout)
+popd
+
+pushd ${SRC}
+ ${MVN} package -DbcelVersion="${CURRENT_VERSION}" ${MVN_FLAGS}
+ install -v target/bcel-fuzzer-${CURRENT_VERSION}.jar ${OUT}/bcel-fuzzer-${CURRENT_VERSION}.jar
+ ALL_JARS="${ALL_JARS} bcel-fuzzer-${CURRENT_VERSION}.jar"
+popd
+
+
+
+# The classpath at build-time includes the project jars in $OUT as well as the
+# Jazzer API.
+BUILD_CLASSPATH=$(echo $ALL_JARS | xargs printf -- "$OUT/%s:"):$JAZZER_API_PATH
+
+# All .jar and .class files lie in the same directory as the fuzzer at runtime.
+RUNTIME_CLASSPATH=$(echo $ALL_JARS | xargs printf -- "\$this_dir/%s:"):\$this_dir
+
+MVN_FUZZERS_PREFIX="src/main/java"
+
+for fuzzer in $(find ${SRC} -name '*Fuzzer.java'); do
+ stripped_path=$(echo ${fuzzer} | sed 's|^.*src/main/java/\(.*\).java$|\1|');
+ # The .java suffix was stripped by sed.
+ if (echo ${stripped_path} | grep ".java$"); then
+ continue;
+ fi
+
+ fuzzer_basename=$(basename -s .java $fuzzer)
+ fuzzer_classname=$(echo ${stripped_path} | sed 's|/|.|g');
+
+ # Create an execution wrapper that executes Jazzer with the correct arguments.
+ echo "#!/bin/sh
+# LLVMFuzzerTestOneInput for fuzzer detection.
+this_dir=\$(dirname \"\$0\")
+LD_LIBRARY_PATH=\"$JVM_LD_LIBRARY_PATH\":\$this_dir \
+\$this_dir/jazzer_driver --agent_path=\$this_dir/jazzer_agent_deploy.jar \
+--cp=${RUNTIME_CLASSPATH} \
+--target_class=${fuzzer_classname} \
+--jvm_args=\"-Xmx2048m\" \
+\$@" > $OUT/${fuzzer_basename}
+ chmod u+x $OUT/${fuzzer_basename}
+done
diff --git a/projects/apache-commons-bcel/pom.xml b/projects/apache-commons-bcel/pom.xml
new file mode 100644
index 000000000..a25098182
--- /dev/null
+++ b/projects/apache-commons-bcel/pom.xml
@@ -0,0 +1,58 @@
+
+ 4.0.0
+
+ ossfuzz
+ bcel-fuzzer
+ ${bcelVersion}
+ jar
+
+
+ 15
+ 15
+ UTF-8
+ ossfuzz.BcelFuzzer
+
+
+
+
+
+ com.code-intelligence
+ jazzer-api
+ 0.12.0
+
+
+ org.apache.bcel
+ bcel
+ ${bcelVersion}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.3.0
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/apache-commons-bcel/project.yaml b/projects/apache-commons-bcel/project.yaml
new file mode 100644
index 000000000..6147614b3
--- /dev/null
+++ b/projects/apache-commons-bcel/project.yaml
@@ -0,0 +1,14 @@
+homepage: "https://commons.apache.org/proper/commons-bcel/"
+language: jvm
+main_repo: "https://github.com/apache/commons-bcel.git"
+fuzzing_engines:
+ - libfuzzer
+sanitizers:
+ - address
+vendor_ccs:
+ - "wagner@code-intelligence.com"
+ - "yakdan@code-intelligence.com"
+ - "glendowne@code-intelligence.com"
+ - "patrice.salathe@code-intelligence.com"
+ - "hlin@code-intelligence.com"
+ - "schaich@code-intelligence.com"
\ No newline at end of file
diff --git a/projects/apache-commons-bcel/remove-rat.diff b/projects/apache-commons-bcel/remove-rat.diff
new file mode 100644
index 000000000..cd410aa94
--- /dev/null
+++ b/projects/apache-commons-bcel/remove-rat.diff
@@ -0,0 +1,11 @@
+--- a/pom.xml
++++ b/pom.xml
+@@ -361,7 +361,7 @@
+
+
+
+- clean apache-rat:check checkstyle:check verify javadoc:javadoc
++ clean checkstyle:check verify javadoc:javadoc
+
+
+ org.apache.felix
diff --git a/projects/apache-commons-bcel/src/main/java/ossfuzz/BcelFuzzer.java b/projects/apache-commons-bcel/src/main/java/ossfuzz/BcelFuzzer.java
new file mode 100644
index 000000000..2767654fb
--- /dev/null
+++ b/projects/apache-commons-bcel/src/main/java/ossfuzz/BcelFuzzer.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed 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 ossfuzz;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import com.code_intelligence.jazzer.api.FuzzedDataProvider;
+
+import org.apache.bcel.classfile.*;
+
+public class BcelFuzzer {
+
+ BcelFuzzer(FuzzedDataProvider fuzzedDataProvider) {
+
+ }
+
+ void test(FuzzedDataProvider fuzzedDataProvider) throws Exception {
+ var m_string = fuzzedDataProvider.consumeString(10);
+ var m_byte = fuzzedDataProvider.consumeRemainingAsBytes();
+ try {
+ new ClassParser(new ByteArrayInputStream(m_byte), m_string).parse();
+ } catch (IOException e) {
+ // documented ignore
+ } catch (ClassFormatException e) {
+ // documented ignore
+ }
+ }
+
+ public static void fuzzerTestOneInput(FuzzedDataProvider fuzzedDataProvider) throws Exception {
+ BcelFuzzer testClosure = new BcelFuzzer(fuzzedDataProvider);
+
+ testClosure.test(fuzzedDataProvider);
+ }
+}
\ No newline at end of file