diff --git a/.appveyor.yml b/.appveyor.yml index 16e3023a1f0..2cbfe52f4a2 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -18,7 +18,8 @@ environment: PIP_DIR: bin VENV: YES - PYTHON: C:/Python27-x64 - - PYTHON: C:\Python38rc1-x64 + - PYTHON: C:/Python38 + - PYTHON: C:/Python38-x64 - PYTHON: C:/Python37 - PYTHON: C:/Python27 - PYTHON: C:/Python37-x64 @@ -38,11 +39,6 @@ environment: install: -- ps: | - if ($env:PYTHON -eq "C:\Python38rc1-x64") { - curl -o install_python.ps1 https://raw.githubusercontent.com/matthew-brett/multibuild/d0cf77e62028704875073e3dc4626f61d1c33b0e/install_python.ps1 - .\install_python.ps1 - } - curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip - 7z x pillow-depends.zip -oc:\ - mv c:\pillow-depends-master c:\pillow-depends diff --git a/.azure-pipelines/jobs/test-docker.yml b/.azure-pipelines/jobs/test-docker.yml index 41dc2daece8..defb8d3aee6 100644 --- a/.azure-pipelines/jobs/test-docker.yml +++ b/.azure-pipelines/jobs/test-docker.yml @@ -1,6 +1,6 @@ parameters: docker: '' # defaults for any parameters that aren't specified - dockerTag: 'master' + dockerTag: '6.2.x' name: '' vmImage: 'Ubuntu-16.04' diff --git a/.travis.yml b/.travis.yml index 3ce2ffcd4d8..18dc421ed41 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,18 +36,19 @@ matrix: - python: '3.5' name: "3.5 Xenial PYTHONOPTIMIZE=2" env: PYTHONOPTIMIZE=2 - - env: DOCKER="alpine" DOCKER_TAG="master" - - env: DOCKER="arch" DOCKER_TAG="master" # contains PyQt5 - - env: DOCKER="ubuntu-16.04-xenial-amd64" DOCKER_TAG="master" - - env: DOCKER="ubuntu-18.04-bionic-amd64" DOCKER_TAG="master" - - env: DOCKER="debian-9-stretch-x86" DOCKER_TAG="master" - - env: DOCKER="debian-10-buster-x86" DOCKER_TAG="master" - - env: DOCKER="centos-6-amd64" DOCKER_TAG="master" - - env: DOCKER="centos-7-amd64" DOCKER_TAG="master" - - env: DOCKER="amazon-1-amd64" DOCKER_TAG="master" - - env: DOCKER="amazon-2-amd64" DOCKER_TAG="master" - - env: DOCKER="fedora-29-amd64" DOCKER_TAG="master" - - env: DOCKER="fedora-30-amd64" DOCKER_TAG="master" + - env: DOCKER="alpine" DOCKER_TAG="6.2.x" + - env: DOCKER="arch" DOCKER_TAG="6.2.x" # contains PyQt5 + - env: DOCKER="ubuntu-16.04-xenial-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="ubuntu-18.04-bionic-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="debian-9-stretch-x86" DOCKER_TAG="6.2.x" + - env: DOCKER="debian-10-buster-x86" DOCKER_TAG="6.2.x" + - env: DOCKER="centos-6-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="centos-7-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="centos-8-amd64" DOCKER_TAG="master" + - env: DOCKER="amazon-1-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="amazon-2-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="fedora-30-amd64" DOCKER_TAG="6.2.x" + - env: DOCKER="fedora-31-amd64" DOCKER_TAG="6.2.x" services: - docker diff --git a/CHANGES.rst b/CHANGES.rst index cc6efc07046..e85716f804f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,10 +2,29 @@ Changelog (Pillow) ================== -6.2.1 (2019-10-21) +6.2.2 (2020-01-02) +------------------ - This is the last Pillow release to support Python 2.7 #3642 +- Overflow checks for realloc for tiff decoding. CVE TBD + [wiredfool, radarhere] + +- Catch SGI buffer overrun. CVE TBD + [radarhere] + +- Catch PCX P mode buffer overrun. CVE TBD + [radarhere] + +- Catch FLI buffer overrun. CVE TBD + [radarhere] + +- Raise an error for an invalid number of bands in FPX image. CVE-2019-19911 + [wiredfool, radarhere] + +6.2.1 (2019-10-21) +------------------ + - Add support for Python 3.8 #4141 [hugovk] diff --git a/LICENSE b/LICENSE index c106eeb1aed..ab8b0c111e1 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2010-2019 by Alex Clark and contributors + Copyright © 2010-2020 by Alex Clark and contributors Like PIL, Pillow is licensed under the open source PIL Software License: diff --git a/Tests/images/fli_overrun2.bin b/Tests/images/fli_overrun2.bin new file mode 100644 index 00000000000..4afdb6f8909 Binary files /dev/null and b/Tests/images/fli_overrun2.bin differ diff --git a/Tests/images/input_bw_five_bands.fpx b/Tests/images/input_bw_five_bands.fpx new file mode 100644 index 00000000000..5fcb144aef1 Binary files /dev/null and b/Tests/images/input_bw_five_bands.fpx differ diff --git a/Tests/images/pcx_overrun2.bin b/Tests/images/pcx_overrun2.bin new file mode 100644 index 00000000000..5f00b50595a Binary files /dev/null and b/Tests/images/pcx_overrun2.bin differ diff --git a/Tests/images/sgi_overrun_expandrow.bin b/Tests/images/sgi_overrun_expandrow.bin new file mode 100644 index 00000000000..316d618818e Binary files /dev/null and b/Tests/images/sgi_overrun_expandrow.bin differ diff --git a/Tests/images/sgi_overrun_expandrow2.bin b/Tests/images/sgi_overrun_expandrow2.bin new file mode 100644 index 00000000000..f70e03a3960 Binary files /dev/null and b/Tests/images/sgi_overrun_expandrow2.bin differ diff --git a/Tests/images/tiff_overflow_rows_per_strip.tif b/Tests/images/tiff_overflow_rows_per_strip.tif new file mode 100644 index 00000000000..979c7f17696 Binary files /dev/null and b/Tests/images/tiff_overflow_rows_per_strip.tif differ diff --git a/Tests/test_file_fpx.py b/Tests/test_file_fpx.py index 68412c8caa0..8135937d44c 100644 --- a/Tests/test_file_fpx.py +++ b/Tests/test_file_fpx.py @@ -1,3 +1,5 @@ +from PIL import Image + from .helper import PillowTestCase, unittest try: @@ -18,3 +20,7 @@ def test_invalid_file(self): # Test a valid OLE file, but not an FPX file ole_file = "Tests/images/test-ole-file.doc" self.assertRaises(SyntaxError, FpxImagePlugin.FpxImageFile, ole_file) + + def test_fpx_invalid_number_of_bands(self): + with self.assertRaisesRegex(IOError, "Invalid number of bands"): + Image.open("Tests/images/input_bw_five_bands.fpx") diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index ea73a7ad50a..0f599346738 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -870,3 +870,13 @@ def test_sampleformat_not_corrupted(self): out.seek(0) with Image.open(out) as im: im.load() + + def test_realloc_overflow(self): + TiffImagePlugin.READ_LIBTIFF = True + with Image.open("Tests/images/tiff_overflow_rows_per_strip.tif") as im: + with self.assertRaises(IOError) as e: + im.load() + + # Assert that the error code is IMAGING_CODEC_MEMORY + self.assertEqual(str(e.exception), "-9") + TiffImagePlugin.READ_LIBTIFF = False diff --git a/Tests/test_image.py b/Tests/test_image.py index 47196a1394a..2982d16d70c 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -590,7 +590,14 @@ def act(fp): self.assertFalse(fp.closed) def test_overrun(self): - for file in ["fli_overrun.bin", "sgi_overrun.bin", "pcx_overrun.bin"]: + for file in [ + "fli_overrun.bin", + "sgi_overrun.bin", + "sgi_overrun_expandrow.bin", + "sgi_overrun_expandrow2.bin", + "pcx_overrun.bin", + "pcx_overrun2.bin", + ]: im = Image.open(os.path.join("Tests/images", file)) try: im.load() @@ -598,6 +605,13 @@ def test_overrun(self): except IOError as e: self.assertEqual(str(e), "buffer overrun when reading image file") + with Image.open("Tests/images/fli_overrun2.bin") as im: + try: + im.seek(1) + self.assertFail() + except IOError as e: + self.assertEqual(str(e), "buffer overrun when reading image file") + class MockEncoder(object): pass diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f26f2c03775..1cbe484ab49 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -51,6 +51,11 @@ jobs: docker: 'centos-7-amd64' name: 'centos_7_amd64' +- template: .azure-pipelines/jobs/test-docker.yml + parameters: + docker: 'centos-8-amd64' + name: 'centos_8_amd64' + - template: .azure-pipelines/jobs/test-docker.yml parameters: docker: 'amazon-1-amd64' @@ -63,10 +68,10 @@ jobs: - template: .azure-pipelines/jobs/test-docker.yml parameters: - docker: 'fedora-29-amd64' - name: 'fedora_29_amd64' + docker: 'fedora-30-amd64' + name: 'fedora_30_amd64' - template: .azure-pipelines/jobs/test-docker.yml parameters: - docker: 'fedora-30-amd64' - name: 'fedora_30_amd64' + docker: 'fedora-31-amd64' + name: 'fedora_31_amd64' diff --git a/docs/COPYING b/docs/COPYING index a1e258129b6..ec2a5d8cbf3 100644 --- a/docs/COPYING +++ b/docs/COPYING @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2010-2019 by Alex Clark and contributors + Copyright © 2010-2020 by Alex Clark and contributors Like PIL, Pillow is licensed under the open source PIL Software License: diff --git a/docs/conf.py b/docs/conf.py index a9ca91de71c..72628cd8376 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -43,7 +43,7 @@ # General information about the project. project = u"Pillow (PIL Fork)" -copyright = u"1995-2011 Fredrik Lundh, 2010-2019 Alex Clark and Contributors" +copyright = u"1995-2011 Fredrik Lundh, 2010-2020 Alex Clark and Contributors" author = u"Fredrik Lundh, Alex Clark and Contributors" # The version info for the project you're documenting, acts as replacement for diff --git a/docs/installation.rst b/docs/installation.rst index 13333e46515..8760a0f4e97 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -397,14 +397,16 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | CentOS 7 | 2.7, 3.6 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ +| CentOS 8 | 2.7, 3.6 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ | Debian 9 Stretch | 2.7, 3.5 |x86 | +----------------------------------+-------------------------------+-----------------------+ | Debian 10 Buster | 2.7, 3.7 |x86 | +----------------------------------+-------------------------------+-----------------------+ -| Fedora 29 | 2.7, 3.7 |x86-64 | -+----------------------------------+-------------------------------+-----------------------+ | Fedora 30 | 2.7, 3.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ +| Fedora 31 | 2.7, 3.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ | macOS 10.13 High Sierra* | 2.7, 3.5, 3.6, 3.7, 3.8 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 16.04 LTS | 2.7, 3.5, 3.6, 3.7, 3.8, |x86-64 | diff --git a/docs/releasenotes/6.2.0.rst b/docs/releasenotes/6.2.0.rst index ed61a1f9151..5f06d824d09 100644 --- a/docs/releasenotes/6.2.0.rst +++ b/docs/releasenotes/6.2.0.rst @@ -69,6 +69,27 @@ There has been a longstanding warning that the defaults of ``Image.frombuffer`` may change in the future for the "raw" decoder. The change will now take place in Pillow 7.0. +Security +======== + +This release catches several buffer overruns, as well as addressing +CVE-2019-16865. The CVE is regarding DOS problems, such as consuming large +amounts of memory, or taking a large amount of time to process an image. + +In RawDecode.c, an error is now thrown if skip is calculated to be less than +zero. It is intended to skip padding between lines, not to go backwards. + +In PsdImagePlugin, if the combined sizes of the individual parts is larger than +the declared size of the extra data field, then it looked for the next layer by +seeking backwards. This is now corrected by seeking to (the start of the layer ++ the size of the extra data field) instead of (the read parts of the layer + +the rest of the layer). + +Decompression bomb checks have been added to GIF and ICO formats. + +An error is now raised if a TIFF dimension is a string, rather than trying to +perform operations on it. + Other Changes ============= diff --git a/docs/releasenotes/6.2.2.rst b/docs/releasenotes/6.2.2.rst new file mode 100644 index 00000000000..586ea7d852e --- /dev/null +++ b/docs/releasenotes/6.2.2.rst @@ -0,0 +1,18 @@ +6.2.2 +----- + +Security +======== + +This release addresses several security problems {CVEs TBD), as well as addressing +CVE-2019-19911. + +CVE-2019-19911 is regarding FPX images. If an image reports that it has a large number +of bands, a large amount of resources will be used when trying to process the +image. This is fixed by limiting the number of bands to those usable by Pillow. + +Buffer overruns were found when processing an SGI, PCX or FLI image. Checks +have been added to prevent this. + +Overflow checks have been added when calculating the size of a memory block to +be reallocated in the processing of a TIFF image. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 381643cf3c9..770b604faf6 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 6.2.2 6.2.1 6.2.0 6.1.0 diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index 7b97964a852..dd174515855 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -119,7 +119,7 @@ def decode_dxt3(data): bits = struct.unpack_from("<8B", block) color0, color1 = struct.unpack_from(" 4: + raise IOError("Invalid number of bands") + for i in range(bands): # note: for now, we ignore the "uncalibrated" flag colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF) diff --git a/src/PIL/FtexImagePlugin.py b/src/PIL/FtexImagePlugin.py index 06f4a72d03c..096ccacac69 100644 --- a/src/PIL/FtexImagePlugin.py +++ b/src/PIL/FtexImagePlugin.py @@ -79,7 +79,7 @@ def _open(self): format, where = struct.unpack("<2i", self.fp.read(8)) self.fp.seek(where) - mipmap_size, = struct.unpack(" 4: - offset, = struct.unpack("L", data) + (offset,) = struct.unpack(">L", data) self.fp.seek(offset) camerainfo = {"ModelID": self.fp.read(4)} diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index a927cd3ed90..0661c2ffb19 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -484,7 +484,7 @@ def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None): else: raise SyntaxError("not a TIFF IFD") self.reset() - self.next, = self._unpack("L", ifh[4:]) + (self.next,) = self._unpack("L", ifh[4:]) self._legacy_api = False prefix = property(lambda self: self._prefix) @@ -595,7 +595,7 @@ def _setitem(self, tag, value, legacy_api): ]: # rationals values = (values,) try: - dest[tag], = values + (dest[tag],) = values except ValueError: # We've got a builtin tag with 1 expected entry warnings.warn( @@ -765,7 +765,7 @@ def load(self, fp): size = count * unit_size if size > 4: here = fp.tell() - offset, = self._unpack("L", data) + (offset,) = self._unpack("L", data) if DEBUG: print( "Tag Location: %s - Data Location: %s" % (here, offset), @@ -797,7 +797,7 @@ def load(self, fp): else: print("- value:", self[tag]) - self.next, = self._unpack("L", self._ensure_read(fp, 4)) + (self.next,) = self._unpack("L", self._ensure_read(fp, 4)) except IOError as msg: warnings.warn(str(msg)) return @@ -1809,11 +1809,11 @@ def write(self, data): return self.f.write(data) def readShort(self): - value, = struct.unpack(self.shortFmt, self.f.read(2)) + (value,) = struct.unpack(self.shortFmt, self.f.read(2)) return value def readLong(self): - value, = struct.unpack(self.longFmt, self.f.read(4)) + (value,) = struct.unpack(self.longFmt, self.f.read(4)) return value def rewriteLastShortToLong(self, value): diff --git a/src/PIL/_version.py b/src/PIL/_version.py index e2747ce8265..df16dce6036 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = "6.2.1" +__version__ = "6.2.2" diff --git a/src/libImaging/FliDecode.c b/src/libImaging/FliDecode.c index 5f4485f890c..6f48c07d415 100644 --- a/src/libImaging/FliDecode.c +++ b/src/libImaging/FliDecode.c @@ -40,8 +40,7 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt return 0; /* We don't decode anything unless we have a full chunk in the - input buffer (on the other hand, the Python part of the driver - makes sure this is always the case) */ + input buffer */ ptr = buf; @@ -52,6 +51,10 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* Make sure this is a frame chunk. The Python driver takes case of other chunk types. */ + if (bytes < 8) { + state->errcode = IMAGING_CODEC_OVERRUN; + return -1; + } if (I16(ptr+4) != 0xF1FA) { state->errcode = IMAGING_CODEC_UNKNOWN; return -1; diff --git a/src/libImaging/PcxDecode.c b/src/libImaging/PcxDecode.c index 67dcc1e0858..9e9504ce5f1 100644 --- a/src/libImaging/PcxDecode.c +++ b/src/libImaging/PcxDecode.c @@ -25,6 +25,9 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt if (strcmp(im->mode, "1") == 0 && state->xsize > state->bytes * 8) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; + } else if (strcmp(im->mode, "P") == 0 && state->xsize > state->bytes) { + state->errcode = IMAGING_CODEC_OVERRUN; + return -1; } ptr = buf; diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index 8a81ba8e6c0..1ba56b8c7b7 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -25,7 +25,7 @@ static void read4B(UINT32* dest, UINT8* buf) *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); } -static int expandrow(UINT8* dest, UINT8* src, int n, int z) +static int expandrow(UINT8* dest, UINT8* src, int n, int z, int xsize) { UINT8 pixel, count; @@ -37,6 +37,9 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) count = pixel & RLE_MAX_RUN; if (!count) return count; + if (count > xsize) { + return -1; + } if (pixel & RLE_COPY_FLAG) { while(count--) { *dest = *src++; @@ -56,7 +59,7 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) return 0; } -static int expandrow2(UINT8* dest, const UINT8* src, int n, int z) +static int expandrow2(UINT8* dest, const UINT8* src, int n, int z, int xsize) { UINT8 pixel, count; @@ -70,6 +73,9 @@ static int expandrow2(UINT8* dest, const UINT8* src, int n, int z) count = pixel & RLE_MAX_RUN; if (!count) return count; + if (count > xsize) { + return -1; + } if (pixel & RLE_COPY_FLAG) { while(count--) { memcpy(dest, src, 2); @@ -96,6 +102,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *ptr; SGISTATE *c; int err = 0; + int status; /* Get all data from File descriptor */ c = (SGISTATE*)state->context; @@ -164,12 +171,16 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, /* row decompression */ if (c->bpc ==1) { - if(expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands)) - goto sgi_finish_decode; + status = expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); } else { - if(expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands)) - goto sgi_finish_decode; + status = expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); + } + if (status == -1) { + state->errcode = IMAGING_CODEC_OVERRUN; + return -1; + } else if (status == 1) { + goto sgi_finish_decode; } state->count += c->rlelength; diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 7592f7f39d1..c3df1174eb0 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -353,16 +353,18 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size row_byte_size = (tile_width * state->bits + 7) / 8; - state->bytes = row_byte_size * tile_length; - /* overflow check for malloc */ - if (state->bytes > INT_MAX - 1) { + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < tile_length) { state->errcode = IMAGING_CODEC_MEMORY; TIFFClose(tiff); return -1; } + + state->bytes = row_byte_size * tile_length; /* realloc to fit whole tile */ + /* malloc check above */ new_data = realloc (state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; @@ -415,11 +417,20 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ // We could use TIFFStripSize, but for YCbCr data it returns subsampled data size row_byte_size = (state->xsize * state->bits + 7) / 8; + + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < rows_per_strip) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } + state->bytes = rows_per_strip * row_byte_size; TRACE(("StripSize: %d \n", state->bytes)); /* realloc to fit whole strip */ + /* malloc check above */ new_data = realloc (state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; diff --git a/winbuild/config.py b/winbuild/config.py index fb45f4527c4..ee4b625b778 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -10,7 +10,7 @@ "36": {"compiler": 7.1, "vc": 2015}, "pypy3": {"compiler": 7.1, "vc": 2015}, "37": {"compiler": 7.1, "vc": 2015}, - "38rc1-x64": {"compiler": 7.1, "vc": 2015}, + "38": {"compiler": 7.1, "vc": 2015}, } VIRT_BASE = "c:/vp/"