2

I'm following the tutorials for rapidxml on iOS5 and unfortunately my c is a little rusty. The following code works great for smaller char sizes but crashes with

EXC_BAD_ACCESS
when I pull down larger sizes (I'm pulling XML off of a RESTful interface).
# pragma mark - parser methods
-(void)parseIncomingFeed:(NSData *)xmlData:(NSString*)tag {

    NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
    NSLog(@"[xmlStringOrg length] = %-10d  [xmlData length] = %d", [xmlStringOrg length],[xmlData length]);
    char xmlString[[xmlStringOrg length]];
    strcpy(xmlString, [xmlStringOrg UTF8String]);  // <--- crashes here
    ...

And here are the results:

[xmlStringOrg length] = 13580       [xmlData length] = 13580
[xmlStringOrg length] = 115476      [xmlData length] = 115476
[xmlStringOrg length] = 154589      [xmlData length] = 154589
[xmlStringOrg length] = 1902        [xmlData length] = 1902
[xmlStringOrg length] = 23402       [xmlData length] = 23402
[xmlStringOrg length] = 93037       [xmlData length] = 93037
[xmlStringOrg length] = 1723        [xmlData length] = 1723
[xmlStringOrg length] = 172329      [xmlData length] = 172329
[xmlStringOrg length] = 3470671     [xmlData length] = 3470671

(boom! with EXE_BAD_ACCESS leading to:  0x3234af6e:  push.w {r3, r4})

Blindly, I've tried the following but without luck:

 NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
 char xmlString[3600000];
 strcpy(xmlString, [xmlStringOrg UTF8String]);

and

 NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
 char xmlString[[xmlStringOrg length]];
 strncpy(xmlString, [xmlStringOrg UTF8String], [xmlStringOrg length]);

Any ideas? From my c classes ages ago, it feels like I need to chunk sizes above X and process them separately but I'm not sure where to start.R


EDIT 1 - WORKING

thanks to @RichardJ.RossIII, the following works:
# pragma mark - parser methods
-(void)parseIncomingFeed:(NSData *)xmlData:(NSString*)tag {

    NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
    NSLog(@"[xmlStringOrg length] = %-10d  [xmlData length] = %d", [xmlStringOrg length],[xmlData length]);
    char *xmlString = (char*) malloc([xmlStringOrg length]);
    strcpy(xmlString, [xmlStringOrg UTF8String]);  // no more tears
    ...
    free(xmlString);
  }
jscs
  • 62,161
  • 12
  • 145
  • 186
Onjuku
  • 71
  • 4
  • It's obvious your buffer is overflowing, what happens if you use malloc and free? – Richard J. Ross III Apr 04 '12 at 16:04
  • thanks @RichardJ.RossIII, that did it. I changed `char xmlString[[xmlStringOrg length]];` --> `char *xmlString = (char*) malloc([xmlStringOrg length]);` and added `free(xmlString);` at the end of my method. – Onjuku Apr 04 '12 at 17:17
  • Great that you solved this! Please post the solution as an answer, below, rather than as an edit to your question. – jscs Apr 05 '12 at 18:00
  • Any reason you convert your bytes to a `NSString` object just to convert it back to a byte array? A `const char *xmlString = [xmlData bytes];` should be enough. – Sven Apr 05 '12 at 18:02

0 Answers0