QPpmHandler: fix reading ppm files

The ppm spec allows 1-bit ascii ppm files to have no spaces bitween the
single bits. Therefore we have to adjust read_pbm_int() to stop after
reading one digit.

Fixes: QTBUG-119239
Change-Id: I161038076c5dee4662aa66a1215822fc75e6a19e
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
(cherry picked from commit 975b3d5d530b647ba665459bef2fb3ee6ab5ccc1)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2023-11-25 22:49:46 +01:00 committed by Qt Cherry-pick Bot
parent 901515fe03
commit 037aa20b37
2 changed files with 11 additions and 7 deletions

View File

@ -32,7 +32,7 @@ static void discard_pbm_line(QIODevice *d)
} while (res > 0 && buf[res-1] != '\n'); } while (res > 0 && buf[res-1] != '\n');
} }
static int read_pbm_int(QIODevice *d, bool *ok) static int read_pbm_int(QIODevice *d, bool *ok, int maxDigits = -1)
{ {
char c; char c;
int val = -1; int val = -1;
@ -50,6 +50,8 @@ static int read_pbm_int(QIODevice *d, bool *ok)
} else { } else {
hasOverflow = true; hasOverflow = true;
} }
if (maxDigits > 0 && --maxDigits == 0)
break;
continue; continue;
} else { } else {
if (c == '#') // comment if (c == '#') // comment
@ -65,6 +67,8 @@ static int read_pbm_int(QIODevice *d, bool *ok)
discard_pbm_line(d); discard_pbm_line(d);
else else
break; break;
if (maxDigits > 0 && --maxDigits == 0)
break;
} }
if (val < 0) if (val < 0)
*ok = false; *ok = false;
@ -213,7 +217,7 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q
b = 0; b = 0;
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
if (i < bitsLeft) if (i < bitsLeft)
b = (b << 1) | (read_pbm_int(device, &ok) & 1); b = (b << 1) | (read_pbm_int(device, &ok, 1) & 1);
else else
b = (b << 1) | (0 & 1); // pad it our self if we need to b = (b << 1) | (0 & 1); // pad it our self if we need to
} }