Skip to content
Permalink
Browse files

Fix exception handling weirdness on ios-arm

Turns out `v8::Trycatch` must be stack-allocated, and we were implicitly
allocating it on the heap by making it part of a heap-allocated object.
  • Loading branch information
oleavr committed Jun 17, 2015
1 parent 03d4a62 commit 2f02e911edc4a5df80051fdaed72e0281ea751e7
@@ -19,6 +19,7 @@ libfrida_gumjs_1_0_la_LIBTOOLFLAGS = \

libfrida_gumjs_la_SOURCES = \
gumscript.cpp \
gumscript-priv.h \
gumscript-runtime.h \
gumscriptplatform.h \
gumscriptplatform.cpp \
@@ -29,6 +30,7 @@ libfrida_gumjs_la_SOURCES = \
gumscripttask.h \
gumscripttask.c \
gumscriptscope.h \
gumscriptscope.cpp \
gumscriptcore.h \
gumscriptcore.cpp \
gumscriptmemory.h \
@@ -6,6 +6,7 @@
<ClCompile Include="gumscriptbundle.cpp" />
<ClCompile Include="gumscriptscheduler.c" />
<ClCompile Include="gumscripttask.c" />
<ClCompile Include="gumscriptscope.cpp" />
<ClCompile Include="gumscriptcore.cpp" />
<ClCompile Include="gumscriptmemory.cpp" />
<ClCompile Include="gumscriptprocess.cpp" />
@@ -21,6 +22,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="gumscript.h" />
<ClInclude Include="gumscript-priv.h" />
<ClInclude Include="gumscriptplatform.h" />
<ClInclude Include="gumscriptbundle.h" />
<ClInclude Include="gumscriptscheduler.h" />
@@ -75,4 +77,4 @@
<Filter>runtime</Filter>
</CustomBuild>
</ItemGroup>
</Project>
</Project>
@@ -6,6 +6,7 @@
<ClCompile Include="gumscriptbundle.cpp" />
<ClCompile Include="gumscriptscheduler.c" />
<ClCompile Include="gumscripttask.c" />
<ClCompile Include="gumscriptscope.cpp" />
<ClCompile Include="gumscriptcore.cpp" />
<ClCompile Include="gumscriptmemory.cpp" />
<ClCompile Include="gumscriptprocess.cpp" />
@@ -21,6 +22,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="gumscript.h" />
<ClInclude Include="gumscript-priv.h" />
<ClInclude Include="gumscriptplatform.h" />
<ClInclude Include="gumscriptbundle.h" />
<ClInclude Include="gumscriptscheduler.h" />
@@ -75,4 +77,4 @@
<Filter>runtime</Filter>
</CustomBuild>
</ItemGroup>
</Project>
</Project>
@@ -10,6 +10,7 @@

<ItemGroup>
<ClInclude Include="gumscript.h" />
<ClInclude Include="gumscript-priv.h" />
<ClInclude Include="gumscriptplatform.h" />
<ClInclude Include="$(IntDir)gumjs\gumscript-runtime.h" />
<ClInclude Include="$(IntDir)gumjs\gumscript-debug.h" />
@@ -37,6 +38,7 @@
<ClCompile Include="gumscriptbundle.cpp" />
<ClCompile Include="gumscriptscheduler.c" />
<ClCompile Include="gumscripttask.c" />
<ClCompile Include="gumscriptscope.cpp" />
<ClCompile Include="gumscriptcore.cpp" />
<ClCompile Include="gumscriptmemory.cpp" />
<ClCompile Include="gumscriptprocess.cpp" />
@@ -0,0 +1,57 @@
/*
* Copyright (C) 2015 Ole André Vadla Ravnås <oleavr@nowsecure.com>
*
* Licence: wxWindows Library Licence, Version 3.1
*/

#ifndef __GUM_SCRIPT_PRIV_H__
#define __GUM_SCRIPT_PRIV_H__

#include "gumscript.h"
#include "gumscriptcore.h"
#include "gumscriptfile.h"
#include "gumscriptinstruction.h"
#include "gumscriptinterceptor.h"
#include "gumscriptmemory.h"
#include "gumscriptmodule.h"
#include "gumscriptplatform.h"
#include "gumscriptprocess.h"
#include "gumscriptscope.h"
#include "gumscriptsocket.h"
#include "gumscriptstalker.h"
#include "gumscriptsymbol.h"
#include "gumscripttask.h"
#include "gumscriptthread.h"

G_BEGIN_DECLS

struct _GumScriptPrivate
{
gchar * name;
gchar * source;
GMainContext * main_context;

v8::Isolate * isolate;
GumScriptCore core;
GumScriptMemory memory;
GumScriptProcess process;
GumScriptThread thread;
GumScriptModule module;
GumScriptFile file;
GumScriptSocket socket;
GumScriptInterceptor interceptor;
GumScriptStalker stalker;
GumScriptSymbol symbol;
GumScriptInstruction instruction;
GumPersistent<v8::Context>::type * context;
GumPersistent<v8::Script>::type * code;
gboolean loaded;

GumScriptMessageHandler message_handler;
gpointer message_handler_data;
GDestroyNotify message_handler_data_destroy;
};

G_END_DECLS

#endif
@@ -7,20 +7,7 @@

#include "gumscript.h"

#include "gumscriptcore.h"
#include "gumscriptfile.h"
#include "gumscriptinstruction.h"
#include "gumscriptinterceptor.h"
#include "gumscriptmemory.h"
#include "gumscriptmodule.h"
#include "gumscriptplatform.h"
#include "gumscriptprocess.h"
#include "gumscriptscope.h"
#include "gumscriptsocket.h"
#include "gumscriptstalker.h"
#include "gumscriptsymbol.h"
#include "gumscripttask.h"
#include "gumscriptthread.h"
#include "gumscript-priv.h"

