diff --git a/netpbm.changes b/netpbm.changes index 3922a32..ada2e55 100644 --- a/netpbm.changes +++ b/netpbm.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Sun Sep 18 09:15:29 UTC 2022 - Andreas Schwab + +- ppmforge-fix-overflow.patch: Fix arithmetic overflow in ppmforge +- ppmforge-test.patch: removed + ------------------------------------------------------------------- Wed Sep 14 13:15:23 UTC 2022 - Andreas Schwab diff --git a/netpbm.spec b/netpbm.spec index 4c848a6..e6b8465 100644 --- a/netpbm.spec +++ b/netpbm.spec @@ -47,8 +47,8 @@ Patch6: signed-char.patch Patch7: big-endian.patch # bsc#1144255 disable jpeg2k support due to removal of jasper Patch8: netpbm-disable-jasper.patch -# PATCH-FIX-UPSTREAM fix ppmforge test to avoid float overflow -Patch9: ppmforge-test.patch +# PATCH-FIX-UPSTREAM fix arithmetic overflow in ppmforge (https://sourceforge.net/p/netpbm/code/4428/) +Patch9: ppmforge-fix-overflow.patch BuildRequires: flex BuildRequires: libjpeg-devel BuildRequires: libpng-devel diff --git a/ppmforge-fix-overflow.patch b/ppmforge-fix-overflow.patch new file mode 100644 index 0000000..8b2f6a5 --- /dev/null +++ b/ppmforge-fix-overflow.patch @@ -0,0 +1,182 @@ +Index: netpbm/generator/ppmforge.c +=================================================================== +--- netpbm/generator/ppmforge.c (revision 4427) ++++ netpbm/generator/ppmforge.c (revision 4428) +@@ -241,7 +241,7 @@ + + + static void +-fourn(float * const data, ++fourn(double * const data, + const int * const nn, + int const ndim, + int const isign) { +@@ -272,7 +272,7 @@ + int i1, i2, i3; + int i2rev, i3rev, ip1, ip2, ip3, ifp1, ifp2; + int ibit, idim, k1, k2, n, nprev, nrem, ntot; +- float tempi, tempr; ++ double tempi, tempr; + double theta, wi, wpi, wpr, wr, wtemp; + + #define SWAP(a,b) tempr=(a); (a) = (b); (b) = tempr +@@ -401,7 +401,7 @@ + + + static void +-spectralsynth(float ** const x, ++spectralsynth(double ** const aP, + unsigned int const n, + double const h, + struct Gauss * const gaussP) { +@@ -411,18 +411,20 @@ + This algorithm is given under the name SpectralSynthesisFM2D on page 108 of + Peitgen & Saupe. + -----------------------------------------------------------------------------*/ +- unsigned bl; ++ unsigned int const bl = ((((unsigned long) n) * n) + 1) * 2; ++ + int i, j, i0, j0, nsize[3]; + double rad, phase, rcos, rsin; +- float *a; ++ double * a; + +- bl = ((((unsigned long) n) * n) + 1) * 2 * sizeof(float); +- a = (float *) calloc(bl, 1); +- if (a == (float *) 0) { +- pm_error("Cannot allocate %d x %d result array (% d bytes).", ++ MALLOCARRAY(a, bl); ++ ++ if (!a) { ++ pm_error("Cannot allocate %u x %u result array (%u doubles).", + n, n, bl); + } +- *x = a; ++ for (i = 0; i < bl; ++i) ++ a[i] = 0.0; /* initial value */ + + for (i = 0; i <= n / 2; i++) { + for (j = 0; j <= n / 2; j++) { +@@ -463,6 +465,8 @@ + nsize[0] = 0; + nsize[1] = nsize[2] = n; /* Dimension of frequency domain array */ + fourn(a, nsize, 2, -1); /* Take inverse 2D Fourier transform */ ++ ++ *aP = a; + } + + +@@ -572,9 +576,9 @@ + + + static unsigned char * +-makeCp(float * const a, +- unsigned int const n, +- pixval const maxval) { ++makeCp(const double * const a, ++ unsigned int const n, ++ pixval const maxval) { + + /* Prescale the grid points into intensities. */ + +@@ -587,7 +591,7 @@ + if (cp == NULL) + pm_error("Unable to allocate %u bytes for cp array", n); + +- ap = cp; ++ ap = cp; /* initial value */ + { + unsigned int i; + for (i = 0; i < n; i++) { +@@ -603,7 +607,7 @@ + + static void + createPlanetStuff(bool const clouds, +- float * const a, ++ const double * const a, + unsigned int const n, + double ** const uP, + double ** const u1P, +@@ -977,7 +981,7 @@ + static void + genplanet(bool const stars, + bool const clouds, +- float * const a, ++ const double * const a, + unsigned int const cols, + unsigned int const rows, + unsigned int const n, +@@ -1052,7 +1056,7 @@ + + + static void +-applyPowerLawScaling(float * const a, ++applyPowerLawScaling(double * const a, + int const meshsize, + double const powscale) { + +@@ -1065,7 +1069,7 @@ + for (j = 0; j < meshsize; j++) { + double const r = Real(a, i, j); + if (r > 0) +- Real(a, i, j) = pow(r, powscale); ++ Real(a, i, j) = MIN(hugeVal, pow(r, powscale)); + } + } + } +@@ -1074,10 +1078,10 @@ + + + static void +-computeExtremeReal(const float * const a, +- int const meshsize, +- double * const rminP, +- double * const rmaxP) { ++computeExtremeReal(const double * const a, ++ int const meshsize, ++ double * const rminP, ++ double * const rmaxP) { + + /* Compute extrema for autoscaling. */ + +@@ -1103,8 +1107,8 @@ + + + static void +-replaceWithSpread(float * const a, +- int const meshsize) { ++replaceWithSpread(double * const a, ++ int const meshsize) { + /*---------------------------------------------------------------------------- + Replace the real part of each element of the 'a' array with a + measure of how far the real is from the middle; sort of a standard +@@ -1138,7 +1142,7 @@ + /*---------------------------------------------------------------------------- + Make a planet. + -----------------------------------------------------------------------------*/ +- float * a; ++ double * a; + bool error; + struct Gauss gauss; + +@@ -1149,7 +1153,7 @@ + error = FALSE; + } else { + spectralsynth(&a, meshsize, 3.0 - fracdim, &gauss); +- if (a == NULL) { ++ if (!a) { + error = TRUE; + } else { + applyPowerLawScaling(a, meshsize, powscale); +Index: netpbm/test/ppmforge.test +=================================================================== +--- netpbm/test/ppmforge.test (revision 4427) ++++ netpbm/test/ppmforge.test (revision 4428) +@@ -47,6 +47,6 @@ + -inclination 9 -hour 12 -power 200 > ${test_ppm} + ppmforge -seed 1 -stars 0 -ice 0.01 \ + -inclination 10 -hour 12 -power 200 | \ +- pnmpsnr -target1=53.89 -target2=49.38 -target3=65.15 - ${test_ppm} ++ pnmpsnr -target1=46.07 -target2=52.00 -target3=67.77 - ${test_ppm} + + rm ${test_ppm} diff --git a/ppmforge-test.patch b/ppmforge-test.patch deleted file mode 100644 index 34dd634..0000000 --- a/ppmforge-test.patch +++ /dev/null @@ -1,16 +0,0 @@ -Index: netpbm-10.96.4/test/ppmforge.test -=================================================================== ---- netpbm-10.96.4.orig/test/ppmforge.test -+++ netpbm-10.96.4/test/ppmforge.test -@@ -44,9 +44,9 @@ rm ${test_ppm} - - echo "Test 5." - ppmforge -seed 1 -stars 0 -ice 0.01 \ -- -inclination 9 -hour 12 -power 200 > ${test_ppm} -+ -inclination 9 -hour 12 -power 20 > ${test_ppm} - ppmforge -seed 1 -stars 0 -ice 0.01 \ -- -inclination 10 -hour 12 -power 200 | \ -+ -inclination 10 -hour 12 -power 20 | \ - pnmpsnr -target1=53.89 -target2=49.38 -target3=65.15 - ${test_ppm} - - rm ${test_ppm}