Mercurial > public > mercurial-scm > hg
view contrib/python-zstandard/c-ext/python-zstandard.h @ 30830:08fa3a76a080
zstd: prevent potential free() of uninitialized memory
This is a cherry pick of an upstream fix. The free() of uninitialed
memory could likely only occur if a malloc() inside zstd fails.
The patched functions aren't currently used by Mercurial. But I don't
like leaving footguns sitting around.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 17 Jan 2017 10:17:13 -0800 |
parents | b54a2984cdd4 |
children | c32454d69b85 |
line wrap: on
line source
/** * Copyright (c) 2016-present, Gregory Szorc * All rights reserved. * * This software may be modified and distributed under the terms * of the BSD license. See the LICENSE file for details. */ #define PY_SSIZE_T_CLEAN #include <Python.h> #define ZSTD_STATIC_LINKING_ONLY #define ZDICT_STATIC_LINKING_ONLY #include "mem.h" #include "zstd.h" #include "zdict.h" #define PYTHON_ZSTANDARD_VERSION "0.6.0" typedef enum { compressorobj_flush_finish, compressorobj_flush_block, } CompressorObj_Flush; typedef struct { PyObject_HEAD unsigned windowLog; unsigned chainLog; unsigned hashLog; unsigned searchLog; unsigned searchLength; unsigned targetLength; ZSTD_strategy strategy; } CompressionParametersObject; extern PyTypeObject CompressionParametersType; typedef struct { PyObject_HEAD unsigned selectivityLevel; int compressionLevel; unsigned notificationLevel; unsigned dictID; } DictParametersObject; extern PyTypeObject DictParametersType; typedef struct { PyObject_HEAD void* dictData; size_t dictSize; } ZstdCompressionDict; extern PyTypeObject ZstdCompressionDictType; typedef struct { PyObject_HEAD int compressionLevel; ZstdCompressionDict* dict; ZSTD_CCtx* cctx; ZSTD_CDict* cdict; CompressionParametersObject* cparams; ZSTD_frameParameters fparams; } ZstdCompressor; extern PyTypeObject ZstdCompressorType; typedef struct { PyObject_HEAD ZstdCompressor* compressor; ZSTD_CStream* cstream; ZSTD_outBuffer output; int finished; } ZstdCompressionObj; extern PyTypeObject ZstdCompressionObjType; typedef struct { PyObject_HEAD ZstdCompressor* compressor; PyObject* writer; Py_ssize_t sourceSize; size_t outSize; ZSTD_CStream* cstream; int entered; } ZstdCompressionWriter; extern PyTypeObject ZstdCompressionWriterType; typedef struct { PyObject_HEAD ZstdCompressor* compressor; PyObject* reader; Py_buffer* buffer; Py_ssize_t bufferOffset; Py_ssize_t sourceSize; size_t inSize; size_t outSize; ZSTD_CStream* cstream; ZSTD_inBuffer input; ZSTD_outBuffer output; int finishedOutput; int finishedInput; PyObject* readResult; } ZstdCompressorIterator; extern PyTypeObject ZstdCompressorIteratorType; typedef struct { PyObject_HEAD ZSTD_DCtx* refdctx; ZstdCompressionDict* dict; ZSTD_DDict* ddict; } ZstdDecompressor; extern PyTypeObject ZstdDecompressorType; typedef struct { PyObject_HEAD ZstdDecompressor* decompressor; ZSTD_DStream* dstream; int finished; } ZstdDecompressionObj; extern PyTypeObject ZstdDecompressionObjType; typedef struct { PyObject_HEAD ZstdDecompressor* decompressor; PyObject* writer; size_t outSize; ZSTD_DStream* dstream; int entered; } ZstdDecompressionWriter; extern PyTypeObject ZstdDecompressionWriterType; typedef struct { PyObject_HEAD ZstdDecompressor* decompressor; PyObject* reader; Py_buffer* buffer; Py_ssize_t bufferOffset; size_t inSize; size_t outSize; size_t skipBytes; ZSTD_DStream* dstream; ZSTD_inBuffer input; ZSTD_outBuffer output; Py_ssize_t readCount; int finishedInput; int finishedOutput; } ZstdDecompressorIterator; extern PyTypeObject ZstdDecompressorIteratorType; typedef struct { int errored; PyObject* chunk; } DecompressorIteratorResult; void ztopy_compression_parameters(CompressionParametersObject* params, ZSTD_compressionParameters* zparams); CompressionParametersObject* get_compression_parameters(PyObject* self, PyObject* args); PyObject* estimate_compression_context_size(PyObject* self, PyObject* args); ZSTD_CStream* CStream_from_ZstdCompressor(ZstdCompressor* compressor, Py_ssize_t sourceSize); ZSTD_DStream* DStream_from_ZstdDecompressor(ZstdDecompressor* decompressor); ZstdCompressionDict* train_dictionary(PyObject* self, PyObject* args, PyObject* kwargs);