summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgsub1
-rw-r--r--.hgsubstate1
-rw-r--r--jni/icsandroid.cpp30
-rw-r--r--jni/icsandroid.h9
-rw-r--r--openvpn/src/openvpn/push.c1
-rw-r--r--src/de/blinkt/openvpn/FileProvider.java129
6 files changed, 171 insertions, 0 deletions
diff --git a/.hgsub b/.hgsub
new file mode 100644
index 00000000..ec61ba02
--- /dev/null
+++ b/.hgsub
@@ -0,0 +1 @@
+google-breakpad=[svn]http://google-breakpad.googlecode.com/svn/trunk/
diff --git a/.hgsubstate b/.hgsubstate
new file mode 100644
index 00000000..248e9942
--- /dev/null
+++ b/.hgsubstate
@@ -0,0 +1 @@
+1093 google-breakpad
diff --git a/jni/icsandroid.cpp b/jni/icsandroid.cpp
new file mode 100644
index 00000000..cd63c6fd
--- /dev/null
+++ b/jni/icsandroid.cpp
@@ -0,0 +1,30 @@
+
+#include "icsandroid.h"
+#include "client/linux/handler/exception_handler.h"
+
+namespace {
+
+bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
+ void* context,
+ bool succeeded) {
+ printf("Dump path: %s\n", descriptor.path());
+fflush(stdout);
+ return succeeded;
+}
+
+void Crash() {
+ volatile int* a = reinterpret_cast<volatile int*>(NULL);
+ *a = 1;
+}
+
+} // namespace
+
+static google_breakpad::MinidumpDescriptor* desc;
+static google_breakpad::ExceptionHandler* eh;
+void setup_breakpad(void)
+{
+printf("Initializing Google Breakpad!\n");
+desc = new google_breakpad::MinidumpDescriptor("/data/data/de.blinkt.openvpn/cache");
+eh = new google_breakpad::ExceptionHandler(*desc, NULL, DumpCallback, NULL, true,-1);
+}
+
diff --git a/jni/icsandroid.h b/jni/icsandroid.h
new file mode 100644
index 00000000..cd11da40
--- /dev/null
+++ b/jni/icsandroid.h
@@ -0,0 +1,9 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ void setup_breakpad(void);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/openvpn/src/openvpn/push.c b/openvpn/src/openvpn/push.c
index 929a2f24..148d7ebe 100644
--- a/openvpn/src/openvpn/push.c
+++ b/openvpn/src/openvpn/push.c
@@ -464,6 +464,7 @@ process_incoming_push_msg (struct context *c,
md5_state_update (&c->c2.pulled_options_state, BPTR(&buf_orig), BLEN(&buf_orig));
md5_state_final (&c->c2.pulled_options_state, &c->c2.pulled_options_digest);
ret = PUSH_MSG_REPLY;
+ md5_state_init (&c->c2.pulled_options_state);
break;
case 2:
md5_state_update (&c->c2.pulled_options_state, BPTR(&buf_orig), BLEN(&buf_orig));
diff --git a/src/de/blinkt/openvpn/FileProvider.java b/src/de/blinkt/openvpn/FileProvider.java
new file mode 100644
index 00000000..1147ccf0
--- /dev/null
+++ b/src/de/blinkt/openvpn/FileProvider.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.blinkt.openvpn;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.ContentProvider.PipeDataWriter;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+/**
+ * A very simple content provider that can serve arbitrary asset files from
+ * our .apk.
+ */
+public class FileProvider extends ContentProvider
+ implements PipeDataWriter<InputStream> {
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ // Don't support queries.
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ // Don't support inserts.
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ // Don't support deletes.
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ // Don't support updates.
+ return 0;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ // For this sample, assume all files are .apks.
+ return "application/octet-stream";
+ }
+
+ @Override
+ public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
+ // Try to open an asset with the given name.
+ String path = uri.getPath();
+ if(path.startsWith("/"))
+ path = path.replaceFirst("/", "");
+
+ // I think this already random enough, no need for magic secure cookies
+ // 1f9563a4-a1f5-2165-255f2219-111823ef.dmp
+ if (!path.matches("^[0-9a-z-.]*$"))
+ throw new FileNotFoundException("url not in expect format " + uri);
+
+ try {
+
+ File cachedir = getContext().getCacheDir();
+ File dumpfile = new File(cachedir,path);
+ InputStream is = new FileInputStream(dumpfile);
+ // Start a new thread that pipes the stream data back to the caller.
+ return new AssetFileDescriptor(
+ openPipeHelper(uri, null, null, is, this), 0,
+ dumpfile.length());
+ } catch (IOException e) {
+ FileNotFoundException fnf = new FileNotFoundException("Unable to open minidump " + uri);
+ throw fnf;
+ }
+ }
+
+ @Override
+ public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String mimeType,
+ Bundle opts, InputStream args) {
+ // Transfer data from the asset to the pipe the client is reading.
+ byte[] buffer = new byte[8192];
+ int n;
+ FileOutputStream fout = new FileOutputStream(output.getFileDescriptor());
+ try {
+ while ((n=args.read(buffer)) >= 0) {
+ fout.write(buffer, 0, n);
+ }
+ } catch (IOException e) {
+ Log.i("OpenVPNFileProvider", "Failed transferring", e);
+ } finally {
+ try {
+ args.close();
+ } catch (IOException e) {
+ }
+ try {
+ fout.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+}