Commit 0074c799b for imagemagick.org
commit 0074c799b03c8140089aa2e5b3f64b837daeb523
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Sat Nov 7 23:09:45 2026 +0100
Make sure we run checks for write failures in the HuffmanEncodeImage method.
diff --git a/MagickCore/compress.c b/MagickCore/compress.c
index 185993ed5..d2be57880 100644
--- a/MagickCore/compress.c
+++ b/MagickCore/compress.c
@@ -272,7 +272,7 @@ MagickExport void Ascii85Initialize(Image *image)
image->ascii85->offset=0;
}
-MagickExport void Ascii85Flush(Image *image)
+static MagickBooleanType Ascii85FlushInternal(Image *image)
{
assert(image != (Image *) NULL);
assert(image->signature == MagickCoreSignature);
@@ -285,20 +285,34 @@ MagickExport void Ascii85Flush(Image *image)
image->ascii85->buffer[image->ascii85->offset+1]='\0';
image->ascii85->buffer[image->ascii85->offset+2]='\0';
Ascii85Tuple(image->ascii85,image->ascii85->buffer);
- (void) WriteBlob(image,(size_t) image->ascii85->offset+1,
+ if (WriteBlob(image,(size_t) image->ascii85->offset+1,
(const unsigned char *) (*image->ascii85->tuple == 'z' ? "!!!!" :
- image->ascii85->tuple));
+ image->ascii85->tuple)) != (ssize_t) (image->ascii85->offset+1))
+ return(MagickFalse);
}
- (void) WriteBlobByte(image,'~');
- (void) WriteBlobByte(image,'>');
- (void) WriteBlobByte(image,'\n');
+ if (WriteBlobByte(image,'~') != 1)
+ return(MagickFalse);
+ if (WriteBlobByte(image,'>') != 1)
+ return(MagickFalse);
+ if (WriteBlobByte(image,'\n') != 1)
+ return(MagickFalse);
+ return(MagickTrue);
}
-MagickExport void Ascii85Encode(Image *image,const unsigned char code)
+MagickExport void Ascii85Flush(Image *image)
+{
+ (void) Ascii85FlushInternal(image);
+}
+
+static MagickBooleanType Ascii85EncodeInternal(Image *image,
+ const unsigned char code)
{
char
*q;
+ MagickBooleanType
+ status;
+
unsigned char
*p;
@@ -311,7 +325,8 @@ MagickExport void Ascii85Encode(Image *image,const unsigned char code)
image->ascii85->buffer[image->ascii85->offset]=code;
image->ascii85->offset++;
if (image->ascii85->offset < 4)
- return;
+ return(MagickTrue);
+ status=MagickTrue;
p=image->ascii85->buffer;
for (n=image->ascii85->offset; n >= 4; n-=4)
{
@@ -321,10 +336,18 @@ MagickExport void Ascii85Encode(Image *image,const unsigned char code)
image->ascii85->line_break--;
if ((image->ascii85->line_break < 0) && (*q != '%'))
{
- (void) WriteBlobByte(image,'\n');
+ if (WriteBlobByte(image,'\n') != 1)
+ {
+ status=MagickFalse;
+ break;
+ }
image->ascii85->line_break=2*MaxLineExtent;
}
- (void) WriteBlobByte(image,(unsigned char) *q);
+ if (WriteBlobByte(image,(unsigned char) *q) != 1)
+ {
+ status=MagickFalse;
+ break;
+ }
}
p+=(ptrdiff_t) 8;
}
@@ -332,6 +355,12 @@ MagickExport void Ascii85Encode(Image *image,const unsigned char code)
p-=(ptrdiff_t)4;
for (n=0; n < 4; n++)
image->ascii85->buffer[n]=(*p++);
+ return(status);
+}
+
+MagickExport void Ascii85Encode(Image *image,const unsigned char code)
+{
+ (void) Ascii85EncodeInternal(image,code);
}
/*
@@ -673,6 +702,8 @@ MagickExport MagickBooleanType HuffmanEncodeImage(const ImageInfo *image_info,
mask=one << (entry->length-1); \
while (mask != 0) \
{ \
+ if (status == MagickFalse) \
+ break; \
OutputBit(((entry->code & mask) != 0 ? 1 : 0)); \
mask>>=1; \
} \
@@ -685,12 +716,15 @@ DisableMSCWarning(4127) \
byte=byte | bit; \
RestoreMSCWarning \
bit>>=1; \
- if ((int) (bit & 0xff) == 0) \
+ if ((status != MagickFalse) && ((int) (bit & 0xff) == 0)) \
{ \
if (LocaleCompare(image_info->magick,"FAX") == 0) \
- (void) WriteBlobByte(image,(unsigned char) byte); \
+ { \
+ if (WriteBlobByte(image,(unsigned char) byte) != 1) \
+ status=MagickFalse; \
+ } \
else \
- Ascii85Encode(image,byte); \
+ status=Ascii85EncodeInternal(image,byte); \
byte='\0'; \
bit=(unsigned char) 0x80; \
} \
@@ -707,7 +741,7 @@ RestoreMSCWarning \
*huffman_image;
MagickBooleanType
- proceed;
+ status;
ssize_t
i,
@@ -745,6 +779,7 @@ RestoreMSCWarning \
assert(inject_image != (Image *) NULL);
assert(inject_image->signature == MagickCoreSignature);
one=1;
+ status=MagickTrue;
width=inject_image->columns;
if (LocaleCompare(image_info->magick,"FAX") == 0)
width=(size_t) MagickMax(inject_image->columns,1728);
@@ -780,6 +815,8 @@ RestoreMSCWarning \
q=scanline;
for (y=0; y < (ssize_t) huffman_image->rows; y++)
{
+ if (status == MagickFalse)
+ break;
p=GetVirtualPixels(huffman_image,0,y,huffman_image->columns,1,exception);
if (p == (const Quantum *) NULL)
break;
@@ -795,6 +832,8 @@ RestoreMSCWarning \
q=scanline;
for (n=(ssize_t) width; n > 0; )
{
+ if (status == MagickFalse)
+ break;
/*
Output white run.
*/
@@ -836,18 +875,22 @@ RestoreMSCWarning \
HuffmanOutputCode(entry);
}
}
+ if (status == MagickFalse)
+ break;
/*
End of line.
*/
for (k=0; k < 11; k++)
OutputBit(0);
OutputBit(1);
+ if (status == MagickFalse)
+ break;
q=scanline;
if (GetPreviousImageInList(huffman_image) == (Image *) NULL)
{
- proceed=SetImageProgress(huffman_image,LoadImageTag,
+ status=SetImageProgress(huffman_image,LoadImageTag,
(MagickOffsetType) y,huffman_image->rows);
- if (proceed == MagickFalse)
+ if (status == MagickFalse)
break;
}
}
@@ -856,6 +899,8 @@ RestoreMSCWarning \
*/
for (i=0; i < 6; i++)
{
+ if (status == MagickFalse)
+ break;
for (k=0; k < 11; k++)
OutputBit(0);
OutputBit(1);
@@ -863,18 +908,22 @@ RestoreMSCWarning \
/*
Flush bits.
*/
- if (((int) bit != 0x80) != 0)
+ if ((status != MagickFalse) && (((int) bit != 0x80) != 0))
{
if (LocaleCompare(image_info->magick,"FAX") == 0)
- (void) WriteBlobByte(image,byte);
+ {
+ if (WriteBlobByte(image,byte) != 1)
+ status=MagickFalse;
+ }
else
- Ascii85Encode(image,byte);
+ status=Ascii85EncodeInternal(image,byte);
}
- if (LocaleCompare(image_info->magick,"FAX") != 0)
- Ascii85Flush(image);
+ if ((status != MagickFalse) &&
+ (LocaleCompare(image_info->magick,"FAX") != 0))
+ status=Ascii85FlushInternal(image);
huffman_image=DestroyImage(huffman_image);
scanline=(unsigned char *) RelinquishMagickMemory(scanline);
- return(MagickTrue);
+ return(status);
}
/*