2597 lines
105 KiB
Diff
2597 lines
105 KiB
Diff
|
diff --git a/THIRD_PARTY_README b/THIRD_PARTY_README
|
||
|
index f9aea78d64..605b36f100 100644
|
||
|
--- a/THIRD_PARTY_README
|
||
|
+++ b/THIRD_PARTY_README
|
||
|
@@ -1696,7 +1696,7 @@ released under other open source licenses.
|
||
|
|
||
|
-------------------------------------------------------------------------------
|
||
|
|
||
|
-%% This notice is provided with respect to GIFLIB 5.2.1 & libungif 4.1.3,
|
||
|
+%% This notice is provided with respect to GIFLIB 5.2.2 & libungif 4.1.3,
|
||
|
which may be included with JRE 8, JDK 8, and OpenJDK 8.
|
||
|
|
||
|
--- begin of LICENSE ---
|
||
|
@@ -1721,6 +1721,29 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
THE SOFTWARE.
|
||
|
|
||
|
+tree/README
|
||
|
+
|
||
|
+== Authors ==
|
||
|
+
|
||
|
+Gershon Elber <gershon[AT]cs.technion.sc.il>
|
||
|
+original giflib code
|
||
|
+
|
||
|
+Toshio Kuratomi <toshio[AT]tiki-lounge.com>
|
||
|
+uncompressed gif writing code
|
||
|
+former maintainer
|
||
|
+
|
||
|
+Eric Raymond <esr[AT]snark.thyrsus.com>
|
||
|
+current as well as long time former maintainer of giflib code
|
||
|
+
|
||
|
+There have been many other contributors; see the attributions in the
|
||
|
+version-control history to learn more.
|
||
|
+
|
||
|
+
|
||
|
+tree/openbsd-reallocarray.c
|
||
|
+
|
||
|
+Copyright (C) 2008 Otto Moerbeek <otto@drijf.net>
|
||
|
+SPDX-License-Identifier: MIT
|
||
|
+
|
||
|
--- end of LICENSE ---
|
||
|
|
||
|
-------------------------------------------------------------------------------
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c
|
||
|
index 6ddfb46060..0b2860b4b5 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c
|
||
|
@@ -34,11 +34,11 @@ SPDX-License-Identifier: MIT
|
||
|
|
||
|
*****************************************************************************/
|
||
|
|
||
|
-#include <stdlib.h>
|
||
|
+#include <fcntl.h>
|
||
|
#include <limits.h>
|
||
|
#include <stdint.h>
|
||
|
-#include <fcntl.h>
|
||
|
#include <stdio.h>
|
||
|
+#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
@@ -55,18 +55,19 @@ SPDX-License-Identifier: MIT
|
||
|
|
||
|
/* avoid extra function call in case we use fread (TVT) */
|
||
|
static int InternalRead(GifFileType *gif, GifByteType *buf, int len) {
|
||
|
- //fprintf(stderr, "### Read: %d\n", len);
|
||
|
- return
|
||
|
- (((GifFilePrivateType*)gif->Private)->Read ?
|
||
|
- ((GifFilePrivateType*)gif->Private)->Read(gif,buf,len) :
|
||
|
- fread(buf,1,len,((GifFilePrivateType*)gif->Private)->File));
|
||
|
+ // fprintf(stderr, "### Read: %d\n", len);
|
||
|
+ return (((GifFilePrivateType *)gif->Private)->Read
|
||
|
+ ? ((GifFilePrivateType *)gif->Private)->Read(gif, buf, len)
|
||
|
+ : fread(buf, 1, len,
|
||
|
+ ((GifFilePrivateType *)gif->Private)->File));
|
||
|
}
|
||
|
|
||
|
static int DGifGetWord(GifFileType *GifFile, GifWord *Word);
|
||
|
static int DGifSetupDecompress(GifFileType *GifFile);
|
||
|
static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line,
|
||
|
int LineLen);
|
||
|
-static int DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode);
|
||
|
+static int DGifGetPrefixChar(const GifPrefixType *Prefix, int Code,
|
||
|
+ int ClearCode);
|
||
|
static int DGifDecompressInput(GifFileType *GifFile, int *Code);
|
||
|
static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf,
|
||
|
GifByteType *NextByte);
|
||
|
@@ -76,15 +77,14 @@ static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf,
|
||
|
Returns dynamically allocated GifFileType pointer which serves as the GIF
|
||
|
info record.
|
||
|
******************************************************************************/
|
||
|
-GifFileType *
|
||
|
-DGifOpenFileName(const char *FileName, int *Error)
|
||
|
-{
|
||
|
+GifFileType *DGifOpenFileName(const char *FileName, int *Error) {
|
||
|
int FileHandle;
|
||
|
GifFileType *GifFile;
|
||
|
|
||
|
if ((FileHandle = open(FileName, O_RDONLY)) == -1) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_OPEN_FAILED;
|
||
|
+ }
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
@@ -97,9 +97,7 @@ DGifOpenFileName(const char *FileName, int *Error)
|
||
|
Returns dynamically allocated GifFileType pointer which serves as the GIF
|
||
|
info record.
|
||
|
******************************************************************************/
|
||
|
-GifFileType *
|
||
|
-DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
-{
|
||
|
+GifFileType *DGifOpenFileHandle(int FileHandle, int *Error) {
|
||
|
char Buf[GIF_STAMP_LEN + 1];
|
||
|
GifFileType *GifFile;
|
||
|
GifFilePrivateType *Private;
|
||
|
@@ -107,13 +105,14 @@ DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
|
||
|
GifFile = (GifFileType *)malloc(sizeof(GifFileType));
|
||
|
if (GifFile == NULL) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
+ }
|
||
|
(void)close(FileHandle);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
- /*@i1@*/memset(GifFile, '\0', sizeof(GifFileType));
|
||
|
+ /*@i1@*/ memset(GifFile, '\0', sizeof(GifFileType));
|
||
|
|
||
|
/* Belt and suspenders, in case the null pointer isn't zero */
|
||
|
GifFile->SavedImages = NULL;
|
||
|
@@ -121,35 +120,38 @@ DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
|
||
|
Private = (GifFilePrivateType *)calloc(1, sizeof(GifFilePrivateType));
|
||
|
if (Private == NULL) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
+ }
|
||
|
(void)close(FileHandle);
|
||
|
free((char *)GifFile);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
- /*@i1@*/memset(Private, '\0', sizeof(GifFilePrivateType));
|
||
|
+ /*@i1@*/ memset(Private, '\0', sizeof(GifFilePrivateType));
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
- _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */
|
||
|
-#endif /* _WIN32 */
|
||
|
+ _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */
|
||
|
+#endif /* _WIN32 */
|
||
|
|
||
|
- f = fdopen(FileHandle, "rb"); /* Make it into a stream: */
|
||
|
+ f = fdopen(FileHandle, "rb"); /* Make it into a stream: */
|
||
|
|
||
|
/*@-mustfreeonly@*/
|
||
|
GifFile->Private = (void *)Private;
|
||
|
Private->FileHandle = FileHandle;
|
||
|
Private->File = f;
|
||
|
Private->FileState = FILE_STATE_READ;
|
||
|
- Private->Read = NULL; /* don't use alternate input method (TVT) */
|
||
|
- GifFile->UserData = NULL; /* TVT */
|
||
|
+ Private->Read = NULL; /* don't use alternate input method (TVT) */
|
||
|
+ GifFile->UserData = NULL; /* TVT */
|
||
|
/*@=mustfreeonly@*/
|
||
|
|
||
|
/* Let's see if this is a GIF file: */
|
||
|
/* coverity[check_return] */
|
||
|
- if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) !=
|
||
|
+ GIF_STAMP_LEN) {
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_READ_FAILED;
|
||
|
+ }
|
||
|
(void)fclose(f);
|
||
|
free((char *)Private);
|
||
|
free((char *)GifFile);
|
||
|
@@ -159,8 +161,9 @@ DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
/* Check for GIF prefix at start of file */
|
||
|
Buf[GIF_STAMP_LEN] = 0;
|
||
|
if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_GIF_FILE;
|
||
|
+ }
|
||
|
(void)fclose(f);
|
||
|
free((char *)Private);
|
||
|
free((char *)GifFile);
|
||
|
@@ -177,7 +180,7 @@ DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
GifFile->Error = 0;
|
||
|
|
||
|
/* What version of GIF? */
|
||
|
- Private->gif89 = (Buf[GIF_VERSION_POS] == '9');
|
||
|
+ Private->gif89 = (Buf[GIF_VERSION_POS + 1] == '9');
|
||
|
|
||
|
return GifFile;
|
||
|
}
|
||
|
@@ -185,17 +188,16 @@ DGifOpenFileHandle(int FileHandle, int *Error)
|
||
|
/******************************************************************************
|
||
|
GifFileType constructor with user supplied input function (TVT)
|
||
|
******************************************************************************/
|
||
|
-GifFileType *
|
||
|
-DGifOpen(void *userData, InputFunc readFunc, int *Error)
|
||
|
-{
|
||
|
+GifFileType *DGifOpen(void *userData, InputFunc readFunc, int *Error) {
|
||
|
char Buf[GIF_STAMP_LEN + 1];
|
||
|
GifFileType *GifFile;
|
||
|
GifFilePrivateType *Private;
|
||
|
|
||
|
GifFile = (GifFileType *)malloc(sizeof(GifFileType));
|
||
|
if (GifFile == NULL) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
+ }
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
@@ -207,26 +209,29 @@ DGifOpen(void *userData, InputFunc readFunc, int *Error)
|
||
|
|
||
|
Private = (GifFilePrivateType *)calloc(1, sizeof(GifFilePrivateType));
|
||
|
if (!Private) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
+ }
|
||
|
free((char *)GifFile);
|
||
|
return NULL;
|
||
|
}
|
||
|
- /*@i1@*/memset(Private, '\0', sizeof(GifFilePrivateType));
|
||
|
+ /*@i1@*/ memset(Private, '\0', sizeof(GifFilePrivateType));
|
||
|
|
||
|
GifFile->Private = (void *)Private;
|
||
|
Private->FileHandle = 0;
|
||
|
Private->File = NULL;
|
||
|
Private->FileState = FILE_STATE_READ;
|
||
|
|
||
|
- Private->Read = readFunc; /* TVT */
|
||
|
- GifFile->UserData = userData; /* TVT */
|
||
|
+ Private->Read = readFunc; /* TVT */
|
||
|
+ GifFile->UserData = userData; /* TVT */
|
||
|
|
||
|
/* Lets see if this is a GIF file: */
|
||
|
/* coverity[check_return] */
|
||
|
- if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) !=
|
||
|
+ GIF_STAMP_LEN) {
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_READ_FAILED;
|
||
|
+ }
|
||
|
free((char *)Private);
|
||
|
free((char *)GifFile);
|
||
|
return NULL;
|
||
|
@@ -235,8 +240,9 @@ DGifOpen(void *userData, InputFunc readFunc, int *Error)
|
||
|
/* Check for GIF prefix at start of file */
|
||
|
Buf[GIF_STAMP_LEN] = '\0';
|
||
|
if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) {
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NOT_GIF_FILE;
|
||
|
+ }
|
||
|
free((char *)Private);
|
||
|
free((char *)GifFile);
|
||
|
return NULL;
|
||
|
@@ -245,15 +251,16 @@ DGifOpen(void *userData, InputFunc readFunc, int *Error)
|
||
|
if (DGifGetScreenDesc(GifFile) == GIF_ERROR) {
|
||
|
free((char *)Private);
|
||
|
free((char *)GifFile);
|
||
|
- if (Error != NULL)
|
||
|
+ if (Error != NULL) {
|
||
|
*Error = D_GIF_ERR_NO_SCRN_DSCR;
|
||
|
+ }
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
GifFile->Error = 0;
|
||
|
|
||
|
/* What version of GIF? */
|
||
|
- Private->gif89 = (Buf[GIF_VERSION_POS] == '9');
|
||
|
+ Private->gif89 = (Buf[GIF_VERSION_POS + 1] == '9');
|
||
|
|
||
|
return GifFile;
|
||
|
}
|
||
|
@@ -262,9 +269,7 @@ DGifOpen(void *userData, InputFunc readFunc, int *Error)
|
||
|
This routine should be called before any other DGif calls. Note that
|
||
|
this routine is called automatically from DGif file open routines.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetScreenDesc(GifFileType *GifFile)
|
||
|
-{
|
||
|
+int DGifGetScreenDesc(GifFileType *GifFile) {
|
||
|
int BitsPerPixel;
|
||
|
bool SortFlag;
|
||
|
GifByteType Buf[3];
|
||
|
@@ -278,8 +283,9 @@ DGifGetScreenDesc(GifFileType *GifFile)
|
||
|
|
||
|
/* Put the screen descriptor into the file: */
|
||
|
if (DGifGetWord(GifFile, &GifFile->SWidth) == GIF_ERROR ||
|
||
|
- DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR)
|
||
|
+ DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
|
||
|
if (InternalRead(GifFile, Buf, 3) != 3) {
|
||
|
GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
@@ -292,7 +298,7 @@ DGifGetScreenDesc(GifFileType *GifFile)
|
||
|
BitsPerPixel = (Buf[0] & 0x07) + 1;
|
||
|
GifFile->SBackGroundColor = Buf[1];
|
||
|
GifFile->AspectByte = Buf[2];
|
||
|
- if (Buf[0] & 0x80) { /* Do we have global color map? */
|
||
|
+ if (Buf[0] & 0x80) { /* Do we have global color map? */
|
||
|
int i;
|
||
|
|
||
|
GifFile->SColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL);
|
||
|
@@ -327,23 +333,20 @@ DGifGetScreenDesc(GifFileType *GifFile)
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
|
||
|
-const char *
|
||
|
-DGifGetGifVersion(GifFileType *GifFile)
|
||
|
-{
|
||
|
- GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
|
||
|
+const char *DGifGetGifVersion(GifFileType *GifFile) {
|
||
|
+ GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
- if (Private->gif89)
|
||
|
+ if (Private->gif89) {
|
||
|
return GIF89_STAMP;
|
||
|
- else
|
||
|
+ } else {
|
||
|
return GIF87_STAMP;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
This routine should be called before any attempt to read an image.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetRecordType(GifFileType *GifFile, GifRecordType* Type)
|
||
|
-{
|
||
|
+int DGifGetRecordType(GifFileType *GifFile, GifRecordType *Type) {
|
||
|
GifByteType Buf;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
@@ -359,29 +362,27 @@ DGifGetRecordType(GifFileType *GifFile, GifRecordType* Type)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
- //fprintf(stderr, "### DGifGetRecordType: %02x\n", Buf);
|
||
|
+ // fprintf(stderr, "### DGifGetRecordType: %02x\n", Buf);
|
||
|
switch (Buf) {
|
||
|
- case DESCRIPTOR_INTRODUCER:
|
||
|
- *Type = IMAGE_DESC_RECORD_TYPE;
|
||
|
- break;
|
||
|
- case EXTENSION_INTRODUCER:
|
||
|
- *Type = EXTENSION_RECORD_TYPE;
|
||
|
- break;
|
||
|
- case TERMINATOR_INTRODUCER:
|
||
|
- *Type = TERMINATE_RECORD_TYPE;
|
||
|
- break;
|
||
|
- default:
|
||
|
- *Type = UNDEFINED_RECORD_TYPE;
|
||
|
- GifFile->Error = D_GIF_ERR_WRONG_RECORD;
|
||
|
- return GIF_ERROR;
|
||
|
+ case DESCRIPTOR_INTRODUCER:
|
||
|
+ *Type = IMAGE_DESC_RECORD_TYPE;
|
||
|
+ break;
|
||
|
+ case EXTENSION_INTRODUCER:
|
||
|
+ *Type = EXTENSION_RECORD_TYPE;
|
||
|
+ break;
|
||
|
+ case TERMINATOR_INTRODUCER:
|
||
|
+ *Type = TERMINATE_RECORD_TYPE;
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ *Type = UNDEFINED_RECORD_TYPE;
|
||
|
+ GifFile->Error = D_GIF_ERR_WRONG_RECORD;
|
||
|
+ return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
|
||
|
-int
|
||
|
-DGifGetImageHeader(GifFileType *GifFile)
|
||
|
-{
|
||
|
+int DGifGetImageHeader(GifFileType *GifFile) {
|
||
|
unsigned int BitsPerPixel;
|
||
|
GifByteType Buf[3];
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
@@ -395,8 +396,9 @@ DGifGetImageHeader(GifFileType *GifFile)
|
||
|
if (DGifGetWord(GifFile, &GifFile->Image.Left) == GIF_ERROR ||
|
||
|
DGifGetWord(GifFile, &GifFile->Image.Top) == GIF_ERROR ||
|
||
|
DGifGetWord(GifFile, &GifFile->Image.Width) == GIF_ERROR ||
|
||
|
- DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR)
|
||
|
+ DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
if (InternalRead(GifFile, Buf, 1) != 1) {
|
||
|
GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
GifFreeMapObject(GifFile->Image.ColorMap);
|
||
|
@@ -415,7 +417,8 @@ DGifGetImageHeader(GifFileType *GifFile)
|
||
|
if (Buf[0] & 0x80) {
|
||
|
unsigned int i;
|
||
|
|
||
|
- GifFile->Image.ColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL);
|
||
|
+ GifFile->Image.ColorMap =
|
||
|
+ GifMakeMapObject(1 << BitsPerPixel, NULL);
|
||
|
if (GifFile->Image.ColorMap == NULL) {
|
||
|
GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
return GIF_ERROR;
|
||
|
@@ -436,8 +439,8 @@ DGifGetImageHeader(GifFileType *GifFile)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- Private->PixelCount = (long)GifFile->Image.Width *
|
||
|
- (long)GifFile->Image.Height;
|
||
|
+ Private->PixelCount =
|
||
|
+ (long)GifFile->Image.Width * (long)GifFile->Image.Height;
|
||
|
|
||
|
/* Reset decompress algorithm parameters. */
|
||
|
return DGifSetupDecompress(GifFile);
|
||
|
@@ -447,9 +450,7 @@ DGifGetImageHeader(GifFileType *GifFile)
|
||
|
This routine should be called before any attempt to read an image.
|
||
|
Note it is assumed the Image desc. header has been read.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetImageDesc(GifFileType *GifFile)
|
||
|
-{
|
||
|
+int DGifGetImageDesc(GifFileType *GifFile) {
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
SavedImage *sp;
|
||
|
|
||
|
@@ -464,9 +465,9 @@ DGifGetImageDesc(GifFileType *GifFile)
|
||
|
}
|
||
|
|
||
|
if (GifFile->SavedImages) {
|
||
|
- SavedImage* new_saved_images =
|
||
|
- (SavedImage *)reallocarray(GifFile->SavedImages,
|
||
|
- (GifFile->ImageCount + 1), sizeof(SavedImage));
|
||
|
+ SavedImage *new_saved_images = (SavedImage *)reallocarray(
|
||
|
+ GifFile->SavedImages, (GifFile->ImageCount + 1),
|
||
|
+ sizeof(SavedImage));
|
||
|
if (new_saved_images == NULL) {
|
||
|
GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
return GIF_ERROR;
|
||
|
@@ -474,7 +475,7 @@ DGifGetImageDesc(GifFileType *GifFile)
|
||
|
GifFile->SavedImages = new_saved_images;
|
||
|
} else {
|
||
|
if ((GifFile->SavedImages =
|
||
|
- (SavedImage *) malloc(sizeof(SavedImage))) == NULL) {
|
||
|
+ (SavedImage *)malloc(sizeof(SavedImage))) == NULL) {
|
||
|
GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
@@ -483,9 +484,9 @@ DGifGetImageDesc(GifFileType *GifFile)
|
||
|
sp = &GifFile->SavedImages[GifFile->ImageCount];
|
||
|
memcpy(&sp->ImageDesc, &GifFile->Image, sizeof(GifImageDesc));
|
||
|
if (GifFile->Image.ColorMap != NULL) {
|
||
|
- sp->ImageDesc.ColorMap = GifMakeMapObject(
|
||
|
- GifFile->Image.ColorMap->ColorCount,
|
||
|
- GifFile->Image.ColorMap->Colors);
|
||
|
+ sp->ImageDesc.ColorMap =
|
||
|
+ GifMakeMapObject(GifFile->Image.ColorMap->ColorCount,
|
||
|
+ GifFile->Image.ColorMap->Colors);
|
||
|
if (sp->ImageDesc.ColorMap == NULL) {
|
||
|
GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
|
||
|
return GIF_ERROR;
|
||
|
@@ -493,7 +494,7 @@ DGifGetImageDesc(GifFileType *GifFile)
|
||
|
}
|
||
|
sp->RasterBits = (unsigned char *)NULL;
|
||
|
sp->ExtensionBlockCount = 0;
|
||
|
- sp->ExtensionBlocks = (ExtensionBlock *) NULL;
|
||
|
+ sp->ExtensionBlocks = (ExtensionBlock *)NULL;
|
||
|
|
||
|
GifFile->ImageCount++;
|
||
|
|
||
|
@@ -503,11 +504,9 @@ DGifGetImageDesc(GifFileType *GifFile)
|
||
|
/******************************************************************************
|
||
|
Get one full scanned line (Line) of length LineLen from GIF file.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
-{
|
||
|
+int DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) {
|
||
|
GifByteType *Dummy;
|
||
|
- GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
|
||
|
+ GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
if (!IS_READABLE(Private)) {
|
||
|
/* This file was NOT open for reading: */
|
||
|
@@ -515,8 +514,9 @@ DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
- if (!LineLen)
|
||
|
+ if (!LineLen) {
|
||
|
LineLen = GifFile->Image.Width;
|
||
|
+ }
|
||
|
|
||
|
if ((Private->PixelCount -= LineLen) > 0xffff0000UL) {
|
||
|
GifFile->Error = D_GIF_ERR_DATA_TOO_BIG;
|
||
|
@@ -525,56 +525,59 @@ DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
|
||
|
if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) {
|
||
|
if (Private->PixelCount == 0) {
|
||
|
- /* We probably won't be called any more, so let's clean up
|
||
|
- * everything before we return: need to flush out all the
|
||
|
- * rest of image until an empty block (size 0)
|
||
|
+ /* We probably won't be called any more, so let's clean
|
||
|
+ * up everything before we return: need to flush out all
|
||
|
+ * the rest of image until an empty block (size 0)
|
||
|
* detected. We use GetCodeNext.
|
||
|
*/
|
||
|
- do
|
||
|
- if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR)
|
||
|
+ do {
|
||
|
+ if (DGifGetCodeNext(GifFile, &Dummy) ==
|
||
|
+ GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
- while (Dummy != NULL) ;
|
||
|
+ }
|
||
|
+ } while (Dummy != NULL);
|
||
|
}
|
||
|
return GIF_OK;
|
||
|
- } else
|
||
|
+ } else {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
Put one pixel (Pixel) into GIF file.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel)
|
||
|
-{
|
||
|
+int DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel) {
|
||
|
GifByteType *Dummy;
|
||
|
- GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
|
||
|
+ GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
if (!IS_READABLE(Private)) {
|
||
|
/* This file was NOT open for reading: */
|
||
|
GifFile->Error = D_GIF_ERR_NOT_READABLE;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
- if (--Private->PixelCount > 0xffff0000UL)
|
||
|
- {
|
||
|
+ if (--Private->PixelCount > 0xffff0000UL) {
|
||
|
GifFile->Error = D_GIF_ERR_DATA_TOO_BIG;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
if (DGifDecompressLine(GifFile, &Pixel, 1) == GIF_OK) {
|
||
|
if (Private->PixelCount == 0) {
|
||
|
- /* We probably won't be called any more, so let's clean up
|
||
|
- * everything before we return: need to flush out all the
|
||
|
- * rest of image until an empty block (size 0)
|
||
|
+ /* We probably won't be called any more, so let's clean
|
||
|
+ * up everything before we return: need to flush out all
|
||
|
+ * the rest of image until an empty block (size 0)
|
||
|
* detected. We use GetCodeNext.
|
||
|
*/
|
||
|
- do
|
||
|
- if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR)
|
||
|
+ do {
|
||
|
+ if (DGifGetCodeNext(GifFile, &Dummy) ==
|
||
|
+ GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
- while (Dummy != NULL) ;
|
||
|
+ }
|
||
|
+ } while (Dummy != NULL);
|
||
|
}
|
||
|
return GIF_OK;
|
||
|
- } else
|
||
|
+ } else {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
@@ -584,13 +587,12 @@ DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel)
|
||
|
The Extension should NOT be freed by the user (not dynamically allocated).
|
||
|
Note it is assumed the Extension description header has been read.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension)
|
||
|
-{
|
||
|
+int DGifGetExtension(GifFileType *GifFile, int *ExtCode,
|
||
|
+ GifByteType **Extension) {
|
||
|
GifByteType Buf;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
- //fprintf(stderr, "### -> DGifGetExtension:\n");
|
||
|
+ // fprintf(stderr, "### -> DGifGetExtension:\n");
|
||
|
if (!IS_READABLE(Private)) {
|
||
|
/* This file was NOT open for reading: */
|
||
|
GifFile->Error = D_GIF_ERR_NOT_READABLE;
|
||
|
@@ -603,7 +605,8 @@ DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
*ExtCode = Buf;
|
||
|
- //fprintf(stderr, "### <- DGifGetExtension: %02x, about to call next\n", Buf);
|
||
|
+ // fprintf(stderr, "### <- DGifGetExtension: %02x, about to call
|
||
|
+ // next\n", Buf);
|
||
|
|
||
|
return DGifGetExtensionNext(GifFile, Extension);
|
||
|
}
|
||
|
@@ -613,30 +616,30 @@ DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension)
|
||
|
routine should be called until NULL Extension is returned.
|
||
|
The Extension should NOT be freed by the user (not dynamically allocated).
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetExtensionNext(GifFileType *GifFile, GifByteType ** Extension)
|
||
|
-{
|
||
|
+int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **Extension) {
|
||
|
GifByteType Buf;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
- //fprintf(stderr, "### -> DGifGetExtensionNext\n");
|
||
|
+ // fprintf(stderr, "### -> DGifGetExtensionNext\n");
|
||
|
if (InternalRead(GifFile, &Buf, 1) != 1) {
|
||
|
GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
- //fprintf(stderr, "### DGifGetExtensionNext sees %d\n", Buf);
|
||
|
+ // fprintf(stderr, "### DGifGetExtensionNext sees %d\n", Buf);
|
||
|
|
||
|
if (Buf > 0) {
|
||
|
- *Extension = Private->Buf; /* Use private unused buffer. */
|
||
|
- (*Extension)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */
|
||
|
- /* coverity[tainted_data,check_return] */
|
||
|
+ *Extension = Private->Buf; /* Use private unused buffer. */
|
||
|
+ (*Extension)[0] =
|
||
|
+ Buf; /* Pascal strings notation (pos. 0 is len.). */
|
||
|
+ /* coverity[tainted_data,check_return] */
|
||
|
if (InternalRead(GifFile, &((*Extension)[1]), Buf) != Buf) {
|
||
|
GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
- } else
|
||
|
+ } else {
|
||
|
*Extension = NULL;
|
||
|
- //fprintf(stderr, "### <- DGifGetExtensionNext: %p\n", Extension);
|
||
|
+ }
|
||
|
+ // fprintf(stderr, "### <- DGifGetExtensionNext: %p\n", Extension);
|
||
|
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
@@ -647,19 +650,20 @@ DGifGetExtensionNext(GifFileType *GifFile, GifByteType ** Extension)
|
||
|
|
||
|
int DGifExtensionToGCB(const size_t GifExtensionLength,
|
||
|
const GifByteType *GifExtension,
|
||
|
- GraphicsControlBlock *GCB)
|
||
|
-{
|
||
|
+ GraphicsControlBlock *GCB) {
|
||
|
if (GifExtensionLength != 4) {
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
GCB->DisposalMode = (GifExtension[0] >> 2) & 0x07;
|
||
|
GCB->UserInputFlag = (GifExtension[0] & 0x02) != 0;
|
||
|
- GCB->DelayTime = UNSIGNED_LITTLE_ENDIAN(GifExtension[1], GifExtension[2]);
|
||
|
- if (GifExtension[0] & 0x01)
|
||
|
+ GCB->DelayTime =
|
||
|
+ UNSIGNED_LITTLE_ENDIAN(GifExtension[1], GifExtension[2]);
|
||
|
+ if (GifExtension[0] & 0x01) {
|
||
|
GCB->TransparentColor = (int)GifExtension[3];
|
||
|
- else
|
||
|
+ } else {
|
||
|
GCB->TransparentColor = NO_TRANSPARENT_COLOR;
|
||
|
+ }
|
||
|
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
@@ -668,23 +672,27 @@ int DGifExtensionToGCB(const size_t GifExtensionLength,
|
||
|
Extract the Graphics Control Block for a saved image, if it exists.
|
||
|
******************************************************************************/
|
||
|
|
||
|
-int DGifSavedExtensionToGCB(GifFileType *GifFile,
|
||
|
- int ImageIndex, GraphicsControlBlock *GCB)
|
||
|
-{
|
||
|
+int DGifSavedExtensionToGCB(GifFileType *GifFile, int ImageIndex,
|
||
|
+ GraphicsControlBlock *GCB) {
|
||
|
int i;
|
||
|
|
||
|
- if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1)
|
||
|
+ if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
|
||
|
GCB->DisposalMode = DISPOSAL_UNSPECIFIED;
|
||
|
GCB->UserInputFlag = false;
|
||
|
GCB->DelayTime = 0;
|
||
|
GCB->TransparentColor = NO_TRANSPARENT_COLOR;
|
||
|
|
||
|
- for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; i++) {
|
||
|
- ExtensionBlock *ep = &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i];
|
||
|
- if (ep->Function == GRAPHICS_EXT_FUNC_CODE)
|
||
|
- return DGifExtensionToGCB(ep->ByteCount, ep->Bytes, GCB);
|
||
|
+ for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount;
|
||
|
+ i++) {
|
||
|
+ ExtensionBlock *ep =
|
||
|
+ &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i];
|
||
|
+ if (ep->Function == GRAPHICS_EXT_FUNC_CODE) {
|
||
|
+ return DGifExtensionToGCB(ep->ByteCount, ep->Bytes,
|
||
|
+ GCB);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
return GIF_ERROR;
|
||
|
@@ -693,13 +701,12 @@ int DGifSavedExtensionToGCB(GifFileType *GifFile,
|
||
|
/******************************************************************************
|
||
|
This routine should be called last, to close the GIF file.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifCloseFile(GifFileType *GifFile, int *ErrorCode)
|
||
|
-{
|
||
|
+int DGifCloseFile(GifFileType *GifFile, int *ErrorCode) {
|
||
|
GifFilePrivateType *Private;
|
||
|
|
||
|
- if (GifFile == NULL || GifFile->Private == NULL)
|
||
|
+ if (GifFile == NULL || GifFile->Private == NULL) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
|
||
|
if (GifFile->Image.ColorMap) {
|
||
|
GifFreeMapObject(GifFile->Image.ColorMap);
|
||
|
@@ -716,22 +723,25 @@ DGifCloseFile(GifFileType *GifFile, int *ErrorCode)
|
||
|
GifFile->SavedImages = NULL;
|
||
|
}
|
||
|
|
||
|
- GifFreeExtensions(&GifFile->ExtensionBlockCount, &GifFile->ExtensionBlocks);
|
||
|
+ GifFreeExtensions(&GifFile->ExtensionBlockCount,
|
||
|
+ &GifFile->ExtensionBlocks);
|
||
|
|
||
|
- Private = (GifFilePrivateType *) GifFile->Private;
|
||
|
+ Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
if (!IS_READABLE(Private)) {
|
||
|
/* This file was NOT open for reading: */
|
||
|
- if (ErrorCode != NULL)
|
||
|
+ if (ErrorCode != NULL) {
|
||
|
*ErrorCode = D_GIF_ERR_NOT_READABLE;
|
||
|
+ }
|
||
|
free((char *)GifFile->Private);
|
||
|
free(GifFile);
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
if (Private->File && (fclose(Private->File) != 0)) {
|
||
|
- if (ErrorCode != NULL)
|
||
|
+ if (ErrorCode != NULL) {
|
||
|
*ErrorCode = D_GIF_ERR_CLOSE_FAILED;
|
||
|
+ }
|
||
|
free((char *)GifFile->Private);
|
||
|
free(GifFile);
|
||
|
return GIF_ERROR;
|
||
|
@@ -739,17 +749,16 @@ DGifCloseFile(GifFileType *GifFile, int *ErrorCode)
|
||
|
|
||
|
free((char *)GifFile->Private);
|
||
|
free(GifFile);
|
||
|
- if (ErrorCode != NULL)
|
||
|
+ if (ErrorCode != NULL) {
|
||
|
*ErrorCode = D_GIF_SUCCEEDED;
|
||
|
+ }
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
Get 2 bytes (word) from the given file:
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifGetWord(GifFileType *GifFile, GifWord *Word)
|
||
|
-{
|
||
|
+static int DGifGetWord(GifFileType *GifFile, GifWord *Word) {
|
||
|
unsigned char c[2];
|
||
|
|
||
|
/* coverity[check_return] */
|
||
|
@@ -769,9 +778,7 @@ DGifGetWord(GifFileType *GifFile, GifWord *Word)
|
||
|
to DGifGetCodeNext, until NULL block is returned.
|
||
|
The block should NOT be freed by the user (not dynamically allocated).
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock)
|
||
|
-{
|
||
|
+int DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock) {
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
if (!IS_READABLE(Private)) {
|
||
|
@@ -790,9 +797,7 @@ DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock)
|
||
|
called until NULL block is returned.
|
||
|
The block should NOT be freed by the user (not dynamically allocated).
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock)
|
||
|
-{
|
||
|
+int DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock) {
|
||
|
GifByteType Buf;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
@@ -805,17 +810,19 @@ DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock)
|
||
|
|
||
|
/* coverity[lower_bounds] */
|
||
|
if (Buf > 0) {
|
||
|
- *CodeBlock = Private->Buf; /* Use private unused buffer. */
|
||
|
- (*CodeBlock)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */
|
||
|
- /* coverity[tainted_data] */
|
||
|
+ *CodeBlock = Private->Buf; /* Use private unused buffer. */
|
||
|
+ (*CodeBlock)[0] =
|
||
|
+ Buf; /* Pascal strings notation (pos. 0 is len.). */
|
||
|
+ /* coverity[tainted_data] */
|
||
|
if (InternalRead(GifFile, &((*CodeBlock)[1]), Buf) != Buf) {
|
||
|
GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
} else {
|
||
|
*CodeBlock = NULL;
|
||
|
- Private->Buf[0] = 0; /* Make sure the buffer is empty! */
|
||
|
- Private->PixelCount = 0; /* And local info. indicate image read. */
|
||
|
+ Private->Buf[0] = 0; /* Make sure the buffer is empty! */
|
||
|
+ Private->PixelCount =
|
||
|
+ 0; /* And local info. indicate image read. */
|
||
|
}
|
||
|
|
||
|
return GIF_OK;
|
||
|
@@ -824,41 +831,43 @@ DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock)
|
||
|
/******************************************************************************
|
||
|
Setup the LZ decompression for this image:
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifSetupDecompress(GifFileType *GifFile)
|
||
|
-{
|
||
|
+static int DGifSetupDecompress(GifFileType *GifFile) {
|
||
|
int i, BitsPerPixel;
|
||
|
GifByteType CodeSize;
|
||
|
GifPrefixType *Prefix;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
/* coverity[check_return] */
|
||
|
- if (InternalRead(GifFile, &CodeSize, 1) < 1) { /* Read Code size from file. */
|
||
|
- return GIF_ERROR; /* Failed to read Code size. */
|
||
|
+ if (InternalRead(GifFile, &CodeSize, 1) <
|
||
|
+ 1) { /* Read Code size from file. */
|
||
|
+ GifFile->Error = D_GIF_ERR_READ_FAILED;
|
||
|
+ return GIF_ERROR; /* Failed to read Code size. */
|
||
|
}
|
||
|
BitsPerPixel = CodeSize;
|
||
|
|
||
|
/* this can only happen on a severely malformed GIF */
|
||
|
if (BitsPerPixel > 8) {
|
||
|
- GifFile->Error = D_GIF_ERR_READ_FAILED; /* somewhat bogus error code */
|
||
|
- return GIF_ERROR; /* Failed to read Code size. */
|
||
|
+ GifFile->Error =
|
||
|
+ D_GIF_ERR_READ_FAILED; /* somewhat bogus error code */
|
||
|
+ return GIF_ERROR; /* Failed to read Code size. */
|
||
|
}
|
||
|
|
||
|
- Private->Buf[0] = 0; /* Input Buffer empty. */
|
||
|
+ Private->Buf[0] = 0; /* Input Buffer empty. */
|
||
|
Private->BitsPerPixel = BitsPerPixel;
|
||
|
Private->ClearCode = (1 << BitsPerPixel);
|
||
|
Private->EOFCode = Private->ClearCode + 1;
|
||
|
Private->RunningCode = Private->EOFCode + 1;
|
||
|
- Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */
|
||
|
- Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */
|
||
|
- Private->StackPtr = 0; /* No pixels on the pixel stack. */
|
||
|
+ Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */
|
||
|
+ Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */
|
||
|
+ Private->StackPtr = 0; /* No pixels on the pixel stack. */
|
||
|
Private->LastCode = NO_SUCH_CODE;
|
||
|
- Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */
|
||
|
+ Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */
|
||
|
Private->CrntShiftDWord = 0;
|
||
|
|
||
|
Prefix = Private->Prefix;
|
||
|
- for (i = 0; i <= LZ_MAX_CODE; i++)
|
||
|
+ for (i = 0; i <= LZ_MAX_CODE; i++) {
|
||
|
Prefix[i] = NO_SUCH_CODE;
|
||
|
+ }
|
||
|
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
@@ -869,14 +878,13 @@ DGifSetupDecompress(GifFileType *GifFile)
|
||
|
This routine can be called few times (one per scan line, for example), in
|
||
|
order the complete the whole image.
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
-{
|
||
|
+static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line,
|
||
|
+ int LineLen) {
|
||
|
int i = 0;
|
||
|
int j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr;
|
||
|
GifByteType *Stack, *Suffix;
|
||
|
GifPrefixType *Prefix;
|
||
|
- GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
|
||
|
+ GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
StackPtr = Private->StackPtr;
|
||
|
Prefix = Private->Prefix;
|
||
|
@@ -891,72 +899,88 @@ DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
}
|
||
|
|
||
|
if (StackPtr != 0) {
|
||
|
- /* Let pop the stack off before continueing to read the GIF file: */
|
||
|
- while (StackPtr != 0 && i < LineLen)
|
||
|
+ /* Let pop the stack off before continueing to read the GIF
|
||
|
+ * file: */
|
||
|
+ while (StackPtr != 0 && i < LineLen) {
|
||
|
Line[i++] = Stack[--StackPtr];
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
- while (i < LineLen) { /* Decode LineLen items. */
|
||
|
- if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR)
|
||
|
+ while (i < LineLen) { /* Decode LineLen items. */
|
||
|
+ if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
|
||
|
if (CrntCode == EOFCode) {
|
||
|
- /* Note however that usually we will not be here as we will stop
|
||
|
- * decoding as soon as we got all the pixel, or EOF code will
|
||
|
- * not be read at all, and DGifGetLine/Pixel clean everything. */
|
||
|
+ /* Note however that usually we will not be here as we
|
||
|
+ * will stop decoding as soon as we got all the pixel,
|
||
|
+ * or EOF code will not be read at all, and
|
||
|
+ * DGifGetLine/Pixel clean everything. */
|
||
|
GifFile->Error = D_GIF_ERR_EOF_TOO_SOON;
|
||
|
return GIF_ERROR;
|
||
|
} else if (CrntCode == ClearCode) {
|
||
|
/* We need to start over again: */
|
||
|
- for (j = 0; j <= LZ_MAX_CODE; j++)
|
||
|
+ for (j = 0; j <= LZ_MAX_CODE; j++) {
|
||
|
Prefix[j] = NO_SUCH_CODE;
|
||
|
+ }
|
||
|
Private->RunningCode = Private->EOFCode + 1;
|
||
|
Private->RunningBits = Private->BitsPerPixel + 1;
|
||
|
Private->MaxCode1 = 1 << Private->RunningBits;
|
||
|
LastCode = Private->LastCode = NO_SUCH_CODE;
|
||
|
} else {
|
||
|
- /* Its regular code - if in pixel range simply add it to output
|
||
|
- * stream, otherwise trace to codes linked list until the prefix
|
||
|
- * is in pixel range: */
|
||
|
+ /* Its regular code - if in pixel range simply add it to
|
||
|
+ * output stream, otherwise trace to codes linked list
|
||
|
+ * until the prefix is in pixel range: */
|
||
|
if (CrntCode < ClearCode) {
|
||
|
- /* This is simple - its pixel scalar, so add it to output: */
|
||
|
+ /* This is simple - its pixel scalar, so add it
|
||
|
+ * to output: */
|
||
|
Line[i++] = CrntCode;
|
||
|
} else {
|
||
|
- /* Its a code to needed to be traced: trace the linked list
|
||
|
- * until the prefix is a pixel, while pushing the suffix
|
||
|
- * pixels on our stack. If we done, pop the stack in reverse
|
||
|
- * (thats what stack is good for!) order to output. */
|
||
|
+ /* Its a code to needed to be traced: trace the
|
||
|
+ * linked list until the prefix is a pixel,
|
||
|
+ * while pushing the suffix pixels on our stack.
|
||
|
+ * If we done, pop the stack in reverse (thats
|
||
|
+ * what stack is good for!) order to output. */
|
||
|
if (Prefix[CrntCode] == NO_SUCH_CODE) {
|
||
|
CrntPrefix = LastCode;
|
||
|
|
||
|
- /* Only allowed if CrntCode is exactly the running code:
|
||
|
- * In that case CrntCode = XXXCode, CrntCode or the
|
||
|
- * prefix code is last code and the suffix char is
|
||
|
- * exactly the prefix of last code! */
|
||
|
- if (CrntCode == Private->RunningCode - 2) {
|
||
|
- Suffix[Private->RunningCode - 2] =
|
||
|
- Stack[StackPtr++] = DGifGetPrefixChar(Prefix,
|
||
|
- LastCode,
|
||
|
- ClearCode);
|
||
|
+ /* Only allowed if CrntCode is exactly
|
||
|
+ * the running code: In that case
|
||
|
+ * CrntCode = XXXCode, CrntCode or the
|
||
|
+ * prefix code is last code and the
|
||
|
+ * suffix char is exactly the prefix of
|
||
|
+ * last code! */
|
||
|
+ if (CrntCode ==
|
||
|
+ Private->RunningCode - 2) {
|
||
|
+ Suffix[Private->RunningCode -
|
||
|
+ 2] = Stack[StackPtr++] =
|
||
|
+ DGifGetPrefixChar(
|
||
|
+ Prefix, LastCode,
|
||
|
+ ClearCode);
|
||
|
} else {
|
||
|
- Suffix[Private->RunningCode - 2] =
|
||
|
- Stack[StackPtr++] = DGifGetPrefixChar(Prefix,
|
||
|
- CrntCode,
|
||
|
- ClearCode);
|
||
|
+ Suffix[Private->RunningCode -
|
||
|
+ 2] = Stack[StackPtr++] =
|
||
|
+ DGifGetPrefixChar(
|
||
|
+ Prefix, CrntCode,
|
||
|
+ ClearCode);
|
||
|
}
|
||
|
- } else
|
||
|
+ } else {
|
||
|
CrntPrefix = CrntCode;
|
||
|
+ }
|
||
|
|
||
|
- /* Now (if image is O.K.) we should not get a NO_SUCH_CODE
|
||
|
- * during the trace. As we might loop forever, in case of
|
||
|
- * defective image, we use StackPtr as loop counter and stop
|
||
|
- * before overflowing Stack[]. */
|
||
|
+ /* Now (if image is O.K.) we should not get a
|
||
|
+ * NO_SUCH_CODE during the trace. As we might
|
||
|
+ * loop forever, in case of defective image, we
|
||
|
+ * use StackPtr as loop counter and stop before
|
||
|
+ * overflowing Stack[]. */
|
||
|
while (StackPtr < LZ_MAX_CODE &&
|
||
|
- CrntPrefix > ClearCode && CrntPrefix <= LZ_MAX_CODE) {
|
||
|
+ CrntPrefix > ClearCode &&
|
||
|
+ CrntPrefix <= LZ_MAX_CODE) {
|
||
|
Stack[StackPtr++] = Suffix[CrntPrefix];
|
||
|
CrntPrefix = Prefix[CrntPrefix];
|
||
|
}
|
||
|
- if (StackPtr >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) {
|
||
|
+ if (StackPtr >= LZ_MAX_CODE ||
|
||
|
+ CrntPrefix > LZ_MAX_CODE) {
|
||
|
GifFile->Error = D_GIF_ERR_IMAGE_DEFECT;
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
@@ -964,22 +988,29 @@ DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
Stack[StackPtr++] = CrntPrefix;
|
||
|
|
||
|
/* Now lets pop all the stack into output: */
|
||
|
- while (StackPtr != 0 && i < LineLen)
|
||
|
+ while (StackPtr != 0 && i < LineLen) {
|
||
|
Line[i++] = Stack[--StackPtr];
|
||
|
+ }
|
||
|
}
|
||
|
- if (LastCode != NO_SUCH_CODE && Private->RunningCode - 2 < (LZ_MAX_CODE+1) && Prefix[Private->RunningCode - 2] == NO_SUCH_CODE) {
|
||
|
+ if (LastCode != NO_SUCH_CODE &&
|
||
|
+ Private->RunningCode - 2 < (LZ_MAX_CODE + 1) &&
|
||
|
+ Prefix[Private->RunningCode - 2] == NO_SUCH_CODE) {
|
||
|
Prefix[Private->RunningCode - 2] = LastCode;
|
||
|
|
||
|
if (CrntCode == Private->RunningCode - 2) {
|
||
|
- /* Only allowed if CrntCode is exactly the running code:
|
||
|
- * In that case CrntCode = XXXCode, CrntCode or the
|
||
|
- * prefix code is last code and the suffix char is
|
||
|
- * exactly the prefix of last code! */
|
||
|
+ /* Only allowed if CrntCode is exactly
|
||
|
+ * the running code: In that case
|
||
|
+ * CrntCode = XXXCode, CrntCode or the
|
||
|
+ * prefix code is last code and the
|
||
|
+ * suffix char is exactly the prefix of
|
||
|
+ * last code! */
|
||
|
Suffix[Private->RunningCode - 2] =
|
||
|
- DGifGetPrefixChar(Prefix, LastCode, ClearCode);
|
||
|
+ DGifGetPrefixChar(Prefix, LastCode,
|
||
|
+ ClearCode);
|
||
|
} else {
|
||
|
Suffix[Private->RunningCode - 2] =
|
||
|
- DGifGetPrefixChar(Prefix, CrntCode, ClearCode);
|
||
|
+ DGifGetPrefixChar(Prefix, CrntCode,
|
||
|
+ ClearCode);
|
||
|
}
|
||
|
}
|
||
|
LastCode = CrntCode;
|
||
|
@@ -998,9 +1029,8 @@ DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
|
||
|
If image is defective, we might loop here forever, so we limit the loops to
|
||
|
the maximum possible if image O.k. - LZ_MAX_CODE times.
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode)
|
||
|
-{
|
||
|
+static int DGifGetPrefixChar(const GifPrefixType *Prefix, int Code,
|
||
|
+ int ClearCode) {
|
||
|
int i = 0;
|
||
|
|
||
|
while (Code > ClearCode && i++ <= LZ_MAX_CODE) {
|
||
|
@@ -1016,9 +1046,7 @@ DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode)
|
||
|
Interface for accessing the LZ codes directly. Set Code to the real code
|
||
|
(12bits), or to -1 if EOF code is returned.
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-DGifGetLZCodes(GifFileType *GifFile, int *Code)
|
||
|
-{
|
||
|
+int DGifGetLZCodes(GifFileType *GifFile, int *Code) {
|
||
|
GifByteType *CodeBlock;
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
@@ -1028,15 +1056,18 @@ DGifGetLZCodes(GifFileType *GifFile, int *Code)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
|
||
|
- if (DGifDecompressInput(GifFile, Code) == GIF_ERROR)
|
||
|
+ if (DGifDecompressInput(GifFile, Code) == GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
+ }
|
||
|
|
||
|
if (*Code == Private->EOFCode) {
|
||
|
- /* Skip rest of codes (hopefully only NULL terminating block): */
|
||
|
+ /* Skip rest of codes (hopefully only NULL terminating block):
|
||
|
+ */
|
||
|
do {
|
||
|
- if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR)
|
||
|
+ if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
- } while (CodeBlock != NULL) ;
|
||
|
+ }
|
||
|
+ } while (CodeBlock != NULL);
|
||
|
|
||
|
*Code = -1;
|
||
|
} else if (*Code == Private->ClearCode) {
|
||
|
@@ -1055,15 +1086,10 @@ DGifGetLZCodes(GifFileType *GifFile, int *Code)
|
||
|
8 bits (bytes) packets, into the real codes.
|
||
|
Returns GIF_OK if read successfully.
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifDecompressInput(GifFileType *GifFile, int *Code)
|
||
|
-{
|
||
|
+static int DGifDecompressInput(GifFileType *GifFile, int *Code) {
|
||
|
static const unsigned short CodeMasks[] = {
|
||
|
- 0x0000, 0x0001, 0x0003, 0x0007,
|
||
|
- 0x000f, 0x001f, 0x003f, 0x007f,
|
||
|
- 0x00ff, 0x01ff, 0x03ff, 0x07ff,
|
||
|
- 0x0fff
|
||
|
- };
|
||
|
+ 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f,
|
||
|
+ 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff};
|
||
|
|
||
|
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
|
||
|
|
||
|
@@ -1077,11 +1103,12 @@ DGifDecompressInput(GifFileType *GifFile, int *Code)
|
||
|
|
||
|
while (Private->CrntShiftState < Private->RunningBits) {
|
||
|
/* Needs to get more bytes from input stream for next code: */
|
||
|
- if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) == GIF_ERROR) {
|
||
|
+ if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) ==
|
||
|
+ GIF_ERROR) {
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
- Private->CrntShiftDWord |=
|
||
|
- ((unsigned long)NextByte) << Private->CrntShiftState;
|
||
|
+ Private->CrntShiftDWord |= ((unsigned long)NextByte)
|
||
|
+ << Private->CrntShiftState;
|
||
|
Private->CrntShiftState += 8;
|
||
|
}
|
||
|
*Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits];
|
||
|
@@ -1109,9 +1136,8 @@ DGifDecompressInput(GifFileType *GifFile, int *Code)
|
||
|
The routine returns the next byte from its internal buffer (or read next
|
||
|
block in if buffer empty) and returns GIF_OK if succesful.
|
||
|
******************************************************************************/
|
||
|
-static int
|
||
|
-DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte)
|
||
|
-{
|
||
|
+static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf,
|
||
|
+ GifByteType *NextByte) {
|
||
|
if (Buf[0] == 0) {
|
||
|
/* Needs to read the next buffer - this one is empty: */
|
||
|
/* coverity[check_return] */
|
||
|
@@ -1120,8 +1146,8 @@ DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
/* There shouldn't be any empty data blocks here as the LZW spec
|
||
|
- * says the LZW termination code should come first. Therefore we
|
||
|
- * shouldn't be inside this routine at that point.
|
||
|
+ * says the LZW termination code should come first. Therefore
|
||
|
+ * we shouldn't be inside this routine at that point.
|
||
|
*/
|
||
|
if (Buf[0] == 0) {
|
||
|
GifFile->Error = D_GIF_ERR_IMAGE_DEFECT;
|
||
|
@@ -1132,7 +1158,7 @@ DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte)
|
||
|
return GIF_ERROR;
|
||
|
}
|
||
|
*NextByte = Buf[1];
|
||
|
- Buf[1] = 2; /* We use now the second place as last char read! */
|
||
|
+ Buf[1] = 2; /* We use now the second place as last char read! */
|
||
|
Buf[0]--;
|
||
|
} else {
|
||
|
*NextByte = Buf[Buf[1]++];
|
||
|
@@ -1142,14 +1168,32 @@ DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte)
|
||
|
return GIF_OK;
|
||
|
}
|
||
|
|
||
|
+/******************************************************************************
|
||
|
+ This routine is called in case of error during parsing image. We need to
|
||
|
+ decrease image counter and reallocate memory for saved images. Not decreasing
|
||
|
+ ImageCount may lead to null pointer dereference, because the last element in
|
||
|
+ SavedImages may point to the spoilt image and null pointer buffers.
|
||
|
+*******************************************************************************/
|
||
|
+void DGifDecreaseImageCounter(GifFileType *GifFile) {
|
||
|
+ GifFile->ImageCount--;
|
||
|
+ if (GifFile->SavedImages[GifFile->ImageCount].RasterBits != NULL) {
|
||
|
+ free(GifFile->SavedImages[GifFile->ImageCount].RasterBits);
|
||
|
+ }
|
||
|
+
|
||
|
+ // Realloc array according to the new image counter.
|
||
|
+ SavedImage *correct_saved_images = (SavedImage *)reallocarray(
|
||
|
+ GifFile->SavedImages, GifFile->ImageCount, sizeof(SavedImage));
|
||
|
+ if (correct_saved_images != NULL) {
|
||
|
+ GifFile->SavedImages = correct_saved_images;
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
/******************************************************************************
|
||
|
This routine reads an entire GIF into core, hanging all its state info off
|
||
|
the GifFileType pointer. Call DGifOpenFileName() or DGifOpenFileHandle()
|
||
|
first to initialize I/O. Its inverse is EGifSpew().
|
||
|
*******************************************************************************/
|
||
|
-int
|
||
|
-DGifSlurp(GifFileType *GifFile)
|
||
|
-{
|
||
|
+int DGifSlurp(GifFileType *GifFile) {
|
||
|
size_t ImageSize;
|
||
|
GifRecordType RecordType;
|
||
|
SavedImage *sp;
|
||
|
@@ -1160,103 +1204,130 @@ DGifSlurp(GifFileType *GifFile)
|
||
|
GifFile->ExtensionBlockCount = 0;
|
||
|
|
||
|
do {
|
||
|
- if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR)
|
||
|
+ if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) {
|
||
|
return (GIF_ERROR);
|
||
|
+ }
|
||
|
|
||
|
switch (RecordType) {
|
||
|
- case IMAGE_DESC_RECORD_TYPE:
|
||
|
- if (DGifGetImageDesc(GifFile) == GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
-
|
||
|
- sp = &GifFile->SavedImages[GifFile->ImageCount - 1];
|
||
|
- /* Allocate memory for the image */
|
||
|
- if (sp->ImageDesc.Width <= 0 || sp->ImageDesc.Height <= 0 ||
|
||
|
- sp->ImageDesc.Width > (INT_MAX / sp->ImageDesc.Height)) {
|
||
|
- return GIF_ERROR;
|
||
|
- }
|
||
|
- ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height;
|
||
|
-
|
||
|
- if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) {
|
||
|
- return GIF_ERROR;
|
||
|
- }
|
||
|
- sp->RasterBits = (unsigned char *)reallocarray(NULL, ImageSize,
|
||
|
- sizeof(GifPixelType));
|
||
|
-
|
||
|
- if (sp->RasterBits == NULL) {
|
||
|
- return GIF_ERROR;
|
||
|
- }
|
||
|
-
|
||
|
- if (sp->ImageDesc.Interlace) {
|
||
|
- int i, j;
|
||
|
- /*
|
||
|
- * The way an interlaced image should be read -
|
||
|
- * offsets and jumps...
|
||
|
- */
|
||
|
- int InterlacedOffset[] = { 0, 4, 2, 1 };
|
||
|
- int InterlacedJumps[] = { 8, 8, 4, 2 };
|
||
|
- /* Need to perform 4 passes on the image */
|
||
|
- for (i = 0; i < 4; i++)
|
||
|
- for (j = InterlacedOffset[i];
|
||
|
- j < sp->ImageDesc.Height;
|
||
|
- j += InterlacedJumps[i]) {
|
||
|
- if (DGifGetLine(GifFile,
|
||
|
- sp->RasterBits+j*sp->ImageDesc.Width,
|
||
|
- sp->ImageDesc.Width) == GIF_ERROR)
|
||
|
- return GIF_ERROR;
|
||
|
- }
|
||
|
- }
|
||
|
- else {
|
||
|
- if (DGifGetLine(GifFile,sp->RasterBits,ImageSize)==GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
- }
|
||
|
-
|
||
|
- if (GifFile->ExtensionBlocks) {
|
||
|
- sp->ExtensionBlocks = GifFile->ExtensionBlocks;
|
||
|
- sp->ExtensionBlockCount = GifFile->ExtensionBlockCount;
|
||
|
-
|
||
|
- GifFile->ExtensionBlocks = NULL;
|
||
|
- GifFile->ExtensionBlockCount = 0;
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case EXTENSION_RECORD_TYPE:
|
||
|
- if (DGifGetExtension(GifFile,&ExtFunction,&ExtData) == GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
- /* Create an extension block with our data */
|
||
|
- if (ExtData != NULL) {
|
||
|
- if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount,
|
||
|
- &GifFile->ExtensionBlocks,
|
||
|
- ExtFunction, ExtData[0], &ExtData[1])
|
||
|
- == GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
- }
|
||
|
- for (;;) {
|
||
|
- if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
- if (ExtData == NULL)
|
||
|
- break;
|
||
|
- /* Continue the extension block */
|
||
|
- if (ExtData != NULL)
|
||
|
- if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount,
|
||
|
- &GifFile->ExtensionBlocks,
|
||
|
- CONTINUE_EXT_FUNC_CODE,
|
||
|
- ExtData[0], &ExtData[1]) == GIF_ERROR)
|
||
|
- return (GIF_ERROR);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case TERMINATE_RECORD_TYPE:
|
||
|
- break;
|
||
|
-
|
||
|
- default: /* Should be trapped by DGifGetRecordType */
|
||
|
- break;
|
||
|
+ case IMAGE_DESC_RECORD_TYPE:
|
||
|
+ if (DGifGetImageDesc(GifFile) == GIF_ERROR) {
|
||
|
+ return (GIF_ERROR);
|
||
|
+ }
|
||
|
+
|
||
|
+ sp = &GifFile->SavedImages[GifFile->ImageCount - 1];
|
||
|
+ /* Allocate memory for the image */
|
||
|
+ if (sp->ImageDesc.Width <= 0 ||
|
||
|
+ sp->ImageDesc.Height <= 0 ||
|
||
|
+ sp->ImageDesc.Width >
|
||
|
+ (INT_MAX / sp->ImageDesc.Height)) {
|
||
|
+ DGifDecreaseImageCounter(GifFile);
|
||
|
+ return GIF_ERROR;
|
||
|
+ }
|
||
|
+ ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height;
|
||
|
+
|
||
|
+ if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) {
|
||
|
+ DGifDecreaseImageCounter(GifFile);
|
||
|
+ return GIF_ERROR;
|
||
|
+ }
|
||
|
+ sp->RasterBits = (unsigned char *)reallocarray(
|
||
|
+ NULL, ImageSize, sizeof(GifPixelType));
|
||
|
+
|
||
|
+ if (sp->RasterBits == NULL) {
|
||
|
+ DGifDecreaseImageCounter(GifFile);
|
||
|
+ return GIF_ERROR;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (sp->ImageDesc.Interlace) {
|
||
|
+ int i, j;
|
||
|
+ /*
|
||
|
+ * The way an interlaced image should be read -
|
||
|
+ * offsets and jumps...
|
||
|
+ */
|
||
|
+ static const int InterlacedOffset[] = {0, 4, 2,
|
||
|
+ 1};
|
||
|
+ static const int InterlacedJumps[] = {8, 8, 4,
|
||
|
+ 2};
|
||
|
+ /* Need to perform 4 passes on the image */
|
||
|
+ for (i = 0; i < 4; i++) {
|
||
|
+ for (j = InterlacedOffset[i];
|
||
|
+ j < sp->ImageDesc.Height;
|
||
|
+ j += InterlacedJumps[i]) {
|
||
|
+ if (DGifGetLine(
|
||
|
+ GifFile,
|
||
|
+ sp->RasterBits +
|
||
|
+ j * sp->ImageDesc
|
||
|
+ .Width,
|
||
|
+ sp->ImageDesc.Width) ==
|
||
|
+ GIF_ERROR) {
|
||
|
+ DGifDecreaseImageCounter(
|
||
|
+ GifFile);
|
||
|
+ return GIF_ERROR;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ if (DGifGetLine(GifFile, sp->RasterBits,
|
||
|
+ ImageSize) == GIF_ERROR) {
|
||
|
+ DGifDecreaseImageCounter(GifFile);
|
||
|
+ return GIF_ERROR;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (GifFile->ExtensionBlocks) {
|
||
|
+ sp->ExtensionBlocks = GifFile->ExtensionBlocks;
|
||
|
+ sp->ExtensionBlockCount =
|
||
|
+ GifFile->ExtensionBlockCount;
|
||
|
+
|
||
|
+ GifFile->ExtensionBlocks = NULL;
|
||
|
+ GifFile->ExtensionBlockCount = 0;
|
||
|
+ }
|
||
|
+ break;
|
||
|
+
|
||
|
+ case EXTENSION_RECORD_TYPE:
|
||
|
+ if (DGifGetExtension(GifFile, &ExtFunction, &ExtData) ==
|
||
|
+ GIF_ERROR) {
|
||
|
+ return (GIF_ERROR);
|
||
|
+ }
|
||
|
+ /* Create an extension block with our data */
|
||
|
+ if (ExtData != NULL) {
|
||
|
+ if (GifAddExtensionBlock(
|
||
|
+ &GifFile->ExtensionBlockCount,
|
||
|
+ &GifFile->ExtensionBlocks, ExtFunction,
|
||
|
+ ExtData[0], &ExtData[1]) == GIF_ERROR) {
|
||
|
+ return (GIF_ERROR);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ for (;;) {
|
||
|
+ if (DGifGetExtensionNext(GifFile, &ExtData) ==
|
||
|
+ GIF_ERROR) {
|
||
|
+ return (GIF_ERROR);
|
||
|
+ }
|
||
|
+ if (ExtData == NULL) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ /* Continue the extension block */
|
||
|
+ if (GifAddExtensionBlock(
|
||
|
+ &GifFile->ExtensionBlockCount,
|
||
|
+ &GifFile->ExtensionBlocks,
|
||
|
+ CONTINUE_EXT_FUNC_CODE, ExtData[0],
|
||
|
+ &ExtData[1]) == GIF_ERROR) {
|
||
|
+ return (GIF_ERROR);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ break;
|
||
|
+
|
||
|
+ case TERMINATE_RECORD_TYPE:
|
||
|
+ break;
|
||
|
+
|
||
|
+ default: /* Should be trapped by DGifGetRecordType */
|
||
|
+ break;
|
||
|
}
|
||
|
} while (RecordType != TERMINATE_RECORD_TYPE);
|
||
|
|
||
|
/* Sanity check for corrupted file */
|
||
|
if (GifFile->ImageCount == 0) {
|
||
|
GifFile->Error = D_GIF_ERR_NO_IMAG_DSCR;
|
||
|
- return(GIF_ERROR);
|
||
|
+ return (GIF_ERROR);
|
||
|
}
|
||
|
|
||
|
return (GIF_OK);
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/gif_err.c b/jdk/src/share/native/sun/awt/giflib/gif_err.c
|
||
|
index db08838eff..3b6785f7c6 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/gif_err.c
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/gif_err.c
|
||
|
@@ -38,82 +38,80 @@ SPDX-License-Identifier: MIT
|
||
|
/*****************************************************************************
|
||
|
Return a string description of the last GIF error
|
||
|
*****************************************************************************/
|
||
|
-const char *
|
||
|
-GifErrorString(int ErrorCode)
|
||
|
-{
|
||
|
+const char *GifErrorString(int ErrorCode) {
|
||
|
const char *Err;
|
||
|
|
||
|
switch (ErrorCode) {
|
||
|
- case E_GIF_ERR_OPEN_FAILED:
|
||
|
+ case E_GIF_ERR_OPEN_FAILED:
|
||
|
Err = "Failed to open given file";
|
||
|
break;
|
||
|
- case E_GIF_ERR_WRITE_FAILED:
|
||
|
+ case E_GIF_ERR_WRITE_FAILED:
|
||
|
Err = "Failed to write to given file";
|
||
|
break;
|
||
|
- case E_GIF_ERR_HAS_SCRN_DSCR:
|
||
|
+ case E_GIF_ERR_HAS_SCRN_DSCR:
|
||
|
Err = "Screen descriptor has already been set";
|
||
|
break;
|
||
|
- case E_GIF_ERR_HAS_IMAG_DSCR:
|
||
|
+ case E_GIF_ERR_HAS_IMAG_DSCR:
|
||
|
Err = "Image descriptor is still active";
|
||
|
break;
|
||
|
- case E_GIF_ERR_NO_COLOR_MAP:
|
||
|
+ case E_GIF_ERR_NO_COLOR_MAP:
|
||
|
Err = "Neither global nor local color map";
|
||
|
break;
|
||
|
- case E_GIF_ERR_DATA_TOO_BIG:
|
||
|
+ case E_GIF_ERR_DATA_TOO_BIG:
|
||
|
Err = "Number of pixels bigger than width * height";
|
||
|
break;
|
||
|
- case E_GIF_ERR_NOT_ENOUGH_MEM:
|
||
|
+ case E_GIF_ERR_NOT_ENOUGH_MEM:
|
||
|
Err = "Failed to allocate required memory";
|
||
|
break;
|
||
|
- case E_GIF_ERR_DISK_IS_FULL:
|
||
|
+ case E_GIF_ERR_DISK_IS_FULL:
|
||
|
Err = "Write failed (disk full?)";
|
||
|
break;
|
||
|
- case E_GIF_ERR_CLOSE_FAILED:
|
||
|
+ case E_GIF_ERR_CLOSE_FAILED:
|
||
|
Err = "Failed to close given file";
|
||
|
break;
|
||
|
- case E_GIF_ERR_NOT_WRITEABLE:
|
||
|
+ case E_GIF_ERR_NOT_WRITEABLE:
|
||
|
Err = "Given file was not opened for write";
|
||
|
break;
|
||
|
- case D_GIF_ERR_OPEN_FAILED:
|
||
|
+ case D_GIF_ERR_OPEN_FAILED:
|
||
|
Err = "Failed to open given file";
|
||
|
break;
|
||
|
- case D_GIF_ERR_READ_FAILED:
|
||
|
+ case D_GIF_ERR_READ_FAILED:
|
||
|
Err = "Failed to read from given file";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NOT_GIF_FILE:
|
||
|
+ case D_GIF_ERR_NOT_GIF_FILE:
|
||
|
Err = "Data is not in GIF format";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NO_SCRN_DSCR:
|
||
|
+ case D_GIF_ERR_NO_SCRN_DSCR:
|
||
|
Err = "No screen descriptor detected";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NO_IMAG_DSCR:
|
||
|
+ case D_GIF_ERR_NO_IMAG_DSCR:
|
||
|
Err = "No Image Descriptor detected";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NO_COLOR_MAP:
|
||
|
+ case D_GIF_ERR_NO_COLOR_MAP:
|
||
|
Err = "Neither global nor local color map";
|
||
|
break;
|
||
|
- case D_GIF_ERR_WRONG_RECORD:
|
||
|
+ case D_GIF_ERR_WRONG_RECORD:
|
||
|
Err = "Wrong record type detected";
|
||
|
break;
|
||
|
- case D_GIF_ERR_DATA_TOO_BIG:
|
||
|
+ case D_GIF_ERR_DATA_TOO_BIG:
|
||
|
Err = "Number of pixels bigger than width * height";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NOT_ENOUGH_MEM:
|
||
|
+ case D_GIF_ERR_NOT_ENOUGH_MEM:
|
||
|
Err = "Failed to allocate required memory";
|
||
|
break;
|
||
|
- case D_GIF_ERR_CLOSE_FAILED:
|
||
|
+ case D_GIF_ERR_CLOSE_FAILED:
|
||
|
Err = "Failed to close given file";
|
||
|
break;
|
||
|
- case D_GIF_ERR_NOT_READABLE:
|
||
|
+ case D_GIF_ERR_NOT_READABLE:
|
||
|
Err = "Given file was not opened for read";
|
||
|
break;
|
||
|
- case D_GIF_ERR_IMAGE_DEFECT:
|
||
|
+ case D_GIF_ERR_IMAGE_DEFECT:
|
||
|
Err = "Image is defective, decoding aborted";
|
||
|
break;
|
||
|
- case D_GIF_ERR_EOF_TOO_SOON:
|
||
|
+ case D_GIF_ERR_EOF_TOO_SOON:
|
||
|
Err = "Image EOF detected before image complete";
|
||
|
break;
|
||
|
- default:
|
||
|
+ default:
|
||
|
Err = NULL;
|
||
|
break;
|
||
|
}
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/gif_hash.h b/jdk/src/share/native/sun/awt/giflib/gif_hash.h
|
||
|
index 6cabd0866e..bd00af6416 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/gif_hash.h
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/gif_hash.h
|
||
|
@@ -33,27 +33,25 @@ SPDX-License-Identifier: MIT
|
||
|
#ifndef _GIF_HASH_H_
|
||
|
#define _GIF_HASH_H_
|
||
|
|
||
|
-/** Begin JDK modifications to support building on Windows **/
|
||
|
#ifndef _WIN32
|
||
|
#include <unistd.h>
|
||
|
-#endif
|
||
|
-/** End JDK modifications to support building on Windows **/
|
||
|
+#endif /* _WIN32 */
|
||
|
#include <stdint.h>
|
||
|
|
||
|
-#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */
|
||
|
-#define HT_KEY_MASK 0x1FFF /* 13bits keys */
|
||
|
-#define HT_KEY_NUM_BITS 13 /* 13bits keys */
|
||
|
-#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */
|
||
|
-#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
|
||
|
+#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */
|
||
|
+#define HT_KEY_MASK 0x1FFF /* 13bits keys */
|
||
|
+#define HT_KEY_NUM_BITS 13 /* 13bits keys */
|
||
|
+#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */
|
||
|
+#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
|
||
|
|
||
|
/* The 32 bits of the long are divided into two parts for the key & code: */
|
||
|
/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */
|
||
|
-/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */
|
||
|
+/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */
|
||
|
/* The key is the upper 20 bits. The code is the lower 12. */
|
||
|
-#define HT_GET_KEY(l) (l >> 12)
|
||
|
-#define HT_GET_CODE(l) (l & 0x0FFF)
|
||
|
-#define HT_PUT_KEY(l) (l << 12)
|
||
|
-#define HT_PUT_CODE(l) (l & 0x0FFF)
|
||
|
+#define HT_GET_KEY(l) (l >> 12)
|
||
|
+#define HT_GET_CODE(l) (l & 0x0FFF)
|
||
|
+#define HT_PUT_KEY(l) (l << 12)
|
||
|
+#define HT_PUT_CODE(l) (l & 0x0FFF)
|
||
|
|
||
|
typedef struct GifHashTableType {
|
||
|
uint32_t HTable[HT_SIZE];
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/gif_lib.h b/jdk/src/share/native/sun/awt/giflib/gif_lib.h
|
||
|
index f739b36adf..716dc7e8ba 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/gif_lib.h
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/gif_lib.h
|
||
|
@@ -39,27 +39,30 @@ extern "C" {
|
||
|
|
||
|
#define GIFLIB_MAJOR 5
|
||
|
#define GIFLIB_MINOR 2
|
||
|
-#define GIFLIB_RELEASE 1
|
||
|
+#define GIFLIB_RELEASE 2
|
||
|
|
||
|
-#define GIF_ERROR 0
|
||
|
-#define GIF_OK 1
|
||
|
+#define GIF_ERROR 0
|
||
|
+#define GIF_OK 1
|
||
|
|
||
|
#include <stddef.h>
|
||
|
/** Begin JDK modifications to support building using old compilers**/
|
||
|
-//#include <stdbool.h>
|
||
|
+#ifndef _WIN32
|
||
|
+#include <stdbool.h>
|
||
|
+#else
|
||
|
#ifdef bool
|
||
|
#undef bool
|
||
|
#endif
|
||
|
typedef int bool;
|
||
|
#define false 0
|
||
|
#define true 1
|
||
|
+#endif
|
||
|
/** End JDK modifications to support building using old compilers**/
|
||
|
|
||
|
-#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
|
||
|
+#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
|
||
|
#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
|
||
|
-#define GIF_VERSION_POS 3 /* Version first character in stamp. */
|
||
|
-#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
|
||
|
-#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
|
||
|
+#define GIF_VERSION_POS 3 /* Version first character in stamp. */
|
||
|
+#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
|
||
|
+#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
|
||
|
|
||
|
typedef unsigned char GifPixelType;
|
||
|
typedef unsigned char *GifRowType;
|
||
|
@@ -75,24 +78,24 @@ typedef struct ColorMapObject {
|
||
|
int ColorCount;
|
||
|
int BitsPerPixel;
|
||
|
bool SortFlag;
|
||
|
- GifColorType *Colors; /* on malloc(3) heap */
|
||
|
+ GifColorType *Colors; /* on malloc(3) heap */
|
||
|
} ColorMapObject;
|
||
|
|
||
|
typedef struct GifImageDesc {
|
||
|
- GifWord Left, Top, Width, Height; /* Current image dimensions. */
|
||
|
- bool Interlace; /* Sequential/Interlaced lines. */
|
||
|
- ColorMapObject *ColorMap; /* The local color map */
|
||
|
+ GifWord Left, Top, Width, Height; /* Current image dimensions. */
|
||
|
+ bool Interlace; /* Sequential/Interlaced lines. */
|
||
|
+ ColorMapObject *ColorMap; /* The local color map */
|
||
|
} GifImageDesc;
|
||
|
|
||
|
typedef struct ExtensionBlock {
|
||
|
int ByteCount;
|
||
|
- GifByteType *Bytes; /* on malloc(3) heap */
|
||
|
- int Function; /* The block function code */
|
||
|
-#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */
|
||
|
-#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
|
||
|
-#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */
|
||
|
-#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
|
||
|
-#define APPLICATION_EXT_FUNC_CODE 0xff /* application block (GIF89) */
|
||
|
+ GifByteType *Bytes; /* on malloc(3) heap */
|
||
|
+ int Function; /* The block function code */
|
||
|
+#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */
|
||
|
+#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
|
||
|
+#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */
|
||
|
+#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
|
||
|
+#define APPLICATION_EXT_FUNC_CODE 0xff /* application block (GIF89) */
|
||
|
} ExtensionBlock;
|
||
|
|
||
|
typedef struct SavedImage {
|
||
|
@@ -103,22 +106,22 @@ typedef struct SavedImage {
|
||
|
} SavedImage;
|
||
|
|
||
|
typedef struct GifFileType {
|
||
|
- GifWord SWidth, SHeight; /* Size of virtual canvas */
|
||
|
- GifWord SColorResolution; /* How many colors can we generate? */
|
||
|
- GifWord SBackGroundColor; /* Background color for virtual canvas */
|
||
|
- GifByteType AspectByte; /* Used to compute pixel aspect ratio */
|
||
|
- ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */
|
||
|
- int ImageCount; /* Number of current image (both APIs) */
|
||
|
- GifImageDesc Image; /* Current image (low-level API) */
|
||
|
- SavedImage *SavedImages; /* Image sequence (high-level API) */
|
||
|
- int ExtensionBlockCount; /* Count extensions past last image */
|
||
|
+ GifWord SWidth, SHeight; /* Size of virtual canvas */
|
||
|
+ GifWord SColorResolution; /* How many colors can we generate? */
|
||
|
+ GifWord SBackGroundColor; /* Background color for virtual canvas */
|
||
|
+ GifByteType AspectByte; /* Used to compute pixel aspect ratio */
|
||
|
+ ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */
|
||
|
+ int ImageCount; /* Number of current image (both APIs) */
|
||
|
+ GifImageDesc Image; /* Current image (low-level API) */
|
||
|
+ SavedImage *SavedImages; /* Image sequence (high-level API) */
|
||
|
+ int ExtensionBlockCount; /* Count extensions past last image */
|
||
|
ExtensionBlock *ExtensionBlocks; /* Extensions past last image */
|
||
|
int Error; /* Last error condition reported */
|
||
|
void *UserData; /* hook to attach user data (TVT) */
|
||
|
void *Private; /* Don't mess with this! */
|
||
|
} GifFileType;
|
||
|
|
||
|
-#define GIF_ASPECT_RATIO(n) ((n)+15.0/64.0)
|
||
|
+#define GIF_ASPECT_RATIO(n) ((n) + 15.0 / 64.0)
|
||
|
|
||
|
typedef enum {
|
||
|
UNDEFINED_RECORD_TYPE,
|
||
|
@@ -129,12 +132,12 @@ typedef enum {
|
||
|
} GifRecordType;
|
||
|
|
||
|
/* func type to read gif data from arbitrary sources (TVT) */
|
||
|
-typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
|
||
|
+typedef int (*InputFunc)(GifFileType *, GifByteType *, int);
|
||
|
|
||
|
/* func type to write gif data to arbitrary targets.
|
||
|
* Returns count of bytes written. (MRB)
|
||
|
*/
|
||
|
-typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int);
|
||
|
+typedef int (*OutputFunc)(GifFileType *, const GifByteType *, int);
|
||
|
|
||
|
/******************************************************************************
|
||
|
GIF89 structures
|
||
|
@@ -142,14 +145,14 @@ typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int);
|
||
|
|
||
|
typedef struct GraphicsControlBlock {
|
||
|
int DisposalMode;
|
||
|
-#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */
|
||
|
-#define DISPOSE_DO_NOT 1 /* Leave image in place */
|
||
|
-#define DISPOSE_BACKGROUND 2 /* Set area too background color */
|
||
|
-#define DISPOSE_PREVIOUS 3 /* Restore to previous content */
|
||
|
- bool UserInputFlag; /* User confirmation required before disposal */
|
||
|
- int DelayTime; /* pre-display delay in 0.01sec units */
|
||
|
- int TransparentColor; /* Palette index for transparency, -1 if none */
|
||
|
-#define NO_TRANSPARENT_COLOR -1
|
||
|
+#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */
|
||
|
+#define DISPOSE_DO_NOT 1 /* Leave image in place */
|
||
|
+#define DISPOSE_BACKGROUND 2 /* Set area too background color */
|
||
|
+#define DISPOSE_PREVIOUS 3 /* Restore to previous content */
|
||
|
+ bool UserInputFlag; /* User confirmation required before disposal */
|
||
|
+ int DelayTime; /* pre-display delay in 0.01sec units */
|
||
|
+ int TransparentColor; /* Palette index for transparency, -1 if none */
|
||
|
+#define NO_TRANSPARENT_COLOR -1
|
||
|
} GraphicsControlBlock;
|
||
|
|
||
|
/******************************************************************************
|
||
|
@@ -161,49 +164,44 @@ GifFileType *EGifOpenFileName(const char *GifFileName,
|
||
|
const bool GifTestExistence, int *Error);
|
||
|
GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error);
|
||
|
GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error);
|
||
|
-int EGifSpew(GifFileType * GifFile);
|
||
|
+int EGifSpew(GifFileType *GifFile);
|
||
|
const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */
|
||
|
int EGifCloseFile(GifFileType *GifFile, int *ErrorCode);
|
||
|
|
||
|
-#define E_GIF_SUCCEEDED 0
|
||
|
-#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */
|
||
|
-#define E_GIF_ERR_WRITE_FAILED 2
|
||
|
-#define E_GIF_ERR_HAS_SCRN_DSCR 3
|
||
|
-#define E_GIF_ERR_HAS_IMAG_DSCR 4
|
||
|
-#define E_GIF_ERR_NO_COLOR_MAP 5
|
||
|
-#define E_GIF_ERR_DATA_TOO_BIG 6
|
||
|
+#define E_GIF_SUCCEEDED 0
|
||
|
+#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */
|
||
|
+#define E_GIF_ERR_WRITE_FAILED 2
|
||
|
+#define E_GIF_ERR_HAS_SCRN_DSCR 3
|
||
|
+#define E_GIF_ERR_HAS_IMAG_DSCR 4
|
||
|
+#define E_GIF_ERR_NO_COLOR_MAP 5
|
||
|
+#define E_GIF_ERR_DATA_TOO_BIG 6
|
||
|
#define E_GIF_ERR_NOT_ENOUGH_MEM 7
|
||
|
-#define E_GIF_ERR_DISK_IS_FULL 8
|
||
|
-#define E_GIF_ERR_CLOSE_FAILED 9
|
||
|
-#define E_GIF_ERR_NOT_WRITEABLE 10
|
||
|
+#define E_GIF_ERR_DISK_IS_FULL 8
|
||
|
+#define E_GIF_ERR_CLOSE_FAILED 9
|
||
|
+#define E_GIF_ERR_NOT_WRITEABLE 10
|
||
|
|
||
|
/* These are legacy. You probably do not want to call them directly */
|
||
|
-int EGifPutScreenDesc(GifFileType *GifFile,
|
||
|
- const int GifWidth, const int GifHeight,
|
||
|
- const int GifColorRes,
|
||
|
+int EGifPutScreenDesc(GifFileType *GifFile, const int GifWidth,
|
||
|
+ const int GifHeight, const int GifColorRes,
|
||
|
const int GifBackGround,
|
||
|
const ColorMapObject *GifColorMap);
|
||
|
-int EGifPutImageDesc(GifFileType *GifFile,
|
||
|
- const int GifLeft, const int GifTop,
|
||
|
+int EGifPutImageDesc(GifFileType *GifFile, const int GifLeft, const int GifTop,
|
||
|
const int GifWidth, const int GifHeight,
|
||
|
const bool GifInterlace,
|
||
|
const ColorMapObject *GifColorMap);
|
||
|
void EGifSetGifVersion(GifFileType *GifFile, const bool gif89);
|
||
|
-int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine,
|
||
|
- int GifLineLen);
|
||
|
+int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
|
||
|
int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel);
|
||
|
int EGifPutComment(GifFileType *GifFile, const char *GifComment);
|
||
|
int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode);
|
||
|
-int EGifPutExtensionBlock(GifFileType *GifFile,
|
||
|
- const int GifExtLen, const void *GifExtension);
|
||
|
+int EGifPutExtensionBlock(GifFileType *GifFile, const int GifExtLen,
|
||
|
+ const void *GifExtension);
|
||
|
int EGifPutExtensionTrailer(GifFileType *GifFile);
|
||
|
int EGifPutExtension(GifFileType *GifFile, const int GifExtCode,
|
||
|
- const int GifExtLen,
|
||
|
- const void *GifExtension);
|
||
|
+ const int GifExtLen, const void *GifExtension);
|
||
|
int EGifPutCode(GifFileType *GifFile, int GifCodeSize,
|
||
|
const GifByteType *GifCodeBlock);
|
||
|
-int EGifPutCodeNext(GifFileType *GifFile,
|
||
|
- const GifByteType *GifCodeBlock);
|
||
|
+int EGifPutCodeNext(GifFileType *GifFile, const GifByteType *GifCodeBlock);
|
||
|
|
||
|
/******************************************************************************
|
||
|
GIF decoding routines
|
||
|
@@ -212,24 +210,25 @@ int EGifPutCodeNext(GifFileType *GifFile,
|
||
|
/* Main entry points */
|
||
|
GifFileType *DGifOpenFileName(const char *GifFileName, int *Error);
|
||
|
GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error);
|
||
|
-int DGifSlurp(GifFileType * GifFile);
|
||
|
-GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error); /* new one (TVT) */
|
||
|
- int DGifCloseFile(GifFileType * GifFile, int *ErrorCode);
|
||
|
-
|
||
|
-#define D_GIF_SUCCEEDED 0
|
||
|
-#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
|
||
|
-#define D_GIF_ERR_READ_FAILED 102
|
||
|
-#define D_GIF_ERR_NOT_GIF_FILE 103
|
||
|
-#define D_GIF_ERR_NO_SCRN_DSCR 104
|
||
|
-#define D_GIF_ERR_NO_IMAG_DSCR 105
|
||
|
-#define D_GIF_ERR_NO_COLOR_MAP 106
|
||
|
-#define D_GIF_ERR_WRONG_RECORD 107
|
||
|
-#define D_GIF_ERR_DATA_TOO_BIG 108
|
||
|
+int DGifSlurp(GifFileType *GifFile);
|
||
|
+GifFileType *DGifOpen(void *userPtr, InputFunc readFunc,
|
||
|
+ int *Error); /* new one (TVT) */
|
||
|
+int DGifCloseFile(GifFileType *GifFile, int *ErrorCode);
|
||
|
+
|
||
|
+#define D_GIF_SUCCEEDED 0
|
||
|
+#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
|
||
|
+#define D_GIF_ERR_READ_FAILED 102
|
||
|
+#define D_GIF_ERR_NOT_GIF_FILE 103
|
||
|
+#define D_GIF_ERR_NO_SCRN_DSCR 104
|
||
|
+#define D_GIF_ERR_NO_IMAG_DSCR 105
|
||
|
+#define D_GIF_ERR_NO_COLOR_MAP 106
|
||
|
+#define D_GIF_ERR_WRONG_RECORD 107
|
||
|
+#define D_GIF_ERR_DATA_TOO_BIG 108
|
||
|
#define D_GIF_ERR_NOT_ENOUGH_MEM 109
|
||
|
-#define D_GIF_ERR_CLOSE_FAILED 110
|
||
|
-#define D_GIF_ERR_NOT_READABLE 111
|
||
|
-#define D_GIF_ERR_IMAGE_DEFECT 112
|
||
|
-#define D_GIF_ERR_EOF_TOO_SOON 113
|
||
|
+#define D_GIF_ERR_CLOSE_FAILED 110
|
||
|
+#define D_GIF_ERR_NOT_READABLE 111
|
||
|
+#define D_GIF_ERR_IMAGE_DEFECT 112
|
||
|
+#define D_GIF_ERR_EOF_TOO_SOON 113
|
||
|
|
||
|
/* These are legacy. You probably do not want to call them directly */
|
||
|
int DGifGetScreenDesc(GifFileType *GifFile);
|
||
|
@@ -247,11 +246,10 @@ int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock);
|
||
|
int DGifGetLZCodes(GifFileType *GifFile, int *GifCode);
|
||
|
const char *DGifGetGifVersion(GifFileType *GifFile);
|
||
|
|
||
|
-
|
||
|
/******************************************************************************
|
||
|
Error handling and reporting.
|
||
|
******************************************************************************/
|
||
|
-extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */
|
||
|
+extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */
|
||
|
|
||
|
/*****************************************************************************
|
||
|
Everything below this point is new after version 1.2, supporting `slurp
|
||
|
@@ -263,26 +261,26 @@ extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */
|
||
|
******************************************************************************/
|
||
|
|
||
|
extern ColorMapObject *GifMakeMapObject(int ColorCount,
|
||
|
- const GifColorType *ColorMap);
|
||
|
+ const GifColorType *ColorMap);
|
||
|
extern void GifFreeMapObject(ColorMapObject *Object);
|
||
|
extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
- const ColorMapObject *ColorIn2,
|
||
|
- GifPixelType ColorTransIn2[]);
|
||
|
+ const ColorMapObject *ColorIn2,
|
||
|
+ GifPixelType ColorTransIn2[]);
|
||
|
extern int GifBitSize(int n);
|
||
|
|
||
|
/******************************************************************************
|
||
|
Support for the in-core structures allocation (slurp mode).
|
||
|
******************************************************************************/
|
||
|
|
||
|
-extern void GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]);
|
||
|
+extern void GifApplyTranslation(SavedImage *Image,
|
||
|
+ const GifPixelType Translation[]);
|
||
|
extern int GifAddExtensionBlock(int *ExtensionBlock_Count,
|
||
|
- ExtensionBlock **ExtensionBlocks,
|
||
|
- int Function,
|
||
|
+ ExtensionBlock **ExtensionBlocks, int Function,
|
||
|
unsigned int Len, unsigned char ExtData[]);
|
||
|
extern void GifFreeExtensions(int *ExtensionBlock_Count,
|
||
|
ExtensionBlock **ExtensionBlocks);
|
||
|
extern SavedImage *GifMakeSavedImage(GifFileType *GifFile,
|
||
|
- const SavedImage *CopyFrom);
|
||
|
+ const SavedImage *CopyFrom);
|
||
|
extern void GifFreeSavedImages(GifFileType *GifFile);
|
||
|
|
||
|
/******************************************************************************
|
||
|
@@ -295,37 +293,31 @@ int DGifExtensionToGCB(const size_t GifExtensionLength,
|
||
|
size_t EGifGCBToExtension(const GraphicsControlBlock *GCB,
|
||
|
GifByteType *GifExtension);
|
||
|
|
||
|
-int DGifSavedExtensionToGCB(GifFileType *GifFile,
|
||
|
- int ImageIndex,
|
||
|
+int DGifSavedExtensionToGCB(GifFileType *GifFile, int ImageIndex,
|
||
|
GraphicsControlBlock *GCB);
|
||
|
int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB,
|
||
|
- GifFileType *GifFile,
|
||
|
- int ImageIndex);
|
||
|
+ GifFileType *GifFile, int ImageIndex);
|
||
|
|
||
|
/******************************************************************************
|
||
|
The library's internal utility font
|
||
|
******************************************************************************/
|
||
|
|
||
|
-#define GIF_FONT_WIDTH 8
|
||
|
+#define GIF_FONT_WIDTH 8
|
||
|
#define GIF_FONT_HEIGHT 8
|
||
|
extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH];
|
||
|
|
||
|
-extern void GifDrawText8x8(SavedImage *Image,
|
||
|
- const int x, const int y,
|
||
|
- const char *legend, const int color);
|
||
|
+extern void GifDrawText8x8(SavedImage *Image, const int x, const int y,
|
||
|
+ const char *legend, const int color);
|
||
|
|
||
|
-extern void GifDrawBox(SavedImage *Image,
|
||
|
- const int x, const int y,
|
||
|
- const int w, const int d, const int color);
|
||
|
+extern void GifDrawBox(SavedImage *Image, const int x, const int y, const int w,
|
||
|
+ const int d, const int color);
|
||
|
|
||
|
-extern void GifDrawRectangle(SavedImage *Image,
|
||
|
- const int x, const int y,
|
||
|
- const int w, const int d, const int color);
|
||
|
+extern void GifDrawRectangle(SavedImage *Image, const int x, const int y,
|
||
|
+ const int w, const int d, const int color);
|
||
|
|
||
|
-extern void GifDrawBoxedText8x8(SavedImage *Image,
|
||
|
- const int x, const int y,
|
||
|
- const char *legend,
|
||
|
- const int border, const int bg, const int fg);
|
||
|
+extern void GifDrawBoxedText8x8(SavedImage *Image, const int x, const int y,
|
||
|
+ const char *legend, const int border,
|
||
|
+ const int bg, const int fg);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/gif_lib_private.h b/jdk/src/share/native/sun/awt/giflib/gif_lib_private.h
|
||
|
index 4f832676ff..f905e0d7b4 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/gif_lib_private.h
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/gif_lib_private.h
|
||
|
@@ -33,52 +33,54 @@ SPDX-License-Identifier: MIT
|
||
|
#ifndef _GIF_LIB_PRIVATE_H
|
||
|
#define _GIF_LIB_PRIVATE_H
|
||
|
|
||
|
-#include "gif_lib.h"
|
||
|
#include "gif_hash.h"
|
||
|
+#include "gif_lib.h"
|
||
|
|
||
|
#ifndef SIZE_MAX
|
||
|
- #define SIZE_MAX UINTPTR_MAX
|
||
|
+#define SIZE_MAX UINTPTR_MAX
|
||
|
#endif
|
||
|
|
||
|
-#define EXTENSION_INTRODUCER 0x21
|
||
|
-#define DESCRIPTOR_INTRODUCER 0x2c
|
||
|
-#define TERMINATOR_INTRODUCER 0x3b
|
||
|
+#define EXTENSION_INTRODUCER 0x21
|
||
|
+#define DESCRIPTOR_INTRODUCER 0x2c
|
||
|
+#define TERMINATOR_INTRODUCER 0x3b
|
||
|
|
||
|
-#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
|
||
|
-#define LZ_BITS 12
|
||
|
+#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
|
||
|
+#define LZ_BITS 12
|
||
|
|
||
|
-#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */
|
||
|
-#define FIRST_CODE 4097 /* Impossible code, to signal first. */
|
||
|
-#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */
|
||
|
+#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */
|
||
|
+#define FIRST_CODE 4097 /* Impossible code, to signal first. */
|
||
|
+#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */
|
||
|
|
||
|
-#define FILE_STATE_WRITE 0x01
|
||
|
-#define FILE_STATE_SCREEN 0x02
|
||
|
-#define FILE_STATE_IMAGE 0x04
|
||
|
-#define FILE_STATE_READ 0x08
|
||
|
+#define FILE_STATE_WRITE 0x01
|
||
|
+#define FILE_STATE_SCREEN 0x02
|
||
|
+#define FILE_STATE_IMAGE 0x04
|
||
|
+#define FILE_STATE_READ 0x08
|
||
|
|
||
|
-#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ)
|
||
|
-#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE)
|
||
|
+#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ)
|
||
|
+#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE)
|
||
|
|
||
|
typedef struct GifFilePrivateType {
|
||
|
- GifWord FileState, FileHandle, /* Where all this data goes to! */
|
||
|
- BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */
|
||
|
- ClearCode, /* The CLEAR LZ code. */
|
||
|
- EOFCode, /* The EOF LZ code. */
|
||
|
- RunningCode, /* The next code algorithm can generate. */
|
||
|
- RunningBits, /* The number of bits required to represent RunningCode. */
|
||
|
- MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */
|
||
|
- LastCode, /* The code before the current code. */
|
||
|
- CrntCode, /* Current algorithm code. */
|
||
|
- StackPtr, /* For character stack (see below). */
|
||
|
- CrntShiftState; /* Number of bits in CrntShiftDWord. */
|
||
|
- unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */
|
||
|
- unsigned long PixelCount; /* Number of pixels in image. */
|
||
|
- FILE *File; /* File as stream. */
|
||
|
- InputFunc Read; /* function to read gif input (TVT) */
|
||
|
- OutputFunc Write; /* function to write gif output (MRB) */
|
||
|
- GifByteType Buf[256]; /* Compressed input is buffered here. */
|
||
|
+ GifWord FileState, FileHandle, /* Where all this data goes to! */
|
||
|
+ BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */
|
||
|
+ ClearCode, /* The CLEAR LZ code. */
|
||
|
+ EOFCode, /* The EOF LZ code. */
|
||
|
+ RunningCode, /* The next code algorithm can generate. */
|
||
|
+ RunningBits, /* The number of bits required to represent
|
||
|
+ RunningCode. */
|
||
|
+ MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits.
|
||
|
+ */
|
||
|
+ LastCode, /* The code before the current code. */
|
||
|
+ CrntCode, /* Current algorithm code. */
|
||
|
+ StackPtr, /* For character stack (see below). */
|
||
|
+ CrntShiftState; /* Number of bits in CrntShiftDWord. */
|
||
|
+ unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */
|
||
|
+ unsigned long PixelCount; /* Number of pixels in image. */
|
||
|
+ FILE *File; /* File as stream. */
|
||
|
+ InputFunc Read; /* function to read gif input (TVT) */
|
||
|
+ OutputFunc Write; /* function to write gif output (MRB) */
|
||
|
+ GifByteType Buf[256]; /* Compressed input is buffered here. */
|
||
|
GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */
|
||
|
- GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */
|
||
|
+ GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */
|
||
|
GifPrefixType Prefix[LZ_MAX_CODE + 1];
|
||
|
GifHashTableType *HashTable;
|
||
|
bool gif89;
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/gifalloc.c b/jdk/src/share/native/sun/awt/giflib/gifalloc.c
|
||
|
index 75b74b4fba..5aef304455 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/gifalloc.c
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/gifalloc.c
|
||
|
@@ -30,59 +30,59 @@ SPDX-License-Identifier: MIT
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
-#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
+#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "gif_lib.h"
|
||
|
#include "gif_lib_private.h"
|
||
|
|
||
|
-#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||
|
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||
|
|
||
|
/******************************************************************************
|
||
|
Miscellaneous utility functions
|
||
|
******************************************************************************/
|
||
|
|
||
|
/* return smallest bitfield size n will fit in */
|
||
|
-int
|
||
|
-GifBitSize(int n)
|
||
|
-{
|
||
|
+int GifBitSize(int n) {
|
||
|
register int i;
|
||
|
|
||
|
- for (i = 1; i <= 8; i++)
|
||
|
- if ((1 << i) >= n)
|
||
|
+ for (i = 1; i <= 8; i++) {
|
||
|
+ if ((1 << i) >= n) {
|
||
|
break;
|
||
|
+ }
|
||
|
+ }
|
||
|
return (i);
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
- Color map object functions
|
||
|
+ Color map object functions
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*
|
||
|
* Allocate a color map of given size; initialize with contents of
|
||
|
* ColorMap if that pointer is non-NULL.
|
||
|
*/
|
||
|
-ColorMapObject *
|
||
|
-GifMakeMapObject(int ColorCount, const GifColorType *ColorMap)
|
||
|
-{
|
||
|
+ColorMapObject *GifMakeMapObject(int ColorCount, const GifColorType *ColorMap) {
|
||
|
ColorMapObject *Object;
|
||
|
|
||
|
/*** FIXME: Our ColorCount has to be a power of two. Is it necessary to
|
||
|
- * make the user know that or should we automatically round up instead? */
|
||
|
+ * make the user know that or should we automatically round up instead?
|
||
|
+ */
|
||
|
if (ColorCount != (1 << GifBitSize(ColorCount))) {
|
||
|
- return ((ColorMapObject *) NULL);
|
||
|
+ return ((ColorMapObject *)NULL);
|
||
|
}
|
||
|
|
||
|
Object = (ColorMapObject *)malloc(sizeof(ColorMapObject));
|
||
|
- if (Object == (ColorMapObject *) NULL) {
|
||
|
- return ((ColorMapObject *) NULL);
|
||
|
+ if (Object == (ColorMapObject *)NULL) {
|
||
|
+ return ((ColorMapObject *)NULL);
|
||
|
}
|
||
|
|
||
|
- Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType));
|
||
|
- if (Object->Colors == (GifColorType *) NULL) {
|
||
|
+ Object->Colors =
|
||
|
+ (GifColorType *)calloc(ColorCount, sizeof(GifColorType));
|
||
|
+ if (Object->Colors == (GifColorType *)NULL) {
|
||
|
free(Object);
|
||
|
- return ((ColorMapObject *) NULL);
|
||
|
+ return ((ColorMapObject *)NULL);
|
||
|
}
|
||
|
|
||
|
Object->ColorCount = ColorCount;
|
||
|
@@ -90,19 +90,17 @@ GifMakeMapObject(int ColorCount, const GifColorType *ColorMap)
|
||
|
Object->SortFlag = false;
|
||
|
|
||
|
if (ColorMap != NULL) {
|
||
|
- memcpy((char *)Object->Colors,
|
||
|
- (char *)ColorMap, ColorCount * sizeof(GifColorType));
|
||
|
+ memcpy((char *)Object->Colors, (char *)ColorMap,
|
||
|
+ ColorCount * sizeof(GifColorType));
|
||
|
}
|
||
|
|
||
|
return (Object);
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
-Free a color map object
|
||
|
+ Free a color map object
|
||
|
*******************************************************************************/
|
||
|
-void
|
||
|
-GifFreeMapObject(ColorMapObject *Object)
|
||
|
-{
|
||
|
+void GifFreeMapObject(ColorMapObject *Object) {
|
||
|
if (Object != NULL) {
|
||
|
(void)free(Object->Colors);
|
||
|
(void)free(Object);
|
||
|
@@ -110,17 +108,14 @@ GifFreeMapObject(ColorMapObject *Object)
|
||
|
}
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
-void
|
||
|
-DumpColorMap(ColorMapObject *Object,
|
||
|
- FILE * fp)
|
||
|
-{
|
||
|
+void DumpColorMap(ColorMapObject *Object, FILE *fp) {
|
||
|
if (Object != NULL) {
|
||
|
int i, j, Len = Object->ColorCount;
|
||
|
|
||
|
for (i = 0; i < Len; i += 4) {
|
||
|
for (j = 0; j < 4 && j < Len; j++) {
|
||
|
- (void)fprintf(fp, "%3d: %02x %02x %02x ", i + j,
|
||
|
- Object->Colors[i + j].Red,
|
||
|
+ (void)fprintf(fp, "%3d: %02x %02x %02x ",
|
||
|
+ i + j, Object->Colors[i + j].Red,
|
||
|
Object->Colors[i + j].Green,
|
||
|
Object->Colors[i + j].Blue);
|
||
|
}
|
||
|
@@ -137,11 +132,9 @@ DumpColorMap(ColorMapObject *Object,
|
||
|
copied iff they didn't exist before. ColorTransIn2 maps the old
|
||
|
ColorIn2 into the ColorUnion color map table./
|
||
|
*******************************************************************************/
|
||
|
-ColorMapObject *
|
||
|
-GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
- const ColorMapObject *ColorIn2,
|
||
|
- GifPixelType ColorTransIn2[])
|
||
|
-{
|
||
|
+ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
+ const ColorMapObject *ColorIn2,
|
||
|
+ GifPixelType ColorTransIn2[]) {
|
||
|
int i, j, CrntSlot, RoundUpTo, NewGifBitSize;
|
||
|
ColorMapObject *ColorUnion;
|
||
|
|
||
|
@@ -152,17 +145,19 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
*/
|
||
|
|
||
|
/* Allocate table which will hold the result for sure. */
|
||
|
- ColorUnion = GifMakeMapObject(MAX(ColorIn1->ColorCount,
|
||
|
- ColorIn2->ColorCount) * 2, NULL);
|
||
|
+ ColorUnion = GifMakeMapObject(
|
||
|
+ MAX(ColorIn1->ColorCount, ColorIn2->ColorCount) * 2, NULL);
|
||
|
|
||
|
- if (ColorUnion == NULL)
|
||
|
+ if (ColorUnion == NULL) {
|
||
|
return (NULL);
|
||
|
+ }
|
||
|
|
||
|
/*
|
||
|
* Copy ColorIn1 to ColorUnion.
|
||
|
*/
|
||
|
- for (i = 0; i < ColorIn1->ColorCount; i++)
|
||
|
+ for (i = 0; i < ColorIn1->ColorCount; i++) {
|
||
|
ColorUnion->Colors[i] = ColorIn1->Colors[i];
|
||
|
+ }
|
||
|
CrntSlot = ColorIn1->ColorCount;
|
||
|
|
||
|
/*
|
||
|
@@ -172,22 +167,25 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
* of table 1. This is very useful if your display is limited to
|
||
|
* 16 colors.
|
||
|
*/
|
||
|
- while (ColorIn1->Colors[CrntSlot - 1].Red == 0
|
||
|
- && ColorIn1->Colors[CrntSlot - 1].Green == 0
|
||
|
- && ColorIn1->Colors[CrntSlot - 1].Blue == 0)
|
||
|
+ while (ColorIn1->Colors[CrntSlot - 1].Red == 0 &&
|
||
|
+ ColorIn1->Colors[CrntSlot - 1].Green == 0 &&
|
||
|
+ ColorIn1->Colors[CrntSlot - 1].Blue == 0) {
|
||
|
CrntSlot--;
|
||
|
+ }
|
||
|
|
||
|
/* Copy ColorIn2 to ColorUnion (use old colors if they exist): */
|
||
|
for (i = 0; i < ColorIn2->ColorCount && CrntSlot <= 256; i++) {
|
||
|
/* Let's see if this color already exists: */
|
||
|
- for (j = 0; j < ColorIn1->ColorCount; j++)
|
||
|
- if (memcmp (&ColorIn1->Colors[j], &ColorIn2->Colors[i],
|
||
|
- sizeof(GifColorType)) == 0)
|
||
|
+ for (j = 0; j < ColorIn1->ColorCount; j++) {
|
||
|
+ if (memcmp(&ColorIn1->Colors[j], &ColorIn2->Colors[i],
|
||
|
+ sizeof(GifColorType)) == 0) {
|
||
|
break;
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
- if (j < ColorIn1->ColorCount)
|
||
|
- ColorTransIn2[i] = j; /* color exists in Color1 */
|
||
|
- else {
|
||
|
+ if (j < ColorIn1->ColorCount) {
|
||
|
+ ColorTransIn2[i] = j; /* color exists in Color1 */
|
||
|
+ } else {
|
||
|
/* Color is new - copy it to a new slot: */
|
||
|
ColorUnion->Colors[CrntSlot] = ColorIn2->Colors[i];
|
||
|
ColorTransIn2[i] = CrntSlot++;
|
||
|
@@ -196,7 +194,7 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
|
||
|
if (CrntSlot > 256) {
|
||
|
GifFreeMapObject(ColorUnion);
|
||
|
- return ((ColorMapObject *) NULL);
|
||
|
+ return ((ColorMapObject *)NULL);
|
||
|
}
|
||
|
|
||
|
NewGifBitSize = GifBitSize(CrntSlot);
|
||
|
@@ -210,16 +208,17 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
* We know these slots exist because of the way ColorUnion's
|
||
|
* start dimension was computed.
|
||
|
*/
|
||
|
- for (j = CrntSlot; j < RoundUpTo; j++)
|
||
|
+ for (j = CrntSlot; j < RoundUpTo; j++) {
|
||
|
Map[j].Red = Map[j].Green = Map[j].Blue = 0;
|
||
|
+ }
|
||
|
|
||
|
/* perhaps we can shrink the map? */
|
||
|
if (RoundUpTo < ColorUnion->ColorCount) {
|
||
|
- GifColorType *new_map = (GifColorType *)reallocarray(Map,
|
||
|
- RoundUpTo, sizeof(GifColorType));
|
||
|
- if( new_map == NULL ) {
|
||
|
+ GifColorType *new_map = (GifColorType *)reallocarray(
|
||
|
+ Map, RoundUpTo, sizeof(GifColorType));
|
||
|
+ if (new_map == NULL) {
|
||
|
GifFreeMapObject(ColorUnion);
|
||
|
- return ((ColorMapObject *) NULL);
|
||
|
+ return ((ColorMapObject *)NULL);
|
||
|
}
|
||
|
ColorUnion->Colors = new_map;
|
||
|
}
|
||
|
@@ -234,49 +233,49 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,
|
||
|
/*******************************************************************************
|
||
|
Apply a given color translation to the raster bits of an image
|
||
|
*******************************************************************************/
|
||
|
-void
|
||
|
-GifApplyTranslation(SavedImage *Image, GifPixelType Translation[])
|
||
|
-{
|
||
|
+void GifApplyTranslation(SavedImage *Image, const GifPixelType Translation[]) {
|
||
|
register int i;
|
||
|
- register int RasterSize = Image->ImageDesc.Height * Image->ImageDesc.Width;
|
||
|
+ register int RasterSize =
|
||
|
+ Image->ImageDesc.Height * Image->ImageDesc.Width;
|
||
|
|
||
|
- for (i = 0; i < RasterSize; i++)
|
||
|
+ for (i = 0; i < RasterSize; i++) {
|
||
|
Image->RasterBits[i] = Translation[Image->RasterBits[i]];
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
Extension record functions
|
||
|
******************************************************************************/
|
||
|
-int
|
||
|
-GifAddExtensionBlock(int *ExtensionBlockCount,
|
||
|
- ExtensionBlock **ExtensionBlocks,
|
||
|
- int Function,
|
||
|
- unsigned int Len,
|
||
|
- unsigned char ExtData[])
|
||
|
-{
|
||
|
+int GifAddExtensionBlock(int *ExtensionBlockCount,
|
||
|
+ ExtensionBlock **ExtensionBlocks, int Function,
|
||
|
+ unsigned int Len, unsigned char ExtData[]) {
|
||
|
ExtensionBlock *ep;
|
||
|
|
||
|
- if (*ExtensionBlocks == NULL)
|
||
|
- *ExtensionBlocks=(ExtensionBlock *)malloc(sizeof(ExtensionBlock));
|
||
|
- else {
|
||
|
- ExtensionBlock* ep_new = (ExtensionBlock *)reallocarray
|
||
|
- (*ExtensionBlocks, (*ExtensionBlockCount + 1),
|
||
|
- sizeof(ExtensionBlock));
|
||
|
- if( ep_new == NULL )
|
||
|
+ if (*ExtensionBlocks == NULL) {
|
||
|
+ *ExtensionBlocks =
|
||
|
+ (ExtensionBlock *)malloc(sizeof(ExtensionBlock));
|
||
|
+ } else {
|
||
|
+ ExtensionBlock *ep_new = (ExtensionBlock *)reallocarray(
|
||
|
+ *ExtensionBlocks, (*ExtensionBlockCount + 1),
|
||
|
+ sizeof(ExtensionBlock));
|
||
|
+ if (ep_new == NULL) {
|
||
|
return (GIF_ERROR);
|
||
|
+ }
|
||
|
*ExtensionBlocks = ep_new;
|
||
|
}
|
||
|
|
||
|
- if (*ExtensionBlocks == NULL)
|
||
|
+ if (*ExtensionBlocks == NULL) {
|
||
|
return (GIF_ERROR);
|
||
|
+ }
|
||
|
|
||
|
ep = &(*ExtensionBlocks)[(*ExtensionBlockCount)++];
|
||
|
|
||
|
ep->Function = Function;
|
||
|
- ep->ByteCount=Len;
|
||
|
+ ep->ByteCount = Len;
|
||
|
ep->Bytes = (GifByteType *)malloc(ep->ByteCount);
|
||
|
- if (ep->Bytes == NULL)
|
||
|
+ if (ep->Bytes == NULL) {
|
||
|
return (GIF_ERROR);
|
||
|
+ }
|
||
|
|
||
|
if (ExtData != NULL) {
|
||
|
memcpy(ep->Bytes, ExtData, Len);
|
||
|
@@ -285,38 +284,36 @@ GifAddExtensionBlock(int *ExtensionBlockCount,
|
||
|
return (GIF_OK);
|
||
|
}
|
||
|
|
||
|
-void
|
||
|
-GifFreeExtensions(int *ExtensionBlockCount,
|
||
|
- ExtensionBlock **ExtensionBlocks)
|
||
|
-{
|
||
|
+void GifFreeExtensions(int *ExtensionBlockCount,
|
||
|
+ ExtensionBlock **ExtensionBlocks) {
|
||
|
ExtensionBlock *ep;
|
||
|
|
||
|
- if (*ExtensionBlocks == NULL)
|
||
|
+ if (*ExtensionBlocks == NULL) {
|
||
|
return;
|
||
|
+ }
|
||
|
|
||
|
for (ep = *ExtensionBlocks;
|
||
|
- ep < (*ExtensionBlocks + *ExtensionBlockCount);
|
||
|
- ep++)
|
||
|
+ ep < (*ExtensionBlocks + *ExtensionBlockCount); ep++) {
|
||
|
(void)free((char *)ep->Bytes);
|
||
|
+ }
|
||
|
(void)free((char *)*ExtensionBlocks);
|
||
|
*ExtensionBlocks = NULL;
|
||
|
*ExtensionBlockCount = 0;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
- Image block allocation functions
|
||
|
+ Image block allocation functions
|
||
|
******************************************************************************/
|
||
|
|
||
|
/* Private Function:
|
||
|
* Frees the last image in the GifFile->SavedImages array
|
||
|
*/
|
||
|
-void
|
||
|
-FreeLastSavedImage(GifFileType *GifFile)
|
||
|
-{
|
||
|
+void FreeLastSavedImage(GifFileType *GifFile) {
|
||
|
SavedImage *sp;
|
||
|
|
||
|
- if ((GifFile == NULL) || (GifFile->SavedImages == NULL))
|
||
|
+ if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) {
|
||
|
return;
|
||
|
+ }
|
||
|
|
||
|
/* Remove one SavedImage from the GifFile */
|
||
|
GifFile->ImageCount--;
|
||
|
@@ -329,54 +326,58 @@ FreeLastSavedImage(GifFileType *GifFile)
|
||
|
}
|
||
|
|
||
|
/* Deallocate the image data */
|
||
|
- if (sp->RasterBits != NULL)
|
||
|
+ if (sp->RasterBits != NULL) {
|
||
|
free((char *)sp->RasterBits);
|
||
|
+ }
|
||
|
|
||
|
/* Deallocate any extensions */
|
||
|
GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks);
|
||
|
|
||
|
/*** FIXME: We could realloc the GifFile->SavedImages structure but is
|
||
|
* there a point to it? Saves some memory but we'd have to do it every
|
||
|
- * time. If this is used in GifFreeSavedImages then it would be inefficient
|
||
|
- * (The whole array is going to be deallocated.) If we just use it when
|
||
|
- * we want to free the last Image it's convenient to do it here.
|
||
|
+ * time. If this is used in GifFreeSavedImages then it would be
|
||
|
+ * inefficient (The whole array is going to be deallocated.) If we just
|
||
|
+ * use it when we want to free the last Image it's convenient to do it
|
||
|
+ * here.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Append an image block to the SavedImages array
|
||
|
*/
|
||
|
-SavedImage *
|
||
|
-GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
|
||
|
-{
|
||
|
- if (GifFile->SavedImages == NULL)
|
||
|
+SavedImage *GifMakeSavedImage(GifFileType *GifFile,
|
||
|
+ const SavedImage *CopyFrom) {
|
||
|
+ // cppcheck-suppress ctunullpointer
|
||
|
+ if (GifFile->SavedImages == NULL) {
|
||
|
GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage));
|
||
|
- else {
|
||
|
- SavedImage* newSavedImages = (SavedImage *)reallocarray(GifFile->SavedImages,
|
||
|
- (GifFile->ImageCount + 1), sizeof(SavedImage));
|
||
|
- if( newSavedImages == NULL)
|
||
|
+ } else {
|
||
|
+ SavedImage *newSavedImages = (SavedImage *)reallocarray(
|
||
|
+ GifFile->SavedImages, (GifFile->ImageCount + 1),
|
||
|
+ sizeof(SavedImage));
|
||
|
+ if (newSavedImages == NULL) {
|
||
|
return ((SavedImage *)NULL);
|
||
|
+ }
|
||
|
GifFile->SavedImages = newSavedImages;
|
||
|
}
|
||
|
- if (GifFile->SavedImages == NULL)
|
||
|
+ if (GifFile->SavedImages == NULL) {
|
||
|
return ((SavedImage *)NULL);
|
||
|
- else {
|
||
|
+ } else {
|
||
|
SavedImage *sp = &GifFile->SavedImages[GifFile->ImageCount++];
|
||
|
|
||
|
if (CopyFrom != NULL) {
|
||
|
memcpy((char *)sp, CopyFrom, sizeof(SavedImage));
|
||
|
|
||
|
/*
|
||
|
- * Make our own allocated copies of the heap fields in the
|
||
|
- * copied record. This guards against potential aliasing
|
||
|
- * problems.
|
||
|
+ * Make our own allocated copies of the heap fields in
|
||
|
+ * the copied record. This guards against potential
|
||
|
+ * aliasing problems.
|
||
|
*/
|
||
|
|
||
|
/* first, the local color map */
|
||
|
if (CopyFrom->ImageDesc.ColorMap != NULL) {
|
||
|
sp->ImageDesc.ColorMap = GifMakeMapObject(
|
||
|
- CopyFrom->ImageDesc.ColorMap->ColorCount,
|
||
|
- CopyFrom->ImageDesc.ColorMap->Colors);
|
||
|
+ CopyFrom->ImageDesc.ColorMap->ColorCount,
|
||
|
+ CopyFrom->ImageDesc.ColorMap->Colors);
|
||
|
if (sp->ImageDesc.ColorMap == NULL) {
|
||
|
FreeLastSavedImage(GifFile);
|
||
|
return (SavedImage *)(NULL);
|
||
|
@@ -384,32 +385,36 @@ GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
|
||
|
}
|
||
|
|
||
|
/* next, the raster */
|
||
|
- sp->RasterBits = (unsigned char *)reallocarray(NULL,
|
||
|
- (CopyFrom->ImageDesc.Height *
|
||
|
- CopyFrom->ImageDesc.Width),
|
||
|
- sizeof(GifPixelType));
|
||
|
+ sp->RasterBits = (unsigned char *)reallocarray(
|
||
|
+ NULL,
|
||
|
+ (CopyFrom->ImageDesc.Height *
|
||
|
+ CopyFrom->ImageDesc.Width),
|
||
|
+ sizeof(GifPixelType));
|
||
|
if (sp->RasterBits == NULL) {
|
||
|
FreeLastSavedImage(GifFile);
|
||
|
return (SavedImage *)(NULL);
|
||
|
}
|
||
|
memcpy(sp->RasterBits, CopyFrom->RasterBits,
|
||
|
- sizeof(GifPixelType) * CopyFrom->ImageDesc.Height *
|
||
|
- CopyFrom->ImageDesc.Width);
|
||
|
+ sizeof(GifPixelType) *
|
||
|
+ CopyFrom->ImageDesc.Height *
|
||
|
+ CopyFrom->ImageDesc.Width);
|
||
|
|
||
|
/* finally, the extension blocks */
|
||
|
if (CopyFrom->ExtensionBlocks != NULL) {
|
||
|
- sp->ExtensionBlocks = (ExtensionBlock *)reallocarray(NULL,
|
||
|
- CopyFrom->ExtensionBlockCount,
|
||
|
- sizeof(ExtensionBlock));
|
||
|
+ sp->ExtensionBlocks =
|
||
|
+ (ExtensionBlock *)reallocarray(
|
||
|
+ NULL, CopyFrom->ExtensionBlockCount,
|
||
|
+ sizeof(ExtensionBlock));
|
||
|
if (sp->ExtensionBlocks == NULL) {
|
||
|
FreeLastSavedImage(GifFile);
|
||
|
return (SavedImage *)(NULL);
|
||
|
}
|
||
|
- memcpy(sp->ExtensionBlocks, CopyFrom->ExtensionBlocks,
|
||
|
- sizeof(ExtensionBlock) * CopyFrom->ExtensionBlockCount);
|
||
|
+ memcpy(sp->ExtensionBlocks,
|
||
|
+ CopyFrom->ExtensionBlocks,
|
||
|
+ sizeof(ExtensionBlock) *
|
||
|
+ CopyFrom->ExtensionBlockCount);
|
||
|
}
|
||
|
- }
|
||
|
- else {
|
||
|
+ } else {
|
||
|
memset((char *)sp, '\0', sizeof(SavedImage));
|
||
|
}
|
||
|
|
||
|
@@ -417,9 +422,7 @@ GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-void
|
||
|
-GifFreeSavedImages(GifFileType *GifFile)
|
||
|
-{
|
||
|
+void GifFreeSavedImages(GifFileType *GifFile) {
|
||
|
SavedImage *sp;
|
||
|
|
||
|
if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) {
|
||
|
@@ -432,10 +435,12 @@ GifFreeSavedImages(GifFileType *GifFile)
|
||
|
sp->ImageDesc.ColorMap = NULL;
|
||
|
}
|
||
|
|
||
|
- if (sp->RasterBits != NULL)
|
||
|
+ if (sp->RasterBits != NULL) {
|
||
|
free((char *)sp->RasterBits);
|
||
|
+ }
|
||
|
|
||
|
- GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks);
|
||
|
+ GifFreeExtensions(&sp->ExtensionBlockCount,
|
||
|
+ &sp->ExtensionBlocks);
|
||
|
}
|
||
|
free((char *)GifFile->SavedImages);
|
||
|
GifFile->SavedImages = NULL;
|
||
|
diff --git a/jdk/src/share/native/sun/awt/giflib/openbsd-reallocarray.c b/jdk/src/share/native/sun/awt/giflib/openbsd-reallocarray.c
|
||
|
index 452df69d7c..7420af674c 100644
|
||
|
--- a/jdk/src/share/native/sun/awt/giflib/openbsd-reallocarray.c
|
||
|
+++ b/jdk/src/share/native/sun/awt/giflib/openbsd-reallocarray.c
|
||
|
@@ -28,24 +28,22 @@
|
||
|
* SPDX-License-Identifier: MIT
|
||
|
*/
|
||
|
|
||
|
-#include <sys/types.h>
|
||
|
#include <errno.h>
|
||
|
#include <stdint.h>
|
||
|
#include <stdlib.h>
|
||
|
+#include <sys/types.h>
|
||
|
|
||
|
#ifndef SIZE_MAX
|
||
|
- #define SIZE_MAX UINTPTR_MAX
|
||
|
+#define SIZE_MAX UINTPTR_MAX
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
|
||
|
* if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
|
||
|
*/
|
||
|
-#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
|
||
|
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
|
||
|
|
||
|
-void *
|
||
|
-openbsd_reallocarray(void *optr, size_t nmemb, size_t size)
|
||
|
-{
|
||
|
+void *openbsd_reallocarray(void *optr, size_t nmemb, size_t size) {
|
||
|
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
|
||
|
nmemb > 0 && SIZE_MAX / nmemb < size) {
|
||
|
errno = ENOMEM;
|
||
|
@@ -93,7 +91,8 @@ openbsd_reallocarray(void *optr, size_t nmemb, size_t size)
|
||
|
* fuzzing on one platform may not detect zero-size allocation
|
||
|
* problems on other platforms.
|
||
|
*/
|
||
|
- if (size == 0 || nmemb == 0)
|
||
|
+ if (size == 0 || nmemb == 0) {
|
||
|
return NULL;
|
||
|
+ }
|
||
|
return realloc(optr, size * nmemb);
|
||
|
}
|