diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2020-05-06 01:22:59 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2020-05-06 01:22:59 +0000 |
commit | 51b578395ec3abc46c23701434519729150d6810 (patch) | |
tree | a18678b641e273eed0ab8f4f6430982b79e84863 /converter/pbm | |
parent | 6e6f85d9a895e719e971b627c2c8a0e7a1b82338 (diff) | |
download | netpbm-mirror-51b578395ec3abc46c23701434519729150d6810.tar.gz netpbm-mirror-51b578395ec3abc46c23701434519729150d6810.tar.xz netpbm-mirror-51b578395ec3abc46c23701434519729150d6810.zip |
Fix incorrect output with -txt option
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@3802 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/pbm')
-rw-r--r-- | converter/pbm/pbmtonokia.c | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/converter/pbm/pbmtonokia.c b/converter/pbm/pbmtonokia.c index c74fa421..0e479d67 100644 --- a/converter/pbm/pbmtonokia.c +++ b/converter/pbm/pbmtonokia.c @@ -395,33 +395,42 @@ convertToNpm(bit ** const image, const char * const text, FILE * const ofP) { + size_t const textLen = text ? strlen(text) : 0; + unsigned int row; char header[132]; - size_t len; - - if (text) - len = strlen(text); - else - len = 0; /* header and optional text */ - header[ 0] = 'N'; - header[ 1] = 'P'; - header[ 2] = 'M'; - header[ 3] = 0; - header[ 4] = len; - header[ 5] = 0; - memcpy(&header[5], text, len); - header[ 6 + len] = cols; - header[ 7 + len] = rows; - header[ 8 + len] = 1; - header[ 9 + len] = 1; - header[10 + len] = 0; /* unknown */ - - assert(10 + len < sizeof(header)); - - fwrite(header, 11 + len, 1, ofP); + /* Our entry condition is that 'text' be a legal text field, which means + no more than 120 characters: + */ + assert(textLen <= 120); + + /* We don't have any specification of this format, but in May 2020, we + found what looks like a bug: the memcpy of the text field started at + &header[5] (overwriting the previous setting of header[5] and leaving + header[6+len-1] not set to anything). Nobody ever complained about + this, so maybe somehow it worked better than the sensible code we have + now, where the text field starts in the 7th byte. + */ + + header[ 0] = 'N'; + header[ 1] = 'P'; + header[ 2] = 'M'; + header[ 3] = 0; + header[ 4] = textLen; + header[ 5] = 0; + memcpy(&header[6], text, textLen); + header[ 6 + textLen] = cols; + header[ 7 + textLen] = rows; + header[ 8 + textLen] = 1; + header[ 9 + textLen] = 1; + header[10 + textLen] = 0; /* unknown */ + + assert(10 + textLen < sizeof(header)); + + fwrite(header, 11 + textLen, 1, ofP); /* image: stream of bits, each row padded to a byte boundary inspired by gnokii/common/gsm-filesystems.c |