EXC_BAD_ACCESS with libssh2?

1

I was finally able to compile libssh2, but now I keep seeing the EXC_BAD_ACCESS error.

This is the basic background as to how libssh2 works (at least the GUI) is this...

  1. Enter command
  2. Enter host IP
  3. Enter username/pass
  4. Press the button to send the SSH command

Now, simple commands like echo Hello World work fine, but the whole idea of this as a project was to be able to restart my mac remotely. Originally, using the command shutdown -r caused nothing to happen on the remote machine, and crashed the app. I then had the idea that I could simple open an applescript app that restarts the mac, by using the open /path/to/restart.app command, which works fine. The machine restarts, yippee!

EXCEPT, the app crashes with the following error:

Thread 1: EXC_BAD_ACCESS (code=1, address=_____)

I'm really new to objective-c, and I have no idea how to go about fixing this. Looking it up on google, I've found that it's caused by:

  1. Memory issue
  2. Message being sent to an object that's already been released (I'm not sure what this means, any help?)

So, I'm guessing that once the command is sent via SSH, it disconnects and then tires to show the result but the object's already gone.

I'd post the source code for this, but it's a lot of different files, so I'll post the github link:

https://github.com/x2on/libssh2-for-iOS

I have not modified any of the code, so if anyone has the desire to replicate my problem, the code I'm using is the same as the one from there.

Crash log:

Process:         libssh2-for-iOS [38153]
Path:            /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS
Identifier:      libssh2-for-iOS
Version:         ???
Code Type:       X86 (Native)
Parent Process:  ??? [1]
User ID:         501

Date/Time:       2012-04-18 18:32:03.883 -0400
OS Version:      Mac OS X 10.8 (12A154q)
Report Version:  10

Crashed Thread:  0

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000

External Modification Warnings:
Debugger attached to process.

VM Regions Near 0:
--> __PAGEZERO             0000000000000000-0000000000001000 [    4K] ---/--- SM=NUL  /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS
    __TEXT                 0000000000001000-0000000000002000 [    4K] r-x/rwx SM=COW  /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS

Application Specific Information:
iPhone Simulator 272, iPhone OS 5.0 (iPhone/9A334)


Thread 0 Crashed:
0   ???                             0000000000 0 + 0
1   libssh2-for-iOS                 0x00003f39 _libssh2_channel_open + 281
2   libssh2-for-iOS                 0x00004837 libssh2_channel_open_ex + 151
3   libssh2-for-iOS                 0x00003714 -[SSHWrapper executeCommand:] + 212
4   libssh2-for-iOS                 0x00002b22 -[libssh2_for_iOSAppDelegate executeCommand:] + 338
5   CoreFoundation                  0x01603ec9 -[NSObject performSelector:withObject:withObject:] + 73
6   UIKit                           0x0049e5c2 -[UIApplication sendAction:to:from:forEvent:] + 96
7   UIKit                           0x0049e55a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
8   UIKit                           0x00543b76 -[UIControl sendAction:to:forEvent:] + 66
9   UIKit                           0x0054403f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
10  UIKit                           0x00542e22 -[UIControl touchesBegan:withEvent:] + 264
11  UIKit                           0x004c393f -[UIWindow _sendTouchesForEvent:] + 272
12  UIKit                           0x004c3c56 -[UIWindow sendEvent:] + 273
13  UIKit                           0x004aa384 -[UIApplication sendEvent:] + 464
14  UIKit                           0x0049daa9 _UIApplicationHandleEvent + 8196
15  GraphicsServices                0x01cf8fa9 PurpleEventCallback + 1274
16  CoreFoundation                  0x015d61c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
17  CoreFoundation                  0x0153b022 __CFRunLoopDoSource1 + 146
18  CoreFoundation                  0x0153990a __CFRunLoopRun + 2218
19  CoreFoundation                  0x01538db4 CFRunLoopRunSpecific + 212
20  CoreFoundation                  0x01538ccb CFRunLoopRunInMode + 123
21  GraphicsServices                0x01cf7879 GSEventRunModal + 207
22  GraphicsServices                0x01cf793e GSEventRun + 114
23  UIKit                           0x0049ba9b UIApplicationMain + 1175
24  libssh2-for-iOS                 0x00003266 main + 134
25  libssh2-for-iOS                 0x00002955 start + 53

Thread 1:
0   libsystem_kernel.dylib          0x921059be kevent + 10
1   libdispatch.dylib               0x01c9e398 _dispatch_mgr_invoke + 918
2   libdispatch.dylib               0x01c9cc9d _dispatch_mgr_thread + 53

