Commit 808ed5c2 authored by Stefan Behnel's avatar Stefan Behnel

prevent control characters in unicode literals (ord<32) from sneaking into the C source

parent 812eefa1
...@@ -135,7 +135,7 @@ def _to_escape_sequence(s): ...@@ -135,7 +135,7 @@ def _to_escape_sequence(s):
# within a character sequence, oct passes much better than hex # within a character sequence, oct passes much better than hex
return ''.join(['\\%03o' % ord(c) for c in s]) return ''.join(['\\%03o' % ord(c) for c in s])
_c_special = ('\\', '\0', '\n', '\r', '\t', '??', '"') _c_special = ('\\', '??', '"') + tuple(map(chr, range(32)))
_c_special_replacements = [(orig.encode('ASCII'), _c_special_replacements = [(orig.encode('ASCII'),
_to_escape_sequence(orig).encode('ASCII')) _to_escape_sequence(orig).encode('ASCII'))
for orig in _c_special ] for orig in _c_special ]
...@@ -171,7 +171,8 @@ def escape_byte_string(s): ...@@ -171,7 +171,8 @@ def escape_byte_string(s):
""" """
if _has_specials(s): if _has_specials(s):
for special, replacement in _c_special_replacements: for special, replacement in _c_special_replacements:
s = s.replace(special, replacement) if special in s:
s = s.replace(special, replacement)
try: try:
return s.decode("ASCII") # trial decoding: plain ASCII => done return s.decode("ASCII") # trial decoding: plain ASCII => done
except UnicodeDecodeError: except UnicodeDecodeError:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment