windowscodecs: GIF decoder should append a sub-block to current extension.

This commit is contained in:
Dmitry Timoshkov 2012-09-18 12:59:11 +09:00 committed by Alexandre Julliard
parent 880b98bf23
commit aaa682950d
1 changed files with 46 additions and 6 deletions

View File

@ -222,6 +222,32 @@ AddExtensionBlock(Extensions *New,
return (GIF_OK);
}
static int
AppendExtensionBlock(Extensions *New,
int Len,
const unsigned char ExtData[])
{
ExtensionBlock *ep;
if (New->ExtensionBlocks == NULL)
return (GIF_ERROR);
ep = &New->ExtensionBlocks[New->ExtensionBlockCount - 1];
ep->Bytes = ungif_realloc(ep->Bytes, ep->ByteCount + Len + 1);
if (ep->Bytes == NULL)
return (GIF_ERROR);
if (ExtData)
{
ep->Bytes[ep->ByteCount] = Len;
memcpy(ep->Bytes + ep->ByteCount + 1, ExtData, Len);
ep->ByteCount += Len + 1;
}
return (GIF_OK);
}
static void
FreeExtension(Extensions *Extensions)
{
@ -898,16 +924,30 @@ DGifSlurp(GifFileType * GifFile) {
Extensions->Function = Function;
while (ExtData != NULL) {
/* Create an extension block with our data */
if (AddExtensionBlock(Extensions, ExtData[0], &ExtData[1]) == GIF_ERROR)
return (GIF_ERROR);
/* Create an extension block with our data */
if (AddExtensionBlock(Extensions, ExtData[0], &ExtData[1])
== GIF_ERROR)
return (GIF_ERROR);
while (ExtData != NULL) {
int Len;
GifByteType *Data;
if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR)
return (GIF_ERROR);
temp_save.Function = 0;
if (ExtData)
{
Len = ExtData[0];
Data = &ExtData[1];
}
else
{
Len = 0;
Data = NULL;
}
if (AppendExtensionBlock(Extensions, Len, Data) == GIF_ERROR)
return (GIF_ERROR);
}
break;
}