diff --git a/meta-oe/recipes-support/imagemagick/files/imagemagick-ptest.sh b/meta-oe/recipes-support/imagemagick/files/imagemagick-ptest.sh new file mode 100644 index 0000000000..f6f7286007 --- /dev/null +++ b/meta-oe/recipes-support/imagemagick/files/imagemagick-ptest.sh @@ -0,0 +1,128 @@ +#!/bin/sh +# +# ImageMagick ptest: +# We ceate an BASERGB file for our usage using "convert" +# We convert this RGB file to BASEPNG +# Using BASEPNG we recreate RGB named REGENERATEDRGB +# +# BASERGB to BASEPNG to REGENERATEDRGB +# - Then compare BASERGB with REGENERATEDRGB +# +# 1) We are checking if the binaries are present in RFS or not +# 2) We Created an RBG of size : WIDTH x HEIGHT pixels +# 3) Return value is captured after every major actio to capture the status +# 4) cmp -s is used to compare binary byte by byte data and +# capture only exit status +# 5) Important parametsrs used are : +# -depth : How many bits for each colour pixel +# -alpha off : Don't consider transparency +# -define png:color-type=2 : Make PNG work with truecolour RGB +# -strip : Remove all non-pixel metadata og PNG +# so file is reproducible +# -set gamma 1.0 : No PNG brightness correction +# gradient:red-blue : Data moves liberly from RED to Blue vertically + + +WIDTH=16 +HEIGHT=16 +BASERGB=base.rgb +BASEPNG=base.png +REGENERATEDRGB=roundtrip.rgb + +echo "[DEBUG] Starting ImageMagick Ptest with ${WIDTH}x${HEIGHT} pixels " + +# Verify required binaries +for bin in convert cmp wc rm; do + if [ -z "$(command -v "$bin" 2>/dev/null)" ]; then + echo "[ERROR] Required binary '$bin' not found $PATH" + exit 127 + fi +done + +# Generate raw RGB +convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \ + -alpha off -define png:color-type=2 \ + -strip -set gamma 1.0 \ + gradient:red-blue rgb:${BASERGB} + +returnvalue=$? +if [ "$returnvalue" -ne 0 ]; then + echo "[FAIL] Failed to generate RGB pattern " + exit 1 +else + echo "[DEBUG] Generated raw RGB ${BASERGB} for test case" +fi + + + +# Convert raw RGB to PNG +convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \ + -alpha off -define png:color-type=2 \ + -strip -set gamma 1.0 \ + rgb:${BASERGB} ${BASEPNG} + +returnvalue=$? +if [ $returnvalue -ne 0 ]; then + echo "[FAIL] Failed to convert RGB to PNG" + rm -f ${BASERGB} + exit 1 +else + echo "[DEBUG] ${BASEPNG} generated from ${BASERGB}" +fi + + + +# Regenerate raw RGB from PNG +convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \ + -alpha off -define png:color-type=2 \ + -strip -set gamma 1.0 \ + ${BASEPNG} rgb:${REGENERATEDRGB} + +returnvalue=$? +if [ $returnvalue -ne 0 ]; then + echo "[FAIL] Failed to re generate RGB from PNG " + rm -f ${BASERGB} ${BASEPNG} + exit 1 +else + echo "[DEBUG] ${REGENERATEDRGB} generated from ${BASEPNG}" +fi + + + +# Compare original and recreated RGB +if cmp -s ${BASERGB} ${REGENERATEDRGB}; then + echo "[PASS] RGB data identical after PNG round-trip" + RESULT=0 +else + echo "[FAIL] RGB mismatch detected, printing their size " + echo "[INFO] Base RGB size: $(wc -c < ${BASERGB}) bytes" + echo "[INFO] Round-trip RGB size: $(wc -c < ${REGENERATEDRGB}) bytes" + RESULT=1 +fi + + + +# Checking the identify tool from imagemagick to get the PNG metadata +# True is added in end to ensure that test script doesnt fail even if +# identify fails for any reason +echo "[DEBUG] PNG file info:" +identify -verbose ${BASEPNG} | grep -E "Depth|Type|Colorspace" || true + + + +# Cleanup of files create by test code +echo "[DEBUG] Cleaning up temporary files" +rm -f ${BASERGB} ${BASEPNG} ${REGENERATEDRGB} +returnvalue=$? +echo "[DEBUG] Cleanup exit=$returnvalue" + + +# Logging the final result +if [ ${RESULT} -eq 0 ]; then + echo "[DEBUG]: imagemagick-ptest.sh sucessfull " +else + echo "[DEBUG]: imagemagick-ptest.sh failed " +fi + + +exit ${RESULT} diff --git a/meta-oe/recipes-support/imagemagick/files/run-ptest b/meta-oe/recipes-support/imagemagick/files/run-ptest new file mode 100644 index 0000000000..12241db3c1 --- /dev/null +++ b/meta-oe/recipes-support/imagemagick/files/run-ptest @@ -0,0 +1,43 @@ +#!/bin/sh +# +# run-ptest — ImageMagick ptest harness +# POSIX-safe and BusyBox compatible + +PTDIR=$(dirname "$0") +TESTDIR="$PTDIR" +PASSCOUNT=0 +FAILCOUNT=0 +TOTAL=0 + +echo "=======================================" +echo "ImageMagick ptest: Runtime Validation" +echo "=======================================" + +for t in "$TESTDIR"/*.sh; do + [ -x "$t" ] || chmod +x "$t" + TOTAL=$((TOTAL + 1)) + echo + echo "[DEBUG] Launching test script $t" + + if sh "$t" 2>&1; then + echo "PASS: $(basename "$t")" + PASSCOUNT=$((PASSCOUNT + 1)) + else + rc=$? + if [ "$rc" -eq 77 ]; then + echo "SKIP: $(basename "$t")" + else + echo "FAIL: $(basename "$t")" + FAILCOUNT=$((FAILCOUNT + 1)) + fi + fi + +done + +echo +echo "=======================================" +echo "[SUMMARY] Total: $TOTAL | PASS: $PASSCOUNT | FAIL: $FAILCOUNT" +echo "=======================================" +echo +[ "$FAILCOUNT" -eq 0 ] + diff --git a/meta-oe/recipes-support/imagemagick/imagemagick_7.0.10.bb b/meta-oe/recipes-support/imagemagick/imagemagick_7.0.10.bb index fcbbd6fca2..f567158693 100644 --- a/meta-oe/recipes-support/imagemagick/imagemagick_7.0.10.bb +++ b/meta-oe/recipes-support/imagemagick/imagemagick_7.0.10.bb @@ -12,6 +12,8 @@ DEPENDS = "lcms bzip2 jpeg libpng tiff zlib fftw freetype libtool" BASE_PV := "${PV}" PV .= "-62" SRC_URI = "git://github.com/ImageMagick/ImageMagick.git;branch=main;protocol=https \ + file://run-ptest \ + file://imagemagick-ptest.sh \ file://CVE-2021-20309.patch \ file://CVE-2021-20310.patch \ file://CVE-2021-3610.patch \ @@ -39,7 +41,11 @@ CVE_CHECK_IGNORE += "CVE-2016-7538" # current version is not affected by the CVE which affects versions at least earlier than 7.0.4-4 CVE_CHECK_IGNORE += "CVE-2017-5506" -inherit autotools pkgconfig update-alternatives +inherit autotools pkgconfig update-alternatives ptest + +do_install_ptest() { + install -m 0755 ${WORKDIR}/imagemagick-ptest.sh ${D}${PTEST_PATH}/ +} # xml disabled because it's using xml2-config --prefix to determine prefix which returns just /usr with our libxml2 # if someone needs xml support then fix it first