Send connman mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."


Today's Topics:

   1. [PATCH v2 1/3] Fix test-mozjs memory leak (Jeremy Linton)
   2. [PATCH v2 2/3] Fix unclean shutdown with proxy_disable
      (Jeremy Linton)
   3. [PATCH v2 3/3] Pull pacrunner forward to mozjs38 (Jeremy Linton)


----------------------------------------------------------------------

Message: 1
Date: Wed, 19 Apr 2017 12:24:51 -0500
From: Jeremy Linton <[email protected]>
To: [email protected]
Cc: [email protected],        Jeremy Linton <[email protected]>
Subject: [PATCH v2 1/3] Fix test-mozjs memory leak
Message-ID: <[email protected]>

The mozjs execute calls returns a g_strdup'ed result. This
means that the unit test needs to free the resulting data.

Signed-off-by: Jeremy Linton <[email protected]>
---
 unit/test-mozjs.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/unit/test-mozjs.c b/unit/test-mozjs.c
index 7ccdee9..25c8634 100644
--- a/unit/test-mozjs.c
+++ b/unit/test-mozjs.c
@@ -93,19 +93,19 @@ static void test_multiple_init(void)
 
 static void test_single_execute_without_pac(void)
 {
-       const char *result;
+       char *result;
 
        g_assert(mozjs_init() == 0);
 
        result = __pacrunner_js_execute(proxy, EXAMPLE_URL, EXAMPLE_HOST);
        g_test_message("result: %s", result);
-
+       g_free(result);
        mozjs_exit();
 }
 
 static void test_multiple_execute_without_pac(void)
 {
-       const char *result;
+       char *result;
        int i;
 
        g_assert(mozjs_init() == 0);
@@ -114,6 +114,7 @@ static void test_multiple_execute_without_pac(void)
                result = __pacrunner_js_execute(proxy, EXAMPLE_URL,
                                                EXAMPLE_HOST);
                g_test_message("result %d: %s", i, result);
+               g_free(result);
        }
 
        mozjs_exit();
