From 3c3d2728add34c57925de4f9e731d521493bc068 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 20 Jun 2010 21:51:15 +0200 Subject: [PATCH] MPD: Don't crash when receiving invalid data --- mopidy/mpd/server.py | 11 +++++++---- tests/mpd/server_test.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 tests/mpd/server_test.py diff --git a/mopidy/mpd/server.py b/mopidy/mpd/server.py index cec5d644..a5ac95bc 100644 --- a/mopidy/mpd/server.py +++ b/mopidy/mpd/server.py @@ -70,10 +70,13 @@ class MpdSession(asynchat.async_chat): def found_terminator(self): data = ''.join(self.input_buffer).strip() self.input_buffer = [] - request = data.decode(ENCODING) - logger.debug(u'Input ([%s]:%s): %s', self.client_address, - self.client_port, indent(request)) - self.handle_request(request) + try: + request = data.decode(ENCODING) + logger.debug(u'Input ([%s]:%s): %s', self.client_address, + self.client_port, indent(request)) + self.handle_request(request) + except UnicodeDecodeError as e: + logger.warning(u'Received invalid data: %s', e) def handle_request(self, request): my_end, other_end = multiprocessing.Pipe() diff --git a/tests/mpd/server_test.py b/tests/mpd/server_test.py new file mode 100644 index 00000000..5407daa1 --- /dev/null +++ b/tests/mpd/server_test.py @@ -0,0 +1,16 @@ +import unittest + +from mopidy.mpd.server import MpdSession + +class MpdServerTest(unittest.TestCase): + pass # TODO + +class MpdSessionTest(unittest.TestCase): + def setUp(self): + self.session = MpdSession(None, None, (None, None), None) + + def test_found_terminator_catches_decode_error(self): + # Pressing Ctrl+C in a telnet session sends a 0xff byte to the server. + self.session.input_buffer = ['\xff'] + self.session.found_terminator() + self.assertEqual(len(self.session.input_buffer), 0)