diff -r 3ae2cd85a908 Lib/asynchat.py --- a/Lib/asynchat.py Sun Mar 09 11:18:16 2014 +0100 +++ b/Lib/asynchat.py Sun Mar 09 08:46:30 2014 -0400 @@ -97,6 +97,8 @@ "Set the input delimiter. Can be a fixed string of any length, an integer, or None" if isinstance(term, str) and self.use_encoding: term = bytes(term, self.encoding) + elif isinstance(term, int) and term < 0: + raise ValueError('Negative terminator value is not allowed') self.terminator = term def get_terminator (self): @@ -126,7 +128,7 @@ while self.ac_in_buffer: lb = len(self.ac_in_buffer) - terminator = self.get_terminator() + terminator = self.terminator if not terminator: # no terminator, collect it all self.collect_incoming_data (self.ac_in_buffer) @@ -137,7 +139,7 @@ if lb < n: self.collect_incoming_data (self.ac_in_buffer) self.ac_in_buffer = b'' - self.terminator = self.terminator - lb + self.terminator -= lb else: self.collect_incoming_data (self.ac_in_buffer[:n]) self.ac_in_buffer = self.ac_in_buffer[n:] diff -r 3ae2cd85a908 Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py Sun Mar 09 11:18:16 2014 +0100 +++ b/Lib/test/test_asynchat.py Sun Mar 09 08:46:30 2014 -0400 @@ -171,6 +171,9 @@ def test_numeric_terminator2(self): self.numeric_terminator_check(6) + def test_disallow_negative_terminator(self): + self.assertRaises(ValueError, self.numeric_terminator_check, -42) + def test_none_terminator(self): # Try reading a fixed number of bytes s, event = start_echo_server()