Thread 2:: WebThread
0   libsystem_kernel.dylib          0x921027e2 mach_msg_trap + 10
1   libsystem_kernel.dylib          0x92101cc0 mach_msg + 68
2   CoreFoundation                  0x015d613a __CFRunLoopServiceMachPort + 186
3   CoreFoundation                  0x01539605 __CFRunLoopRun + 1445
4   CoreFoundation                  0x01538db4 CFRunLoopRunSpecific + 212
5   CoreFoundation                  0x01538ccb CFRunLoopRunInMode + 123
6   WebCore                         0x03583220 RunWebThread(void*) + 560
7   libsystem_c.dylib               0x9445dd03 _pthread_start + 344
8   libsystem_c.dylib               0x944486ae thread_start + 34

Thread 0 crashed with X86 Thread State (32-bit):
  eax: 0x00000000  ebx: 0x00000007  ecx: 0x07439400  edx: 0x00000000
  edi: 0x00040000  esi: 0x00008000  ebp: 0xbfffbbc8  esp: 0xbfffbb2c
   ss: 0x00000023  efl: 0x00010286  eip: 0x00000000   cs: 0x0000001b
   ds: 0x00000023   es: 0x00000023   fs: 0x00000000   gs: 0x0000000f
  cr2: 0x00000000
Logical CPU: 1

(Binary images removed, too many characters)

External Modification Summary:
  Calls made by other processes targeting this process:
    task_for_pid: 1
    thread_create: 0
    thread_set_state: 32
  Calls made by this process:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0
  Calls made by all processes on this machine:
    task_for_pid: 14309
    thread_create: 0
    thread_set_state: 550

VM Region Summary:
ReadOnly portion of Libraries: Total=155.0M resident=50.0M(32%) swapped_out_or_unallocated=105.0M(68%)
Writable regions: Total=36.7M written=2264K(6%) resident=9020K(24%) swapped_out=108K(0%) unallocated=27.9M(76%)

REGION TYPE                      VIRTUAL
===========                      =======
CG image                             16K
CoreAnimation                       532K
MALLOC                             21.8M
MALLOC guard page                    32K
Memory tag=35                      10.8M
SQLite page cache                   288K
Stack                              65.3M
VM_ALLOCATE                         136K
__DATA                             9660K
__LINKEDIT                         55.9M
__PAGEZERO                            4K
__TEXT                             99.1M
__UNICODE                           544K
mapped file                       237.8M
shared memory                        12K
===========                      =======
TOTAL                             501.6M
objective-c
ios
asked on Stack Overflow Apr 19, 2012 by Charlie • edited Apr 19, 2012 by Charlie

2 Answers

2

I have downloaded the example code from https://github.com/x2on/libssh2-for-iOS, compiled libssl & libssh2 and the app. And when I ran that app, I got a very similar error as you:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x12c)

This happens to me when for some reason the connection is not established. E.g. if you don't enter any IP address, this exception will happen, or if you enter something that is not an IP address.

The problem seem to be inside the x2on's app, not in libssh2 or libssl. When I debugged the app, I found out, that when the connection cannot be established, the variable called session is NULL. Therefore the later call to libssh2_channel_open_session will fail with this exception, because it expects its parameter not to be NULL.

See the following screenshot:

Debugging the exception

In the bottom left corner, you see the value of the session variable. If it's NULL, then this is the problem. Also you can see the cause of the problem in the console output window in the right bottom corner, in my case it is "failed to connect!".

Anyway, the x2on's code seem to be a very very bad example of code, it ignores errors, uses bad coding style and many improper techniques (global variables, not setting rootviewcontroller) and other bad things.

answered on Stack Overflow Apr 21, 2012 by kuba
1

x2on code has many errors; one for all let's check the executeCommand routine:

  • it completely ignores data lenght of buffer returned from server: the text returned has no trailing zero, so if you do more than one call to this routine you'll get trailing garbage. Solution: use rc1 value to get its length (see below).

  • it loops until all data is received, but it does not cumulate that data in the result string, so you'll get only the latest text received, not the full server answer. Solution: use a NSMutableString instead of NSString and append results to it:

    NSMutableString *result = [[NSMutableString alloc] initWithString: @""];
    ...
    if( rc1 > 0 ) {
        [result appendString: [[NSString alloc] initWithCString:buffer length: rc1]];
            bytecount += rc1;
        }
    
  • *result is not handled correctly; if you do multiple call to the routine, from the second call you'll get an exception. Fast workaround:

    if (result) return result;
    else return @"Error - command failed";
    
answered on Stack Overflow May 4, 2012 by Walter Ferlazzo

User contributions licensed under CC BY-SA 3.0