@@ -121,7 +122,7 @@ static void test_multiple_execute_without_pac(void)
 
 static void test_single_execute_with_direct_pac(void)
 {
-       const char *result;
+       char *result;
 
        g_assert(mozjs_init() == 0);
 
@@ -129,6 +130,7 @@ static void test_single_execute_with_direct_pac(void)
 
        result = __pacrunner_js_execute(proxy, EXAMPLE_URL, EXAMPLE_HOST);
        g_test_message("result: %s", result);
+       g_free(result);
 
        pacrunner_proxy_disable(proxy);
 
@@ -137,7 +139,7 @@ static void test_single_execute_with_direct_pac(void)
 
 static void test_multiple_execute_with_direct_pac(void)
 {
-       const char *result;
+       char *result;
        int i;
 
        mozjs_init();
@@ -148,6 +150,7 @@ static void test_multiple_execute_with_direct_pac(void)
                result = __pacrunner_js_execute(proxy, EXAMPLE_URL,
                                                EXAMPLE_HOST);
                g_test_message("result %d: %s", i, result);
+               g_free(result);
        }
 
        pacrunner_proxy_disable(proxy);
@@ -157,7 +160,7 @@ static void test_multiple_execute_with_direct_pac(void)
 
 static void test_massive_execute_with_direct_pac(void)
 {
-       const char *result;
+       char *result;
        int i;
 
        mozjs_init();
@@ -168,6 +171,7 @@ static void test_massive_execute_with_direct_pac(void)
                result = __pacrunner_js_execute(proxy, EXAMPLE_URL,
                                                EXAMPLE_HOST);
                g_test_message("result %d: %s", i, result);
+               g_free(result);
        }
 
        pacrunner_proxy_disable(proxy);
@@ -177,7 +181,7 @@ static void test_massive_execute_with_direct_pac(void)
 
 static void test_multiple_execute_with_example_pac(void)
 {
-       const char *result;
+       char *result;
        int i;
 
        mozjs_init();
@@ -188,6 +192,7 @@ static void test_multiple_execute_with_example_pac(void)
                result = __pacrunner_js_execute(proxy, EXAMPLE_URL,
                                                EXAMPLE_HOST);
                g_test_message("result %d: %s", i, result);
+               g_free(result);
        }
 
        pacrunner_proxy_disable(proxy);
-- 
2.11.0



------------------------------

Message: 2
Date: Wed, 19 Apr 2017 12:24:52 -0500
From: Jeremy Linton <[email protected]>
To: [email protected]
Cc: [email protected],        Jeremy Linton <[email protected]>
Subject: [PATCH v2 2/3] Fix unclean shutdown with proxy_disable
Message-ID: <[email protected]>

The proxy disable code calls set_proxy and clears the
context structure, which results in the mosjs_clear_proxy
not being called. Also there is a memory leak in the glist
due to use of remove_link() rather than remove(). The former
simply removes the entry from the linked list but doesn't free
it.

Signed-off-by: Jeremy Linton <[email protected]>
---
 src/proxy.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/proxy.c b/src/proxy.c
index 7579887..88bfc2c 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -444,9 +444,11 @@ int pacrunner_proxy_disable(struct pacrunner_proxy *proxy)
 
        pthread_mutex_lock(&proxy_mutex);
        proxy_list = g_list_remove_link(proxy_list, list);
+       g_list_free(list); //must manually delete entry when 
g_link_remove_link()
+                          //is used instead of g_link_remove()
        pthread_mutex_unlock(&proxy_mutex);
 
-       __pacrunner_js_set_proxy(NULL);
+       __pacrunner_js_clear_proxy(proxy);
 
        pacrunner_proxy_unref(proxy);
 
-- 
2.11.0



------------------------------

Message: 3
Date: Wed, 19 Apr 2017 12:24:53 -0500
From: Jeremy Linton <[email protected]>
To: [email protected]
Cc: [email protected],        Jeremy Linton <[email protected]>
Subject: [PATCH v2 3/3] Pull pacrunner forward to mozjs38
Message-ID: <[email protected]>

Mozjs185 is getting really old and unsupported. Newer versions
of the mozjs JSAPI are C++ based. So we convert the plugin to
C++ and then apply necessarily API changes so that it can be built
with the more recent mozjs38. For example we now need to "root"
values being passed into the API in order to satisfy the JSAPI
garbage collection rules. Further, a number of the APIs have been
tweaked and moved into the JS namespace, so we namespace them
appropriately and adjust their parameters.

Signed-off-by: Jeremy Linton <[email protected]>
---
 Makefile.am                   |  15 +++---
 configure.ac                  |   4 +-
 plugins/{mozjs.c => mozjs.cc} | 109 ++++++++++++++++++++++--------------------
 3 files changed, 68 insertions(+), 60 deletions(-)
 rename plugins/{mozjs.c => mozjs.cc} (59%)

diff --git a/Makefile.am b/Makefile.am
index ee84b75..65cc8c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,9 +31,10 @@ endif
 if MOZJS
 js_sources = src/js_funcs.c
 builtin_modules += mozjs
-builtin_sources += plugins/mozjs.c
-builtin_cflags += @MOZJS_CFLAGS@
-builtin_libadd += @MOZJS_LIBS@
+builtin_libadd += plugins/libmozjsplugin.a @MOZJS_LIBS@ -lstdc++
+noinst_LIBRARIES += plugins/libmozjsplugin.a
+plugins_libmozjsplugin_a_SOURCES = plugins/mozjs.cc
+plugins_libmozjsplugin_a_CXXFLAGS = $(AM_CFLAGS) @MOZJS_CFLAGS@ @DBUS_CFLAGS@ 
@GLIB_CFLAGS@
 endif
 
 if V8
@@ -137,16 +138,16 @@ unit_test_pacrunner_LDADD += @CURL_LIBS@
 endif
 
 if MOZJS
-unit_test_pacrunner_SOURCES += plugins/mozjs.c
-
+unit_test_pacrunner_SOURCES += plugins/mozjs.cc
+unit_test_pacrunner_CXXFLAGS = $(AM_CFLAGS)  @MOZJS_CFLAGS@
 unit_test_pacrunner_LDADD += @MOZJS_LIBS@ @PTHREAD_LIBS@
 
 noinst_PROGRAMS += unit/test-mozjs
 
 unit_test_mozjs_SOURCES = unit/test-mozjs.c src/pacrunner.h \
                        src/proxy.c src/manual.c src/download.c \
-                               src/js.c plugins/mozjs.c $(js_sources)
-
+                               src/js.c plugins/mozjs.cc $(js_sources)
+unit_test_mozjs_CXXFLAGS = $(AM_CFLAGS)  @MOZJS_CFLAGS@
 unit_test_mozjs_LDADD = @MOZJS_LIBS@ @GLIB_LIBS@ @PTHREAD_LIBS@
 endif
 
diff --git a/configure.ac b/configure.ac
index 888c873..b2565c0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -76,8 +76,8 @@ AM_CONDITIONAL(DUKTAPE, test "${enable_duktape}" = "yes")
 AC_ARG_ENABLE(mozjs, AC_HELP_STRING([--enable-mozjs],
                [enable Mozilla Javascript plugin support]))
 if (test "${enable_mozjs}" = "yes"); then
-       PKG_CHECK_MODULES(MOZJS,  mozjs185, dummy=yes,
-                       AC_MSG_ERROR(Mozilla Javascript >= 1.8 is required))
+       PKG_CHECK_MODULES(MOZJS,  mozjs-38, dummy=yes,
+                       AC_MSG_ERROR(Mozilla Javascript >= 38 is required))
        AC_SUBST(MOZJS_CFLAGS)
        AC_SUBST(MOZJS_LIBS)
 fi
diff --git a/plugins/mozjs.c b/plugins/mozjs.cc
similarity index 59%
rename from plugins/mozjs.c
rename to plugins/mozjs.cc
index a923203..e10b297 100644
--- a/plugins/mozjs.c
+++ b/plugins/mozjs.cc
@@ -31,11 +31,15 @@
 #include <netdb.h>
 
 #pragma GCC diagnostic ignored "-Wredundant-decls"
+#pragma GCC diagnostic ignored "-Winvalid-offsetof"
 #include <jsapi.h>
 #pragma GCC diagnostic error "-Wredundant-decls"
+#pragma GCC diagnostic error "-Winvalid-offsetof"
 
+extern "C" {
 #include "pacrunner.h"
 #include "js.h"
+}
 
 static pthread_mutex_t mozjs_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -43,42 +47,42 @@ struct pacrunner_mozjs {
        struct pacrunner_proxy *proxy;
        JSContext *jsctx;
        JSObject *jsobj;
+       JSAutoCompartment *jsac;
 };
 
-static JSBool myipaddress(JSContext *jsctx, uintN argc, jsval *vp)
+static bool myipaddress(JSContext *jsctx, unsigned argc, jsval *vp)
 {
-       struct pacrunner_mozjs *ctx = JS_GetContextPrivate(jsctx);
+       struct pacrunner_mozjs *ctx = (pacrunner_mozjs 
*)JS_GetContextPrivate(jsctx);
        char address[NI_MAXHOST];
 
        DBG("");
 
-       JS_SET_RVAL(jsctx, vp, JSVAL_NULL);
+       JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
+
+       args.rval().setNull();
 
        if (!ctx)
-               return JS_TRUE;
+               return true;
 
        if (__pacrunner_js_getipaddr(ctx->proxy, address, sizeof(address)) < 0)
-               return JS_TRUE;
+               return true;
 
        DBG("address %s", address);
 
-       JS_SET_RVAL(jsctx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(jsctx,
-                                                              address)));
+       args.rval().setString(JS_NewStringCopyZ(jsctx,address));
 
-       return JS_TRUE;
+       return true;
 }
 
