From 8a8ba9f44948ae96163f62feb573a833dffacdf5 Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Fri, 4 May 2018 13:55:57 -0700 Subject: [PATCH] Handle KeyError while getting or setting variables (#413) --- ptvsd/wrapper.py | 12 ++++++++-- tests/highlevel/test_messages.py | 40 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/ptvsd/wrapper.py b/ptvsd/wrapper.py index 651ed71e..fe41997f 100644 --- a/ptvsd/wrapper.py +++ b/ptvsd/wrapper.py @@ -1292,7 +1292,11 @@ class VSCodeMessageProcessor(ipcjson.SocketIO, ipcjson.IpcChannel): vsc_var = int(args['variablesReference']) fmt = args.get('format', {}) - pyd_var = self.var_map.to_pydevd(vsc_var) + try: + pyd_var = self.var_map.to_pydevd(vsc_var) + except KeyError: + self.send_error_response(request) + return if len(pyd_var) == 3: cmd = pydevd_comm.CMD_GET_FRAME @@ -1383,7 +1387,11 @@ class VSCodeMessageProcessor(ipcjson.SocketIO, ipcjson.IpcChannel): """Handles DAP SetVariableRequest.""" vsc_var = int(args['variablesReference']) - pyd_var = self.var_map.to_pydevd(vsc_var) + try: + pyd_var = self.var_map.to_pydevd(vsc_var) + except KeyError: + self.send_error_response(request) + return var_name = args['name'] var_value = args['value'] diff --git a/tests/highlevel/test_messages.py b/tests/highlevel/test_messages.py index 92cc215d..50e56f35 100644 --- a/tests/highlevel/test_messages.py +++ b/tests/highlevel/test_messages.py @@ -449,6 +449,25 @@ class VariablesTests(NormalRequestTest, unittest.TestCase): self.expected_pydevd_request('{}\t2\tFRAME'.format(thread.id)), ]) + def test_invalid_var_ref(self): + with self.launched(): + with self.hidden(): + _, thread = self.pause('t', *[ + # (pfid, func, file, line) + (2, 'spam', 'abc.py', 10), # VSC frame ID 1 + (5, 'eggs', 'xyz.py', 2), # VSC frame ID 2 + ]) + self.send_request( + # should NOT match variable or frame ID + variablesReference=12345, + ) + received = self.vsc.received + + self.assert_vsc_received(received, [ + self.expected_failure(''), + # no events + ]) + def test_container(self): self.PYDEVD_CMD = CMD_GET_FRAME with self.launched(): @@ -570,6 +589,27 @@ class SetVariableTests(NormalRequestTest, unittest.TestCase): '{}\t2\tLOCAL\tspam\t1'.format(thread.id)), ]) + def test_invalid_var_ref(self): + with self.launched(): + with self.hidden(): + _, thread = self.pause('t', *[ + # (pfid, func, file, line) + (2, 'spam', 'abc.py', 10), # VSC frame ID 1 + (5, 'eggs', 'xyz.py', 2), # VSC frame ID 2 + ]) + self.send_request( + # should NOT match any variable or frame ID + variablesReference=12345, + name='spam', + value='eggs', + ) + received = self.vsc.received + + self.assert_vsc_received(received, [ + self.expected_failure(''), + # no events + ]) + def test_container(self): with self.launched(): with self.hidden():