#include <gum/gum-init.h>
#include <string.h>
@@ -51,33 +38,6 @@ enum
PROP_MAIN_CONTEXT
};

struct _GumScriptPrivate
{
gchar * name;
gchar * source;
GMainContext * main_context;

Isolate * isolate;
GumScriptCore core;
GumScriptMemory memory;
GumScriptProcess process;
GumScriptThread thread;
GumScriptModule module;
GumScriptFile file;
GumScriptSocket socket;
GumScriptInterceptor interceptor;
GumScriptStalker stalker;
GumScriptSymbol symbol;
GumScriptInstruction instruction;
GumPersistent<Context>::type * context;
GumPersistent<Script>::type * code;
gboolean loaded;

GumScriptMessageHandler message_handler;
gpointer message_handler_data;
GDestroyNotify message_handler_data_destroy;
};

struct _GumScriptFromStringData
{
gchar * name;
@@ -975,93 +935,3 @@ gum_script_on_leave (GumInvocationListener * listener,
_gum_script_interceptor_on_leave (&self->priv->interceptor, context);
}

class ScriptScopeImpl
{
public:
ScriptScopeImpl (GumScript * parent)
: parent (parent),
locker (parent->priv->isolate),
isolate_scope (parent->priv->isolate),
handle_scope (parent->priv->isolate),
context (Local<Context>::New (parent->priv->isolate, *parent->priv->context)),
context_scope (context),
trycatch (parent->priv->isolate)
{
}

~ScriptScopeImpl ()
{
GumScriptPrivate * priv = parent->priv;

if (trycatch.HasCaught ())
{
Handle<Message> message = trycatch.Message ();
Handle<Value> exception = trycatch.Exception ();
trycatch.Reset ();

GString * error = g_string_new ("{\"type\":\"error\"");

Local<Value> resource_name = message->GetScriptResourceName ();
if (!resource_name->IsUndefined ())
{
String::Utf8Value resource_name_str (resource_name->ToString ());
g_string_append_printf (error, ",\"fileName\":\"%s\"",
*resource_name_str);

Maybe<int> line_number = message->GetLineNumber (context);
if (line_number.IsJust ())
{
g_string_append_printf (error, ",\"lineNumber\":%d",
line_number.FromJust ());
}
}

String::Utf8Value exception_str (exception);
gchar * exception_str_escaped = g_strescape (*exception_str, "");
g_string_append_printf (error, ",\"description\":\"%s\"",
exception_str_escaped);
g_free (exception_str_escaped);

g_string_append_c (error, '}');

_gum_script_core_emit_message (&priv->core, error->str, NULL, 0);

g_string_free (error, TRUE);
}
}

bool HasPendingException () const
{
return trycatch.HasCaught ();
}

private:
GumScript * parent;
Locker locker;
Isolate::Scope isolate_scope;
HandleScope handle_scope;
Local<Context> context;
Context::Scope context_scope;
TryCatch trycatch;
};

ScriptScope::ScriptScope (GumScript * parent)
: parent (parent),
impl (new ScriptScopeImpl (parent))
{
}

ScriptScope::~ScriptScope ()
{
delete impl;
impl = NULL;

_gum_script_stalker_process_pending (&parent->priv->stalker);
}

bool
ScriptScope::HasPendingException () const
{
return impl->HasPendingException ();
}

@@ -0,0 +1,75 @@
/*
* Copyright (C) 2015 Ole André Vadla Ravnås <oleavr@nowsecure.com>
*
* Licence: wxWindows Library Licence, Version 3.1
*/

#include "gumscriptscope.h"

#include "gumscript-priv.h"

using namespace v8;

ScriptScope::ScriptScope (GumScript * parent)
: parent (parent),
stalker_scope (parent),
locker (parent->priv->isolate),
isolate_scope (parent->priv->isolate),
handle_scope (parent->priv->isolate),
context (Local<Context>::New (parent->priv->isolate, *parent->priv->context)),
context_scope (context),
trycatch (parent->priv->isolate)
{
}

ScriptScope::~ScriptScope ()
{
GumScriptPrivate * priv = parent->priv;

if (trycatch.HasCaught ())
{
Handle<Message> message = trycatch.Message ();
Handle<Value> exception = trycatch.Exception ();
trycatch.Reset ();

GString * error = g_string_new ("{\"type\":\"error\"");

Local<Value> resource_name = message->GetScriptResourceName ();
if (!resource_name->IsUndefined ())
{
String::Utf8Value resource_name_str (resource_name->ToString ());
g_string_append_printf (error, ",\"fileName\":\"%s\"",
*resource_name_str);

Maybe<int> line_number = message->GetLineNumber (context);
if (line_number.IsJust ())
{
g_string_append_printf (error, ",\"lineNumber\":%d",
line_number.FromJust ());
}
}

String::Utf8Value exception_str (exception);
gchar * exception_str_escaped = g_strescape (*exception_str, "");
g_string_append_printf (error, ",\"description\":\"%s\"",
exception_str_escaped);
g_free (exception_str_escaped);

g_string_append_c (error, '}');

_gum_script_core_emit_message (&priv->core, error->str, NULL, 0);

g_string_free (error, TRUE);
}
}

ScriptStalkerScope::ScriptStalkerScope (GumScript * parent)
: parent (parent)
{
}

ScriptStalkerScope::~ScriptStalkerScope ()
{
_gum_script_stalker_process_pending (&parent->priv->stalker);
}

0 comments on commit 2f02e91

Please sign in to comment.
You can’t perform that action at this time.