From: Tobias Brunner Date: Fri, 20 Sep 2013 08:30:02 +0000 (+0200) Subject: android: Properly handle failures while initializing charon X-Git-Tag: 5.1.1dr4~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c3ee829eeecb62a525ff8373a37c24081621511b;p=thirdparty%2Fstrongswan.git android: Properly handle failures while initializing charon --- diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c index 41fc4d6179..60485b66f3 100644 --- a/src/frontends/android/jni/libandroidbridge/charonservice.c +++ b/src/frontends/android/jni/libandroidbridge/charonservice.c @@ -589,7 +589,7 @@ static void segv_handler(int signal) /** * Initialize charon and the libraries via JNI */ -JNI_METHOD(CharonVpnService, initializeCharon, void, +JNI_METHOD(CharonVpnService, initializeCharon, jboolean, jobject builder, jstring jlogfile, jboolean byod) { struct sigaction action; @@ -603,7 +603,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, if (!library_init(NULL)) { library_deinit(); - return; + return FALSE; } /* set options before initializing other libraries that might read them */ @@ -615,7 +615,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, { libhydra_deinit(); library_deinit(); - return; + return FALSE; } if (!libipsec_init()) @@ -623,7 +623,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, libipsec_deinit(); libhydra_deinit(); library_deinit(); - return; + return FALSE; } if (!libcharon_init("charon")) @@ -632,7 +632,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, libipsec_deinit(); libhydra_deinit(); library_deinit(); - return; + return FALSE; } charon->load_loggers(charon, NULL, FALSE); @@ -664,7 +664,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, libipsec_deinit(); libhydra_deinit(); library_deinit(); - return; + return FALSE; } lib->plugins->status(lib->plugins, LEVEL_CTRL); @@ -680,6 +680,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void, /* start daemon (i.e. the threads in the thread-pool) */ charon->start(charon); + return TRUE; } /** diff --git a/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java index a7b8a8ceff..305ee80b2d 100644 --- a/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java +++ b/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java @@ -214,12 +214,20 @@ public class CharonVpnService extends VpnService implements Runnable mIsDisconnecting = false; BuilderAdapter builder = new BuilderAdapter(mCurrentProfile.getName()); - initializeCharon(builder, mLogFile, mCurrentProfile.getVpnType().getEnableBYOD()); - Log.i(TAG, "charon started"); - - initiate(mCurrentProfile.getVpnType().getIdentifier(), - mCurrentProfile.getGateway(), mCurrentProfile.getUsername(), - mCurrentProfile.getPassword()); + if (initializeCharon(builder, mLogFile, mCurrentProfile.getVpnType().getEnableBYOD())) + { + Log.i(TAG, "charon started"); + initiate(mCurrentProfile.getVpnType().getIdentifier(), + mCurrentProfile.getGateway(), mCurrentProfile.getUsername(), + mCurrentProfile.getPassword()); + } + else + { + Log.e(TAG, "failed to start charon"); + setError(ErrorState.GENERIC_ERROR); + setState(State.DISABLED); + mCurrentProfile = null; + } } } catch (InterruptedException ex) @@ -517,8 +525,9 @@ public class CharonVpnService extends VpnService implements Runnable * @param builder BuilderAdapter for this connection * @param logfile absolute path to the logfile * @param boyd enable BYOD features + * @return TRUE if initialization was successful */ - public native void initializeCharon(BuilderAdapter builder, String logfile, boolean byod); + public native boolean initializeCharon(BuilderAdapter builder, String logfile, boolean byod); /** * Deinitialize charon, provided by libandroidbridge.so