-static JSBool dnsresolve(JSContext *jsctx, uintN argc, jsval *vp)
+static bool dnsresolve(JSContext *jsctx, unsigned argc, jsval *vp)
 {
-       struct pacrunner_mozjs *ctx = JS_GetContextPrivate(jsctx);
+       struct pacrunner_mozjs *ctx = (pacrunner_mozjs 
*)JS_GetContextPrivate(jsctx);
        char address[NI_MAXHOST];
-       jsval *argv = JS_ARGV(jsctx, vp);
-       char *host = JS_EncodeString(jsctx, JS_ValueToString(jsctx, argv[0]));
+       JS::CallArgs args = JS::CallArgsFromVp(argc,vp);
+       char * host = JS_EncodeString(jsctx, args[0].toString());
 
        DBG("host %s", host);
 
-       JS_SET_RVAL(jsctx, vp, JSVAL_NULL);
-
        if (!ctx)
                goto out;
 
@@ -87,20 +91,16 @@ static JSBool dnsresolve(JSContext *jsctx, uintN argc, 
jsval *vp)
 
        DBG("address %s", address);
 
-       JS_SET_RVAL(jsctx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(jsctx, 
address)));
+       args.rval().setString(JS_NewStringCopyZ(jsctx,address));
 
  out:
        JS_free(jsctx, host);
