summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2007-03-13 22:49:43 (GMT)
committerGeorg Brandl <georg@python.org>2007-03-13 22:49:43 (GMT)
commit4aef7275cb993e18cdddf8ae8615d44f757fd717 (patch)
treed5b516f862e170ea3a866807f8e1b4e1947d6284
parent7e2b6bb24f58d134239cd2641cb5a6b4dbc3c917 (diff)
downloadcpython-4aef7275cb993e18cdddf8ae8615d44f757fd717.zip
cpython-4aef7275cb993e18cdddf8ae8615d44f757fd717.tar.gz
cpython-4aef7275cb993e18cdddf8ae8615d44f757fd717.tar.bz2
Patch #1185447: binascii.b2a_qp() now correctly quotes binary characters
with ASCII value less than 32. Also, it correctly quotes dots only if they occur on a single line, as opposed to the previous behavior of quoting dots if they are the second character of any line.
-rwxr-xr-xLib/test/test_binascii.py9
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/binascii.c12
3 files changed, 22 insertions, 4 deletions
diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py
index 8272ad9..ea8be31 100755
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -148,6 +148,15 @@ class BinASCIITest(unittest.TestCase):
"0"*75+"=\r\n=FF\r\n=FF\r\n=FF"
)
+ self.assertEqual(binascii.b2a_qp('\0\n'), '=00\n')
+ self.assertEqual(binascii.b2a_qp('\0\n', quotetabs=True), '=00\n')
+ self.assertEqual(binascii.b2a_qp('foo\tbar\t\n'), 'foo\tbar=09\n')
+ self.assertEqual(binascii.b2a_qp('foo\tbar\t\n', quotetabs=True), 'foo=09bar=09\n')
+
+ self.assertEqual(binascii.b2a_qp('.'), '=2E')
+ self.assertEqual(binascii.b2a_qp('.\n'), '=2E\n')
+ self.assertEqual(binascii.b2a_qp('a.\n'), 'a.\n')
+
def test_empty_string(self):
# A test for SF bug #1022953. Make sure SystemError is not raised.
for n in ['b2a_qp', 'a2b_hex', 'b2a_base64', 'a2b_uu', 'a2b_qp',
diff --git a/Misc/NEWS b/Misc/NEWS
index d9bf14f..355a827 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -525,6 +525,11 @@ Library
Extension Modules
-----------------
+- Patch #1185447: binascii.b2a_qp() now correctly quotes binary characters
+ with ASCII value less than 32. Also, it correctly quotes dots only if
+ they occur on a single line, as opposed to the previous behavior of
+ quoting dots if they are the second character of any line.
+
- Bug #1622896: fix a rare corner case where the bz2 module raised an
error in spite of a succesful compression.
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 4dee451..91309f6 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -1160,12 +1160,14 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
if ((data[in] > 126) ||
(data[in] == '=') ||
(header && data[in] == '_') ||
- ((data[in] == '.') && (linelen == 1)) ||
+ ((data[in] == '.') && (linelen == 0) &&
+ (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
(!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
((data[in] < 33) &&
(data[in] != '\r') && (data[in] != '\n') &&
- (quotetabs && ((data[in] != '\t') || (data[in] != ' ')))))
+ (quotetabs ||
+ (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
{
if ((linelen + 3) >= MAXLINESIZE) {
linelen = 0;
@@ -1230,12 +1232,14 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
if ((data[in] > 126) ||
(data[in] == '=') ||
(header && data[in] == '_') ||
- ((data[in] == '.') && (linelen == 1)) ||
+ ((data[in] == '.') && (linelen == 0) &&
+ (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
(!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
((data[in] < 33) &&
(data[in] != '\r') && (data[in] != '\n') &&
- (quotetabs && ((data[in] != '\t') || (data[in] != ' ')))))
+ (quotetabs ||
+ (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
{
if ((linelen + 3 )>= MAXLINESIZE) {
odata[out++] = '=';