@@ -203,7 +203,12 @@ fextl::string GdbServer::ReadPacket() {
203
203
break ;
204
204
case ' }' : // escape char
205
205
{
206
- auto escaped = CommsStream.get ();
206
+ Utils::NetStream::ReturnGet escaped;
207
+
208
+ do {
209
+ escaped = CommsStream.get ();
210
+ } while (!escaped.HasData () && !escaped.HasHangup ());
211
+
207
212
if (escaped.HasData ()) {
208
213
packet.push_back (escaped.GetData () ^ 0x20 );
209
214
} else {
@@ -214,7 +219,7 @@ fextl::string GdbServer::ReadPacket() {
214
219
case ' #' : // end of packet
215
220
{
216
221
char hexString[3 ] = {0 , 0 , 0 };
217
- CommsStream.read (hexString, 2 );
222
+ CommsStream.read (hexString, 2 , true );
218
223
int expected_checksum = std::strtoul (hexString, nullptr , 16 );
219
224
220
225
if (calculateChecksum (packet) == expected_checksum) {
@@ -1395,45 +1400,47 @@ void GdbServer::GdbServerLoop() {
1395
1400
1396
1401
HandledPacketType response {};
1397
1402
1398
- // Outer server loop. Handles packet start, ACK/NAK and break
1399
- Utils::NetStream::ReturnGet c;
1400
- while (!CoreShuttingDown.load () && (c = CommsStream.get ()).HasData ()) {
1401
- switch (c.GetData ()) {
1402
- case ' $' : {
1403
- auto packet = ReadPacket ();
1404
- response = ProcessPacket (packet);
1405
- SendPacketPair (response);
1406
- if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {
1407
- LogMan::Msg::DFmt (" Unknown packet {}" , packet);
1403
+ while (!CoreShuttingDown.load ()) {
1404
+ // Outer server loop. Handles packet start, ACK/NAK and break
1405
+ Utils::NetStream::ReturnGet c;
1406
+ while ((c = CommsStream.get ()).HasData ()) {
1407
+ switch (c.GetData ()) {
1408
+ case ' $' : {
1409
+ auto packet = ReadPacket ();
1410
+ response = ProcessPacket (packet);
1411
+ SendPacketPair (response);
1412
+ if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {
1413
+ LogMan::Msg::DFmt (" Unknown packet {}" , packet);
1414
+ }
1415
+ break ;
1408
1416
}
1409
- break ;
1410
- }
1411
- case ' +' :
1412
- // ACK, do nothing.
1413
- break ;
1414
- case ' -' :
1415
- // NAK, Resend requested
1416
- {
1417
- std::lock_guard lk (sendMutex);
1418
- SendPacket (response.Response );
1417
+ case ' +' :
1418
+ // ACK, do nothing.
1419
+ break ;
1420
+ case ' -' :
1421
+ // NAK, Resend requested
1422
+ {
1423
+ std::lock_guard lk (sendMutex);
1424
+ SendPacket (response.Response );
1425
+ }
1426
+ break ;
1427
+ case ' \x03 ' : { // ASCII EOT
1428
+ SyscallHandler->TM .Pause ();
1429
+ fextl::string str = fextl::fmt::format (" T02thread:{:02x};" , getpid ());
1430
+ if (LibraryMapChanged) {
1431
+ // If libraries have changed then let gdb know
1432
+ str += " library:1;" ;
1433
+ }
1434
+ SendPacketPair ({std::move (str), HandledPacketType::TYPE_ACK});
1435
+ break ;
1419
1436
}
1420
- break ;
1421
- case ' \x03 ' : { // ASCII EOT
1422
- SyscallHandler->TM .Pause ();
1423
- fextl::string str = fextl::fmt::format (" T02thread:{:02x};" , getpid ());
1424
- if (LibraryMapChanged) {
1425
- // If libraries have changed then let gdb know
1426
- str += " library:1;" ;
1437
+ default : LogMan::Msg::DFmt (" GdbServer: Unexpected byte {} ({:02x})" , c.GetData (), c.GetData ());
1427
1438
}
1428
- SendPacketPair ({std::move (str), HandledPacketType::TYPE_ACK});
1429
- break ;
1430
- }
1431
- default : LogMan::Msg::DFmt (" GdbServer: Unexpected byte {} ({:02x})" , c.GetData (), c.GetData ());
1432
1439
}
1433
- }
1434
1440
1435
- if (c.HasHangup ()) {
1436
- break ;
1441
+ if (c.HasHangup ()) {
1442
+ break ;
1443
+ }
1437
1444
}
1438
1445
1439
1446
{
0 commit comments