Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
1ab2f142
Commit
1ab2f142
authored
Jun 05, 2016
by
Martin Panter
Browse files
Options
Browse Files
Download
Plain Diff
Issue #27164: Merge raw Deflate zdict support from 3.5
parents
841de280
3f0ee83f
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
56 additions
and
18 deletions
+56
-18
Lib/test/test_zlib.py
Lib/test/test_zlib.py
+9
-0
Misc/NEWS
Misc/NEWS
+3
-0
Modules/zlibmodule.c
Modules/zlibmodule.c
+44
-18
No files found.
Lib/test/test_zlib.py
View file @
1ab2f142
...
...
@@ -557,6 +557,15 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
self
.
assertEqual
(
dco
.
unconsumed_tail
,
b''
)
self
.
assertEqual
(
dco
.
unused_data
,
remainder
)
# issue27164
def
test_decompress_raw_with_dictionary
(
self
):
zdict
=
b'abcdefghijklmnopqrstuvwxyz'
co
=
zlib
.
compressobj
(
wbits
=-
zlib
.
MAX_WBITS
,
zdict
=
zdict
)
comp
=
co
.
compress
(
zdict
)
+
co
.
flush
()
dco
=
zlib
.
decompressobj
(
wbits
=-
zlib
.
MAX_WBITS
,
zdict
=
zdict
)
uncomp
=
dco
.
decompress
(
comp
)
+
dco
.
flush
()
self
.
assertEqual
(
zdict
,
uncomp
)
def
test_flush_with_freed_input
(
self
):
# Issue #16411: decompressor accesses input to last decompress() call
# in flush(), even if this object has been freed in the meanwhile.
...
...
Misc/NEWS
View file @
1ab2f142
...
...
@@ -27,6 +27,9 @@ Core and Builtins
Library
-------
- Issue #27164: In the zlib module, allow decompressing raw Deflate streams
with a predefined zdict. Based on patch by Xiang Zhang.
- Issue #24291: Fix wsgiref.simple_server.WSGIRequestHandler to completely
write data to the client. Previously it could do partial writes and
truncate data. Also, wsgiref.handler.ServerHandler can now handle stdout
...
...
Modules/zlibmodule.c
View file @
1ab2f142
...
...
@@ -22,6 +22,10 @@
#define LEAVE_ZLIB(obj)
#endif
#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1221
#define AT_LEAST_ZLIB_1_2_2_1
#endif
/* The following parameters are copied from zutil.h, version 0.95 */
#define DEFLATED 8
#if MAX_MEM_LEVEL >= 8
...
...
@@ -473,6 +477,31 @@ zlib_compressobj_impl(PyModuleDef *module, int level, int method, int wbits,
return
(
PyObject
*
)
self
;
}
static
int
set_inflate_zdict
(
compobject
*
self
)
{
Py_buffer
zdict_buf
;
int
err
;
if
(
PyObject_GetBuffer
(
self
->
zdict
,
&
zdict_buf
,
PyBUF_SIMPLE
)
==
-
1
)
{
return
-
1
;
}
if
((
size_t
)
zdict_buf
.
len
>
UINT_MAX
)
{
PyErr_SetString
(
PyExc_OverflowError
,
"zdict length does not fit in an unsigned int"
);
PyBuffer_Release
(
&
zdict_buf
);
return
-
1
;
}
err
=
inflateSetDictionary
(
&
(
self
->
zst
),
zdict_buf
.
buf
,
(
unsigned
int
)
zdict_buf
.
len
);
PyBuffer_Release
(
&
zdict_buf
);
if
(
err
!=
Z_OK
)
{
zlib_error
(
self
->
zst
,
err
,
"while setting zdict"
);
return
-
1
;
}
return
0
;
}
/*[clinic input]
zlib.decompressobj
...
...
@@ -514,6 +543,20 @@ zlib_decompressobj_impl(PyModuleDef *module, int wbits, PyObject *zdict)
switch
(
err
)
{
case
(
Z_OK
):
self
->
is_initialised
=
1
;
if
(
self
->
zdict
!=
NULL
&&
wbits
<
0
)
{
#ifdef AT_LEAST_ZLIB_1_2_2_1
if
(
set_inflate_zdict
(
self
)
<
0
)
{
Py_DECREF
(
self
);
return
NULL
;
}
#else
PyErr_Format
(
ZlibError
,
"zlib version %s does not allow raw inflate with dictionary"
,
ZLIB_VERSION
);
Py_DECREF
(
self
);
return
NULL
;
#endif
}
return
(
PyObject
*
)
self
;
case
(
Z_STREAM_ERROR
):
Py_DECREF
(
self
);
...
...
@@ -740,29 +783,12 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data,
Py_END_ALLOW_THREADS
if
(
err
==
Z_NEED_DICT
&&
self
->
zdict
!=
NULL
)
{
Py_buffer
zdict_buf
;
if
(
PyObject_GetBuffer
(
self
->
zdict
,
&
zdict_buf
,
PyBUF_SIMPLE
)
==
-
1
)
{
if
(
set_inflate_zdict
(
self
)
<
0
)
{
Py_DECREF
(
RetVal
);
RetVal
=
NULL
;
goto
error
;
}
if
((
size_t
)
zdict_buf
.
len
>
UINT_MAX
)
{
PyErr_SetString
(
PyExc_OverflowError
,
"zdict length does not fit in an unsigned int"
);
PyBuffer_Release
(
&
zdict_buf
);
Py_CLEAR
(
RetVal
);
goto
error
;
}
err
=
inflateSetDictionary
(
&
(
self
->
zst
),
zdict_buf
.
buf
,
(
unsigned
int
)
zdict_buf
.
len
);
PyBuffer_Release
(
&
zdict_buf
);
if
(
err
!=
Z_OK
)
{
zlib_error
(
self
->
zst
,
err
,
"while decompressing data"
);
Py_CLEAR
(
RetVal
);
goto
error
;
}
/* Repeat the call to inflate. */
Py_BEGIN_ALLOW_THREADS
err
=
inflate
(
&
(
self
->
zst
),
Z_SYNC_FLUSH
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment