bug-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #42781] In the case of HTTPS NSURLConnection doesn't report to it's


From: Sergei Golovin
Subject: [bug #42781] In the case of HTTPS NSURLConnection doesn't report to it's delegate about a refused connection
Date: Sun, 27 Jul 2014 12:05:13 +0000
User-agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0

Follow-up Comment #2, bug #42781 (project gnustep):

Instead of hanging it has began to segfault with my code.

I have a class which is used as a container for all data needed
to make a request to customer's service. The idea is to create
that class's instances with all parameters are filled and
to call the instance's methods -[start:] and -[stop] with
the runloop between. The instance makes the custom request
(from provided data), the NSURLConnection and assigns itself
as a delegate.

I have the test checking how that class behaves when
the customer's service is dead (not-listening).

The test's code chunk is:
-----------------------------------------------------------
// connect to nowhere
url = [NSURL URLWithString: @"https://localhost:30011";];
cmnd = [[testedClass alloc] initWithGateway: nil
                                        URL: url
                                    factory: nil
                                     object: nil
                                       type: C0INFO
                                 parameters: nil];
[cmnd start: nil];
while(![cmnd isCompleted])
  {
    [[NSRunLoop currentRunLoop]
       runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]];
  }
err = [cmnd error];
-----------------------------------------------------------


The segmentation fault occurs within the runloop and here is
the gdb session:
-----------------------------------------------------------
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6cd973f in objc_msg_lookup () from
/usr/lib/x86_64-linux-gnu/libobjc.so.4
(gdb) bt
#0  0x00007ffff6cd973f in objc_msg_lookup () from
/usr/lib/x86_64-linux-gnu/libobjc.so.4
#1  0x00007ffff706a0c7 in -[GSTLSHandler stream:handleEvent:] (self=0x76f5a0,
_cmd=0x7ffff75dada0 <_OBJC_SELECTOR_TABLE+576>,
    stream=0xc22c10, event=8) at GSSocketStream.m:660
#2  0x00007ffff7070964 in -[GSStream(Private) _sendEvent:] (self=0xc22c10,
_cmd=0x7ffff75d82b0 <_OBJC_SELECTOR_TABLE+688>, event=8)
    at GSStream.m:508
#3  0x00007ffff706c871 in -[GSSocketStream _sendEvent:] (self=0xc22c10,
_cmd=0x7ffff75d82b0 <_OBJC_SELECTOR_TABLE+688>, event=8)
    at GSSocketStream.m:1451
#4  0x00007ffff706da45 in -[GSSocketInputStream _dispatch] (self=0xc22a10,
_cmd=0x7ffff75dac70 <_OBJC_SELECTOR_TABLE+272>)
    at GSSocketStream.m:1993
#5  0x00007ffff706fe50 in -[GSStream receivedEvent:type:extra:forMode:]
(self=0xc22a10,
    _cmd=0x7ffff76c5ed0 <_OBJC_SELECTOR_TABLE+304>, data=0x7, type=ET_WDESC,
extra=0x7, mode=0x7ffff765b920 <_OBJC_INSTANCE_2>)
    at GSStream.m:221
#6  0x00007ffff7283efb in -[GSRunLoopCtxt pollUntil:within:] (self=0x6f6850,
_cmd=0x7ffff765cb40 <_OBJC_SELECTOR_TABLE+1216>,
    milliseconds=79, contexts=0x6f1150) at GSRunLoopCtxt.m:601
#7  0x00007ffff71b3362 in -[NSRunLoop acceptInputForMode:beforeDate:]
(self=0x6f0210,
    _cmd=0x7ffff765cb80 <_OBJC_SELECTOR_TABLE+1280>, mode=0x7ffff765b920
<_OBJC_INSTANCE_2>, limit_date=0x708b50) at NSRunLoop.m:1217
#8  0x00007ffff71b378a in -[NSRunLoop runMode:beforeDate:] (self=0x6f0210,
_cmd=0x7ffff765cba0 <_OBJC_SELECTOR_TABLE+1312>,
    mode=0x7ffff765b920 <_OBJC_INSTANCE_2>, date=0xc21880) at
NSRunLoop.m:1288
#9  0x00007ffff71b3924 in -[NSRunLoop runUntilDate:] (self=0x6f0210,
_cmd=0x6067f0 <_OBJC_SELECTOR_TABLE+176>, date=0xc21880)
    at NSRunLoop.m:1319
#10 0x0000000000403bd5 in -[PatternCommand2 startTest:] (self=0x647f60,
_cmd=0x606b20 <_OBJC_SELECTOR_TABLE+160>, args=0x6d8830)
    at patternCommand2.m:351
#11 0x0000000000404005 in main (argc=1, argv=0x7fffffffd4c8,
env=0x7fffffffd4d8) at testNetworkCommand2.m:42
(gdb) up
#1  0x00007ffff706a0c7 in -[GSTLSHandler stream:handleEvent:] (self=0x76f5a0,
_cmd=0x7ffff75dada0 <_OBJC_SELECTOR_TABLE+576>,
    stream=0xc22c10, event=8) at GSSocketStream.m:660
660               if ([ostream streamStatus] == NSStreamStatusOpen)
(gdb) up
#2  0x00007ffff7070964 in -[GSStream(Private) _sendEvent:] (self=0xc22c10,
_cmd=0x7ffff75d82b0 <_OBJC_SELECTOR_TABLE+688>, event=8)
    at GSStream.m:508
508                         handleEvent: NSStreamEventErrorOccurred];
(gdb) l
503             {
504               _events |= NSStreamEventErrorOccurred;
505               if (_delegateValid == YES)
506                 {
507                   [_delegate stream: self
508                         handleEvent: NSStreamEventErrorOccurred];
509                 }
510             }
511         }
512       else if (event == NSStreamEventEndEncountered)
(gdb) p _delegate
$4 = (struct objc_object *) 0x0
(gdb)) up
#3  0x00007ffff706c871 in -[GSSocketStream _sendEvent:] (self=0xc22c10,
_cmd=0x7ffff75d82b0 <_OBJC_SELECTOR_TABLE+688>, event=8)
    at GSSocketStream.m:1451
1451          [super _sendEvent: event];
(gdb)  l
1446          id        del = _delegate;
1447          BOOL      val = _delegateValid;
1448
1449          _delegate = _handler;
1450          _delegateValid = YES;
1451          [super _sendEvent: event];
1452          _delegate = del;
1453          _delegateValid = val;
1454        }
1455      else
(gdb)  p _handler
$5 = (struct objc_object *) 0x0
(gdb)
.....
-----------------------------------------------------------



Somehow the _handler has been released during the call [super _sendEvent:
event].
If i step up to the my code's frame:
-----------------------------------------------------------
.....
(gdb) up
#10 0x0000000000403bd5 in -[PatternCommand2 startTest:] (self=0x647f60,
_cmd=0x606b20 <_OBJC_SELECTOR_TABLE+160>, args=0x6d8830)
    at patternCommand2.m:351
351                       [[NSRunLoop currentRunLoop] runUntilDate: [NSDate
dateWithTimeIntervalSinceNow: timing]];
(gdb) l
346                                                          type: C0INFO
347                                                    parameters: nil];
348                   [cmnd start: nil];
349                   while(![cmnd isCompleted])
350                     {
351                       [[NSRunLoop currentRunLoop] runUntilDate: [NSDate
dateWithTimeIntervalSinceNow: timing]];
352                     }
353                   err = [cmnd error];
354                   d = [[err userInfo] objectForKey: @"description"];
355                   if(nil != err &&
(gdb) ) po [[cmnd error] userInfo]
{description = "Connection refused"; source = "<C0NetworkCommand: 0xc476e0
info>"; }
(gdb)
-----------------------------------------------------------

As you see my class's instance has already got the backcall
-[connection:didFailWithError:]
and stored the error from the NSURLConnection.




    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?42781>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]