From d4d5c4a90a8e7a421576aaf906f95894a6903074 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 17 May 2009 10:07:33 -0400 Subject: [PATCH] Rewrote -[SocketWrapper receive] so that we do not get any more partial/broken packets, hopefully. * Source/SocketWrapper.m: (receive) --- CHANGES | 1 + Source/SocketWrapper.m | 69 ++++++++++++++---------------------------- 2 files changed, 23 insertions(+), 47 deletions(-) diff --git a/CHANGES b/CHANGES index b403731..472323b 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ script a subsequent time - Fix: After using the run command, the stack will now be properly updated - New: A preference has been added to disable automatic stepping into the first line of execution +- Fix: MacGDBp should no longer throw incomplete packet error messages 1.2.1 diff --git a/Source/SocketWrapper.m b/Source/SocketWrapper.m index bb91fcf..f93d2f1 100644 --- a/Source/SocketWrapper.m +++ b/Source/SocketWrapper.m @@ -166,64 +166,39 @@ */ - (NSString*)receive { - // create a buffer - char buffer[1024]; - - // do our initial recv() call to get (hopefully) all the data and the lengh of the packet - int recvd = recv(sock, &buffer, sizeof(buffer), 0); - - // take the received data and put it into an NSData - NSMutableString* str = [NSMutableString string]; - - if (recvd == -1) - return nil; - - // strip the length from the packet, and clear the null byte then add it to the NSData + // Read the first part of the response, the length of the packet. char packetLength[8]; - memset(packetLength, '\0', sizeof(packetLength)); + memset(&packetLength, 0x0, 8); + char c; int i = 0; - while (buffer[i] != '\0') - { - packetLength[i] = buffer[i]; - i++; - } - - // we also want the null byte, so move us up 1 - i++; - - // the total length of the full transmission + while (recv(sock, &c, 1, 0) == 1 && c != 0x0) + packetLength[i++] = c; int length = atoi(packetLength); - // move the packet part of the received data into it's own char[] - char packet[sizeof(buffer)]; - memset(packet, '\0', sizeof(packet)); - memmove(packet, &buffer[i], recvd - i); + // Our final output. + NSMutableString* string = [[NSMutableString alloc] initWithCapacity:length]; + + // Create a buffer that we will move data from the network into. + char buffer[1024]; - // convert bytes to NSString - [str appendString:[NSString stringWithCString:packet length:recvd - i]]; + // The total amount of data we have currently read. + int received = 0; - // check if we have a partial packet - if (length + i > sizeof(buffer)) + // Loop until we have the entire packet. + while (received < length) { - while (recvd < length + i) + int size = recv(sock, &buffer, sizeof(buffer), 0); + if (size < 1) { - int latest = recv(sock, &buffer, sizeof(buffer), 0); - if (latest < 1) - { - [self error:@"Socket closed or could not be read"]; - return nil; - } - [str appendString:[NSString stringWithCString:buffer length:latest]]; - recvd += latest; + [self error:@"Socket closed or could not be read"]; + return nil; } + NSString* temp = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; + [string appendString:temp]; + received += [temp length]; } - NSString* tmp = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // strip whitespace - tmp = [tmp substringToIndex:[tmp length] - 1]; // don't want the null byte - - NSAssert([tmp UTF8String][[tmp length] - 1] == '>', @"-[SocketWrapper receive] buffer is incomplete"); - - return tmp; + return [string autorelease]; } /** -- 2.22.5