Avoid sending bare '*' and '}' in an lldb-server packet

They get treated as special RLE encoding symbols and packets get
corrupted. Most other packet types already know about this apparently,
but QEnvironment missed these two.

Should fix PR25300.

llvm-svn: 252521
This commit is contained in:
Tim Northover 2015-11-09 22:05:05 +00:00
parent 5b0ae794b6
commit 974ff61c57
3 changed files with 33 additions and 0 deletions

View File

@ -178,3 +178,24 @@ class ProcessLaunchTestCase(TestBase):
if not success:
self.fail(err_msg)
def test_environment_with_special_char (self):
"""Test that environment variables containing '*' and '}' are communicated correctly to the lldb-server."""
d = {'CXX_SOURCES' : 'print_env.cpp'}
self.build(dictionary=d)
self.setTearDownCleanup(d)
exe = os.path.join (os.getcwd(), "a.out")
evil_var = 'INIT*MIDDLE}TAIL'
target = self.dbg.CreateTarget(exe)
process = target.LaunchSimple(None, ['EVIL=' + evil_var], self.get_process_working_directory())
self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)
out = process.GetSTDOUT(len(evil_var))[:len(evil_var)]
if out != evil_var:
self.fail('The environment variable was mis-coded: %s\n' % repr(out))
newline = process.GetSTDOUT(1)[0]
if newline != '\r' and newline != '\n':
self.fail('Garbage at end of environment variable')

View File

@ -0,0 +1,11 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char *evil = getenv("EVIL");
puts(evil);
return 0;
}

View File

@ -1584,6 +1584,7 @@ GDBRemoteCommunicationClient::SendEnvironmentPacket (char const *name_equal_valu
case '$':
case '#':
case '*':
case '}':
send_hex_encoding = true;
break;
default: