Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .clusterfuzzlite/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
FROM gcr.io/oss-fuzz-base/base-builder

# Enhanced ClusterFuzzLite Dockerfile
# Combined Address + Undefined Sanitizers with Full Instrumentation
# Improved Stack Tracing, Metrics Capture, and Reporting

RUN apt-get update && apt-get install -y \
cmake \
libxml2-dev \
libpng-dev \
libjpeg-turbo8-dev \
libtiff-dev \
nlohmann-json3-dev \
&& rm -rf /var/lib/apt/lists/*

COPY . $SRC/uci
WORKDIR $SRC/uci
COPY .clusterfuzzlite/build.sh $SRC/
239 changes: 239 additions & 0 deletions .clusterfuzzlite/build-full.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#!/bin/bash -eu
#
#
# Last Updated: 08-FEB-2026 at 0700Z by David Hoyt
#
# Changes: Add WASM Toolchain, CFL & libFuzzer
#
#


echo "ClusterFuzzLite Build - (Address+UBSan)"
echo ""

# Determine repository root (CFL vs local)
if [ -d "$SRC/uci" ]; then
REPO_ROOT="$SRC/uci"
echo "Environment: ClusterFuzzLite"
else
REPO_ROOT="$SRC"
echo "Environment: Local testing"
fi

echo "Repository root: $REPO_ROOT"
echo "Fuzzing source: Testing/Fuzzing/"
echo "Target: 15 fuzzers (13 core + 2 XML)"
echo "Sanitizers: Address + Undefined (combined)"
echo "Instrumentation: Full (stack tracing, symbolization, metrics)"
echo ""

# Build IccProfLib and IccXML libraries
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Building libraries..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

BUILD_DIR="$REPO_ROOT/Build/Cmake/build_cfl_$(date +%s)"
cd $REPO_ROOT/Build/Cmake

# Clean previous builds
rm -rf build_cfl_* CMakeCache.txt Makefile *.cmake CMakeFiles/ 2>/dev/null || true

# Comment out wxWidgets section in CMakeLists.txt (not available in CFL Docker image)
echo "Patching CMakeLists.txt to disable wxWidgets..."
sed -i '1162,1170s/^/# DISABLED_FOR_CFL: /' CMakeLists.txt

# Configure CMake
cmake -B $BUILD_DIR -S . \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS="$CFLAGS" \
-DCMAKE_CXX_FLAGS="$CXXFLAGS -frtti" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DBUILD_SHARED_LIBS=OFF

# Build libraries
echo "Building IccProfLib2-static..."
cmake --build $BUILD_DIR --target IccProfLib2-static -j$(nproc)

echo "Building IccXML2-static..."
cmake --build $BUILD_DIR --target IccXML2-static -j$(nproc) || echo "Warning: IccXML build may have failed"

# Verify library existence
if [ ! -f "$BUILD_DIR/IccProfLib/libIccProfLib2-static.a" ]; then
echo "ERROR: IccProfLib2-static.a not found"
exit 1
fi

echo "✅ Libraries built successfully"
echo ""

# Build fuzzers from Testing/Fuzzing/
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Building fuzzers (15 total)..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

FUZZING_DIR="$REPO_ROOT/Testing/Fuzzing"
FUZZER_COUNT=0

# Core fuzzers (13)
CORE_FUZZERS=(
"icc_profile_fuzzer"
"icc_calculator_fuzzer"
"icc_v5dspobs_fuzzer"
"icc_multitag_fuzzer"
"icc_roundtrip_fuzzer"
"icc_dump_fuzzer"
"icc_io_fuzzer"
"icc_link_fuzzer"
"icc_spectral_fuzzer"
"icc_apply_fuzzer"
"icc_applyprofiles_fuzzer"
"icc_specsep_fuzzer"
"icc_tiffdump_fuzzer"
)

# Build core fuzzers
for fuzzer in "${CORE_FUZZERS[@]}"; do
if [ ! -f "$FUZZING_DIR/${fuzzer}.cpp" ]; then
echo "⚠️ Skipping $fuzzer (source not found)"
continue
fi

echo "Building $fuzzer..."

$CXX $CXXFLAGS -frtti \
-I$REPO_ROOT/IccProfLib \
-I$REPO_ROOT/Tools/CmdLine/IccCommon \
-I$REPO_ROOT/Tools/CmdLine/IccApplyProfiles \
$FUZZING_DIR/${fuzzer}.cpp \
$BUILD_DIR/IccProfLib/libIccProfLib2-static.a \
$LIB_FUZZING_ENGINE \
-o $OUT/${fuzzer} 2>&1 | head -3 || {
echo "⚠️ Build failed for $fuzzer"
continue
}

if [ -f "$OUT/${fuzzer}" ]; then
((FUZZER_COUNT++))

# Copy seed corpus
mkdir -p $OUT/${fuzzer}_seed_corpus
if [ -d "$FUZZING_DIR/${fuzzer}_seed_corpus" ]; then
cp $FUZZING_DIR/${fuzzer}_seed_corpus/*.icc $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi

# Fallback to .clusterfuzzlite corpus
if [ $(ls $OUT/${fuzzer}_seed_corpus/*.icc 2>/dev/null | wc -l) -eq 0 ]; then
cp $REPO_ROOT/.clusterfuzzlite/corpus/*.icc $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi

CORPUS_COUNT=$(ls $OUT/${fuzzer}_seed_corpus/*.icc 2>/dev/null | wc -l)

# Copy dictionary if exists
DICT_FILE=""
if [ -f "$FUZZING_DIR/${fuzzer}.dict" ]; then
cp $FUZZING_DIR/${fuzzer}.dict $OUT/${fuzzer}.dict
DICT_FILE="${fuzzer}.dict"
elif [ -f "$FUZZING_DIR/icc_profile.dict" ]; then
cp $FUZZING_DIR/icc_profile.dict $OUT/${fuzzer}.dict
DICT_FILE="icc_profile.dict"
fi

# Copy .options file if exists
OPTIONS_FILE=""
if [ -f "$FUZZING_DIR/${fuzzer}.options" ]; then
cp $FUZZING_DIR/${fuzzer}.options $OUT/${fuzzer}.options
OPTIONS_FILE="${fuzzer}.options"
fi

echo " ✅ $fuzzer: $CORPUS_COUNT seeds, dict: ${DICT_FILE:-none}, options: ${OPTIONS_FILE:-none}"
fi
done

# Build XML fuzzers (2)
if [ -f "$BUILD_DIR/IccXML/libIccXML2-static.a" ]; then
echo ""
echo "Building XML fuzzers..."

for fuzzer in "icc_fromxml_fuzzer" "icc_toxml_fuzzer"; do
if [ ! -f "$FUZZING_DIR/${fuzzer}.cpp" ]; then
echo "⚠️ Skipping $fuzzer (source not found)"
continue
fi

echo "Building $fuzzer..."

$CXX $CXXFLAGS -frtti \
-I$REPO_ROOT/IccProfLib \
-I$REPO_ROOT/IccXML/IccLibXML \
-I/usr/include/libxml2 \
-DHAVE_ICCXML \
$FUZZING_DIR/${fuzzer}.cpp \
$BUILD_DIR/IccXML/libIccXML2-static.a \
$BUILD_DIR/IccProfLib/libIccProfLib2-static.a \
-lxml2 \
$LIB_FUZZING_ENGINE \
-o $OUT/${fuzzer} 2>&1 | head -3 || {
echo "⚠️ Build failed for $fuzzer"
continue
}

if [ -f "$OUT/${fuzzer}" ]; then
((FUZZER_COUNT++))

# Copy appropriate seed corpus
mkdir -p $OUT/${fuzzer}_seed_corpus

if [ "$fuzzer" = "icc_fromxml_fuzzer" ]; then
# XML files for fromxml
if [ -d "$FUZZING_DIR/${fuzzer}_seed_corpus" ]; then
cp $FUZZING_DIR/${fuzzer}_seed_corpus/*.xml $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi
# Fallback to .clusterfuzzlite
if [ $(ls $OUT/${fuzzer}_seed_corpus/*.xml 2>/dev/null | wc -l) -eq 0 ]; then
cp $REPO_ROOT/.clusterfuzzlite/corpus-xml/*.xml $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi
CORPUS_COUNT=$(ls $OUT/${fuzzer}_seed_corpus/*.xml 2>/dev/null | wc -l)
else
# ICC files for toxml
if [ -d "$FUZZING_DIR/${fuzzer}_seed_corpus" ]; then
cp $FUZZING_DIR/${fuzzer}_seed_corpus/*.icc $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi
if [ $(ls $OUT/${fuzzer}_seed_corpus/*.icc 2>/dev/null | wc -l) -eq 0 ]; then
cp $REPO_ROOT/.clusterfuzzlite/corpus/*.icc $OUT/${fuzzer}_seed_corpus/ 2>/dev/null || true
fi
CORPUS_COUNT=$(ls $OUT/${fuzzer}_seed_corpus/*.icc 2>/dev/null | wc -l)
fi

# Copy dictionary
DICT_FILE=""
if [ -f "$FUZZING_DIR/${fuzzer}.dict" ]; then
cp $FUZZING_DIR/${fuzzer}.dict $OUT/${fuzzer}.dict
DICT_FILE="${fuzzer}.dict"
fi

# Copy options
OPTIONS_FILE=""
if [ -f "$FUZZING_DIR/${fuzzer}.options" ]; then
cp $FUZZING_DIR/${fuzzer}.options $OUT/${fuzzer}.options
OPTIONS_FILE="${fuzzer}.options"
fi

echo " ✅ $fuzzer: $CORPUS_COUNT seeds, dict: ${DICT_FILE:-none}, options: ${OPTIONS_FILE:-none}"
fi
done
else
echo "⚠️ IccXML2-static.a not found, skipping XML fuzzers"
fi

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Build complete: $FUZZER_COUNT fuzzers built successfully"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

if [ $FUZZER_COUNT -lt 13 ]; then
echo "⚠️ Warning: Expected at least 13 fuzzers, built $FUZZER_COUNT"
exit 1
fi

echo "✅ Build successful - ready for fuzzing campaign"
44 changes: 44 additions & 0 deletions .clusterfuzzlite/build-minimal.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash -eu
# Last Updated: 08-FEB-2026 at 0700Z by David Hoyt
#
# Changes: Add WASM Toolchain, CFL & libFuzzer

# Minimal CFL build for testing
echo "Minimal CFL Build Test"

# Determine repository root
if [ -d "$SRC/uci" ]; then
REPO_ROOT="$SRC/uci"
else
REPO_ROOT="$SRC"
fi

echo "Repository: $REPO_ROOT"
echo "OUT: $OUT"

# Comment wxWidgets
cd $REPO_ROOT/Build/Cmake
sed -i '1162,1170s/^/# DISABLED_FOR_CFL: /' CMakeLists.txt

# Build libraries
BUILD_DIR="$REPO_ROOT/Build/Cmake/build_cfl_$(date +%s)"
cmake -B $BUILD_DIR -S . \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS="$CFLAGS" \
-DCMAKE_CXX_FLAGS="$CXXFLAGS -frtti" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DBUILD_SHARED_LIBS=OFF

cmake --build $BUILD_DIR --target IccProfLib2-static -j$(nproc)

# Build ONE fuzzer
$CXX $CXXFLAGS -frtti \
-I$REPO_ROOT/IccProfLib \
$REPO_ROOT/Testing/Fuzzing/icc_profile_fuzzer.cpp \
$BUILD_DIR/IccProfLib/libIccProfLib2-static.a \
$LIB_FUZZING_ENGINE \
-o $OUT/icc_profile_fuzzer

echo "✅ Built 1 fuzzer successfully"
ls -lh $OUT/
Loading
Loading