-       return JS_TRUE;
+       return true;
 
 }
 
 static JSClass jscls = {
        "global", JSCLASS_GLOBAL_FLAGS,
-       JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
-       JS_StrictPropertyStub,
-       JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
-       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
 static JSRuntime *jsrun;
@@ -109,13 +109,12 @@ static int create_object(struct pacrunner_proxy *proxy)
 {
        struct pacrunner_mozjs *ctx;
        const char *script;
-       jsval rval;
 
        script = pacrunner_proxy_get_script(proxy);
        if (!script)
                return 0;
 
-       ctx = g_malloc0(sizeof(struct pacrunner_mozjs));
+       ctx = (pacrunner_mozjs *)g_malloc0(sizeof(struct pacrunner_mozjs));
 
        ctx->proxy = proxy;
        ctx->jsctx = JS_NewContext(jsrun, 8 * 1024);
@@ -126,41 +125,48 @@ static int create_object(struct pacrunner_proxy *proxy)
        JS_SetContextPrivate(ctx->jsctx, ctx);
        __pacrunner_proxy_set_jsctx(proxy, ctx);
 
-#if JS_VERSION >= 185
-       ctx->jsobj = JS_NewCompartmentAndGlobalObject(ctx->jsctx, &jscls,
-                                                     NULL);
-#else
-       ctx->jsobj = JS_NewObject(ctx->jsctx, &jscls, NULL, NULL);
-#endif
+       JS::CompartmentOptions compart_opts;
+       compart_opts.setVersion(JSVERSION_LATEST);
+       ctx->jsobj = JS_NewGlobalObject(ctx->jsctx, &jscls, nullptr,
+                                       JS::DontFireOnNewGlobalHook, 
compart_opts);
+       JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj);
+
+       ctx->jsac = new JSAutoCompartment(ctx->jsctx, jsobj);
 
-       if (!JS_InitStandardClasses(ctx->jsctx, ctx->jsobj))
+       if (!JS_InitStandardClasses(ctx->jsctx, jsobj))
                pacrunner_error("Failed to init JS standard classes");
 
-       JS_DefineFunction(ctx->jsctx, ctx->jsobj, "myIpAddress",
-                         myipaddress, 0, 0);
-       JS_DefineFunction(ctx->jsctx, ctx->jsobj,
-                         "dnsResolve", dnsresolve, 1, 0);
+       JS_DefineFunction(ctx->jsctx, jsobj, "myIpAddress", myipaddress, 0, 0);
+       JS_DefineFunction(ctx->jsctx, jsobj, "dnsResolve", dnsresolve, 1, 0);
+
+       JS::RootedValue rval(ctx->jsctx);
+       JS::CompileOptions opts(ctx->jsctx);
+       opts.setIntroductionType("pacrunner")
+           .setUTF8(true)
+           .setCompileAndGo(true);
 
-       JS_EvaluateScript(ctx->jsctx, ctx->jsobj, __pacrunner_js_routines,
-                         strlen(__pacrunner_js_routines), NULL, 0, &rval);
+       JS::Evaluate(ctx->jsctx, JS::HandleObject(jsobj), opts,
+                    __pacrunner_js_routines, strlen(__pacrunner_js_routines)
+                    , &rval);
 
-       JS_EvaluateScript(ctx->jsctx, ctx->jsobj, script, strlen(script),
-                         "wpad.dat", 0, &rval);
+       JS::Evaluate(ctx->jsctx, jsobj, opts, script, strlen(script), &rval);
 
        return 0;
 }
 
 static int mozjs_clear_proxy(struct pacrunner_proxy *proxy)
 {
-       struct pacrunner_mozjs *ctx = __pacrunner_proxy_get_jsctx(proxy);
+       struct pacrunner_mozjs *ctx = (pacrunner_mozjs 
*)__pacrunner_proxy_get_jsctx(proxy);
 
        DBG("proxy %p ctx %p", proxy, ctx);
 
        if (!ctx)
                return -EINVAL;
 
+       delete ctx->jsac;
        JS_DestroyContext(ctx->jsctx);
        __pacrunner_proxy_set_jsctx(proxy, NULL);
+       g_free(ctx);
 
        return 0;
 }
@@ -168,7 +174,6 @@ static int mozjs_clear_proxy(struct pacrunner_proxy *proxy)
 static int mozjs_set_proxy(struct pacrunner_proxy *proxy)
 {
        DBG("proxy %p", proxy);
-
        if (!proxy)
                return 0;
 
@@ -180,11 +185,9 @@ static int mozjs_set_proxy(struct pacrunner_proxy *proxy)
 static char * mozjs_execute(struct pacrunner_proxy *proxy, const char *url,
                            const char *host)
 {
-       struct pacrunner_mozjs *ctx = __pacrunner_proxy_get_jsctx(proxy);
-       JSBool result;
-       jsval rval, args[2];
+       struct pacrunner_mozjs *ctx = (pacrunner_mozjs 
*)__pacrunner_proxy_get_jsctx(proxy);
+       bool result;
        char *answer, *g_answer;
-
        DBG("proxy %p ctx %p url %s host %s", proxy, ctx, url, host);
 
        if (!ctx)
@@ -193,12 +196,16 @@ static char * mozjs_execute(struct pacrunner_proxy 
*proxy, const char *url,
        pthread_mutex_lock(&mozjs_mutex);
 
        JS_BeginRequest(ctx->jsctx);
+       JS::RootedValue rval(ctx->jsctx);
+       JS::AutoValueArray<2> args(ctx->jsctx);
+
+       args[0].setString(JS_NewStringCopyZ(ctx->jsctx, url));
+       args[1].setString(JS_NewStringCopyZ(ctx->jsctx, host));
 
-       args[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx->jsctx, url));
-       args[1] = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx->jsctx, host));
 
-       result = JS_CallFunctionName(ctx->jsctx, ctx->jsobj,
-                                    "FindProxyForURL", 2, args, &rval);
+       JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj);
+
+       result = JS_CallFunctionName(ctx->jsctx, jsobj, "FindProxyForURL", args 
, &rval);
 
        JS_EndRequest(ctx->jsctx);
 
@@ -207,8 +214,7 @@ static char * mozjs_execute(struct pacrunner_proxy *proxy, 
const char *url,
        pthread_mutex_unlock(&mozjs_mutex);
 
        if (result) {
-               answer = JS_EncodeString(ctx->jsctx,
-                                        JS_ValueToString(ctx->jsctx, rval));
+               answer = JS_EncodeString(ctx->jsctx, rval.toString());
                g_answer = g_strdup(answer);
                JS_free(ctx->jsctx, answer);
                return g_answer;
@@ -228,8 +234,8 @@ static struct pacrunner_js_driver mozjs_driver = {
 static int mozjs_init(void)
 {
        DBG("");
-
-       jsrun = JS_NewRuntime(8 * 1024 * 1024);
+       JS_Init();
+       jsrun = JS_NewRuntime(JS::DefaultHeapMaxBytes, 8 * 1024 * 1024 );
 
        return pacrunner_js_driver_register(&mozjs_driver);
 }
@@ -241,6 +247,7 @@ static void mozjs_exit(void)
        pacrunner_js_driver_unregister(&mozjs_driver);
 
        JS_DestroyRuntime(jsrun);
+       JS_ShutDown();
 }
 
 PACRUNNER_PLUGIN_DEFINE(mozjs, mozjs_init, mozjs_exit)
-- 
2.11.0



------------------------------

Subject: Digest Footer

_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman


------------------------------

End of connman Digest, Vol 18, Issue 15
***************************************

Reply via email to