[callweaver] Build fix for js 1.8.5
Dan Horák
sharkcz at fedoraproject.org
Tue May 31 08:34:23 UTC 2011
commit e09d08f42e68f60a1660da8af111958935645266
Author: Martin Stransky <stransky at redhat.com>
Date: Tue Apr 19 15:25:21 2011 +0200
Build fix for js 1.8.5
callweaver-1.2.1-js.patch | 842 +++++++++++++++++++++++++++++++++++++++++++++
callweaver.spec | 7 +-
2 files changed, 848 insertions(+), 1 deletions(-)
---
diff --git a/callweaver-1.2.1-js.patch b/callweaver-1.2.1-js.patch
new file mode 100644
index 0000000..24cbf9a
--- /dev/null
+++ b/callweaver-1.2.1-js.patch
@@ -0,0 +1,842 @@
+diff -up callweaver-1.2.1/res/res_js.c.js callweaver-1.2.1/res/res_js.c
+--- callweaver-1.2.1/res/res_js.c.js 2008-11-18 14:45:50.000000000 +0100
++++ callweaver-1.2.1/res/res_js.c 2011-04-19 15:11:59.369659639 +0200
+@@ -11,31 +11,16 @@
+ * the GNU General Public License
+ */
+
++#include <jsapi.h>
++#include <jsval.h>
+
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <string.h>
+-#include <jsstddef.h>
+ #include <errno.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#include <jstypes.h>
+-#include <jsarena.h>
+-#include <jsutil.h>
+-#include <jsprf.h>
+-#include <jsapi.h>
+-#include <jsatom.h>
+-#include <jscntxt.h>
+-#include <jsdbgapi.h>
+-#include <jsemit.h>
+-#include <jsfun.h>
+-#include <jsgc.h>
+-#include <jslock.h>
+-#include <jsobj.h>
+-#include <jsparse.h>
+-#include <jsscope.h>
+-#include <jsscript.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+@@ -84,7 +69,7 @@ FILE *gOutFile = NULL;
+
+ static
+ JSClass global_class = {
+- "Global", JSCLASS_HAS_PRIVATE,
++ "Global", JSCLASS_HAS_PRIVATE|JSCLASS_GLOBAL_FLAGS,
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
+ };
+@@ -195,7 +180,7 @@ static int process_config(void) {
+
+
+ static int eval_some_js(char *code, JSContext *cx, JSObject *obj, jsval *rval) {
+- JSScript *script;
++ JSObject *script;
+ JS_ClearPendingException(cx);
+ char *cptr;
+ char path[512];
+@@ -215,7 +200,6 @@ static int eval_some_js(char *code, JSCo
+
+ if (script) {
+ res = JS_ExecuteScript(cx, obj, script, rval) == JS_TRUE ? 0 : -1;
+- JS_DestroyScript(cx, script);
+ }
+
+ return res;
+@@ -234,7 +218,7 @@ chan_up(JSContext *cx, JSObject *obj, ui
+
+ *rval = BOOLEAN_TO_JSVAL( cw_check_hangup(jc->chan) ? JS_FALSE : JS_TRUE );
+
+- return arg == JS_TRUE ? *rval : JS_TRUE;
++ return arg == JS_TRUE ? JSVAL_TO_BOOLEAN(*rval) : JS_TRUE;
+ }
+
+ static JSBool
+@@ -268,9 +252,11 @@ chan_setmoh(JSContext *cx, JSObject *obj
+ char *class = NULL;
+ struct jchan *jc = JS_GetPrivate(cx, obj);
+ if (argc > 0)
+- class = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
+- if(class && jc->chan)
++ class = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]));
++ if(class && jc->chan) {
+ strncpy(jc->chan->musicclass, class, sizeof(jc->chan->musicclass)-1);
++ JS_free(cx, class);
++ }
+ return JS_TRUE;
+ }
+
+@@ -280,10 +266,11 @@ chan_mohstart(JSContext *cx, JSObject *o
+ char *class = NULL;
+ struct jchan *jc = JS_GetPrivate(cx, obj);
+ if (argc > 0)
+- class = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
+- if(jc->chan)
++ class = JS_EncodeString(cx,JS_ValueToString(cx, argv[0]));
++ if(class && jc->chan) {
+ cw_moh_start(jc->chan, class);
+-
++ JS_free(cx, class);
++ }
+ return JS_TRUE;
+ }
+
+@@ -322,7 +309,7 @@ chan_getdigits(JSContext *cx, JSObject *
+ char *path = NULL, *prefix = NULL;
+
+ if (argc > 0)
+- filename = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
++ filename = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]));
+
+ if (argc > 1)
+ maxdigits = JSVAL_TO_INT(argv[1]);
+@@ -330,8 +317,11 @@ chan_getdigits(JSContext *cx, JSObject *
+ timeout = JSVAL_TO_INT(argv[2]);
+
+
+- if (strstr(filename, ".."))
++ if (strstr(filename, "..")) {
++ if(filename)
++ JS_free(cx, filename);
+ return JS_FALSE;
++ }
+
+ if ((prefix = pbx_builtin_getvar_helper(jc->chan, "private_sound_dir"))) {
+ snprintf(path_info, sizeof(path_info), "%s/%s", prefix, filename);
+@@ -346,6 +336,10 @@ chan_getdigits(JSContext *cx, JSObject *
+ *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, buf) );
+ } else
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++
++ if(filename)
++ JS_free(cx, filename);
++
+ return JS_TRUE;
+ }
+
+@@ -359,9 +353,10 @@ chan_getvar(JSContext *cx, JSObject *obj
+ int x = 0, deny = 0;
+
+ if (argc > 0) {
+- if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_GetStringBytes(str))) {
++ if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_EncodeString(cx, str))) {
+ if (!strncmp(varname, "private_", 8)) {
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++ JS_free(cx, varname);
+ return JS_TRUE;
+ }
+
+@@ -376,14 +371,16 @@ chan_getvar(JSContext *cx, JSObject *obj
+ }
+
+ if (deny) {
++ JSBool ret = JS_TRUE;
+ if (option_verbose > 2)
+ cw_verbose(VERBOSE_PREFIX_3"Usage of Var [%s] Blocked by security measures.\n", varname);
+ if (jc_test_flag(jc, JC_BREACH_FATAL)) {
+ cw_log(LOG_WARNING, "Execution Halted by security measures.\n");
+ cw_softhangup(jc->chan, CW_SOFTHANGUP_EXPLICIT);
+- return JS_FALSE;
+- } else
+- return JS_TRUE;
++ ret = JS_FALSE;
++ }
++ JS_free(cx, varname);
++ return ret;
+ }
+
+ }
+@@ -392,6 +389,7 @@ chan_getvar(JSContext *cx, JSObject *obj
+ *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, varval));
+ } else
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++ JS_free(cx, varname);
+ }
+ return JS_TRUE;
+ }
+@@ -410,9 +408,10 @@ chan_setvar(JSContext *cx, JSObject *obj
+ int x = 0, deny = 0;
+
+ if (argc > 1) {
+- if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_GetStringBytes(str))) {
++ if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_EncodeString(cx, str))) {
+ if (!strncmp(varname, "private_", 8)) {
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++ JS_free(cx, varname);
+ return JS_TRUE;
+ }
+ if (jc_test_flag(jc, JC_SECURE_FLAG)) {
+@@ -426,22 +425,25 @@ chan_setvar(JSContext *cx, JSObject *obj
+ }
+
+ if (deny) {
++ JSBool ret = JS_TRUE;
+ if (option_verbose > 2)
+ cw_verbose(VERBOSE_PREFIX_3"Usage of Var [%s] Blocked by security measures.\n", varname);
+ if (jc_test_flag(jc, JC_BREACH_FATAL)) {
+ cw_log(LOG_WARNING, "Execution Halted by security measures.\n");
+ cw_softhangup(jc->chan, CW_SOFTHANGUP_EXPLICIT);
+- return JS_FALSE;
+- } else
+- return JS_TRUE;
++ ret = JS_FALSE;
++ }
++ JS_free(cx, varname);
++ return ret;
+ }
+
+ }
+- if ((varval = JS_GetStringBytes(JS_ValueToString(cx, argv[1])))) {
++ if ((varval = JS_EncodeString(cx, JS_ValueToString(cx, argv[1])))) {
+ pbx_builtin_setvar_helper(jc->chan, varname, varval);
+ *rval = BOOLEAN_TO_JSVAL( JS_TRUE );
+ } else
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++ JS_free(cx, varname);
+ }
+ return JS_TRUE;
+ }
+@@ -460,9 +462,9 @@ chan_exec(JSContext *cx, JSObject *obj,
+ int deny = 0;
+
+ if (argc > 0)
+- app = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
++ app = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]));
+ if (argc > 1)
+- data = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
++ data = JS_EncodeString(cx, JS_ValueToString(cx, argv[1]));
+
+ if (app) {
+ if (jc_test_flag(jc, JC_SECURE_FLAG)) {
+@@ -476,24 +478,32 @@ chan_exec(JSContext *cx, JSObject *obj,
+ }
+
+ if (deny) {
++ JSBool ret = JS_TRUE;
+ if (option_verbose > 2)
+ cw_verbose(VERBOSE_PREFIX_3"Execution of [%s] Blocked by security measures.\n", app);
+ if (jc_test_flag(jc, JC_BREACH_FATAL)) {
+ cw_log(LOG_WARNING, "Execution Halted by security measures.\n");
+ cw_softhangup(jc->chan, CW_SOFTHANGUP_EXPLICIT);
+- return JS_FALSE;
+- } else
+- return JS_TRUE;
++ ret = JS_FALSE;
++ }
++ JS_free(cx, app);
++ if(data)
++ JS_free(cx, data);
++ return ret;
+ }
+
+ }
+ if ((appS = pbx_findapp(app))) {
+- data = strdup(data ? data : "");
+- *rval = BOOLEAN_TO_JSVAL ( pbx_exec(jc->chan, appS, data) ? JS_FALSE : JS_TRUE );
+- if (data)
+- free(data);
++ char *data_tmp = strdup(data ? data : "");
++ *rval = BOOLEAN_TO_JSVAL ( pbx_exec(jc->chan, appS, data_tmp) ? JS_FALSE : JS_TRUE );
++ if (data_tmp)
++ free(data_tmp);
+ } else
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++
++ JS_free(cx, app);
++ if(data)
++ JS_free(cx, data);
+
+ return JS_TRUE;
+ }
+@@ -513,9 +523,9 @@ chan_execfunc(JSContext *cx, JSObject *o
+ int deny = 0;
+
+ if (argc > 0)
+- fdata = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
++ fdata = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]));
+ if (argc > 1)
+- data = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
++ data = JS_EncodeString(cx, JS_ValueToString(cx, argv[1]));
+
+ if (fdata) {
+ char *ptr;
+@@ -537,14 +547,18 @@ chan_execfunc(JSContext *cx, JSObject *o
+ }
+
+ if (deny) {
++ JSBool ret = JS_TRUE;
+ if (option_verbose > 2)
+ cw_verbose(VERBOSE_PREFIX_3"Execution of [%s] Blocked by security measures.\n", fdata);
+ if (jc_test_flag(jc, JC_BREACH_FATAL)) {
+ cw_log(LOG_WARNING, "Execution Halted by security measures.\n");
+ cw_softhangup(jc->chan, CW_SOFTHANGUP_EXPLICIT);
+- return JS_FALSE;
+- } else
+- return JS_TRUE;
++ ret = JS_FALSE;
++ }
++ JS_free(cx, fdata);
++ if(data)
++ JS_free(cx, data);
++ return ret;
+ }
+
+ }
+@@ -557,6 +571,10 @@ chan_execfunc(JSContext *cx, JSObject *o
+ cw_func_read(jc->chan, fdata, dbuf, sizeof(dbuf));
+ *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, dbuf) );
+ }
++
++ JS_free(cx, fdata);
++ if(data)
++ JS_free(cx, data);
+
+ return JS_TRUE;
+ }
+@@ -588,36 +606,61 @@ chan_recordfile(JSContext *cx, JSObject
+ struct jchan *jc = JS_GetPrivate(cx, obj);
+ char *filename = NULL;
+ char path_info[256] = "";
+- char *prefix = NULL;
+- char *silence = "", *maxduration = "", *options = "";
++ char *prefix = NULL;
++ char *silence = NULL, *maxduration = NULL, *options = NULL;
+ struct cw_app *appS;
+
+ if (argc > 0)
+- filename = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
++ filename = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]));
++
++ if (strstr(filename, "..")) {
++ JS_free(cx, filename);
++ return JS_FALSE;
++ }
++
+ if (argc > 1)
+- silence = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
++ silence = JS_EncodeString(cx, JS_ValueToString(cx, argv[1]));
+ if (argc > 2)
+- maxduration = JS_GetStringBytes(JS_ValueToString(cx, argv[2]));
++ maxduration = JS_EncodeString(cx, JS_ValueToString(cx, argv[2]));
+ if (argc > 3)
+- options = JS_GetStringBytes(JS_ValueToString(cx, argv[3]));
++ options = JS_EncodeString(cx, JS_ValueToString(cx, argv[3]));
+
+- if (strstr(filename, ".."))
+- return JS_FALSE;
+
+- if (filename && (prefix = pbx_builtin_getvar_helper(jc->chan, "private_sound_dir"))) {
+- snprintf(path_info, sizeof(path_info), "%s/%s,%s,%s,%s", prefix, filename, silence, maxduration, options);
+- } else if (filename) {
+- snprintf(path_info, sizeof(path_info), "%s,%s,%s,%s", filename, silence, maxduration, options);
++ if (filename) {
++ if (prefix = pbx_builtin_getvar_helper(jc->chan, "private_sound_dir")) {
++ snprintf(path_info, sizeof(path_info), "%s/%s,%s,%s,%s",
++ prefix,
++ filename ? filename : "",
++ silence ? silence : "",
++ maxduration ? maxduration : "",
++ options ? options : "");
++ } else {
++ snprintf(path_info, sizeof(path_info), "%s,%s,%s,%s",
++ filename ? filename : "",
++ silence ? silence : "",
++ maxduration ? maxduration : "",
++ options ? options : "");
++ }
++
++ if ((appS = pbx_findapp("Record"))) {
++ *rval = BOOLEAN_TO_JSVAL ( pbx_exec(jc->chan, appS, path_info) ? JS_FALSE : JS_TRUE );
++ } else
++ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++
+ } else {
+ cw_log(LOG_ERROR, "Invalid Arguements.\n");
+ return JS_FALSE;
+ }
+-
+- if ((appS = pbx_findapp("Record"))) {
+- *rval = BOOLEAN_TO_JSVAL ( pbx_exec(jc->chan, appS, path_info) ? JS_FALSE : JS_TRUE );
+- } else
+- *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
+-
++
++ if(filename)
++ JS_free(cx, filename);
++ if(silence)
++ JS_free(cx, silence);
++ if(maxduration)
++ JS_free(cx, maxduration);
++ if(options)
++ JS_free(cx, options);
++
+ return JS_TRUE;
+
+ }
+@@ -634,9 +677,11 @@ chan_streamfile(JSContext *cx, JSObject
+ char ret[2];
+
+ if (argc > 0) {
+- if ((str = JS_ValueToString(cx, argv[0])) && (filename = JS_GetStringBytes(str))) {
+- if (strstr(filename, ".."))
++ if ((str = JS_ValueToString(cx, argv[0])) && (filename = JS_EncodeString(cx, str))) {
++ if (strstr(filename, "..")) {
++ JS_free(cx, filename);
+ return JS_FALSE;
++ }
+ if ((prefix = pbx_builtin_getvar_helper(jc->chan, "private_sound_dir"))) {
+ snprintf(path_info, sizeof(path_info), "%s/%s", prefix, filename);
+ path = path_info;
+@@ -644,9 +689,12 @@ chan_streamfile(JSContext *cx, JSObject
+ path = filename;
+
+ res = cw_streamfile(jc->chan, path, jc->chan->language);
++ JS_free(cx, filename);
++
+ if (!res) {
+- if ((res = cw_waitstream(jc->chan, CW_DIGIT_ANY)) < 0)
++ if ((res = cw_waitstream(jc->chan, CW_DIGIT_ANY)) < 0) {
+ return JS_FALSE;
++ }
+ if (res > 0) {
+ ret[0] = (char) res;
+ ret[1] = '\0';
+@@ -655,10 +703,10 @@ chan_streamfile(JSContext *cx, JSObject
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
+ } else
+ return JS_FALSE;
+-
++
+ return JS_TRUE;
+- }
+ }
++ }
+ return JS_FALSE;
+
+ }
+@@ -668,22 +716,27 @@ static JSBool
+ chan_dbdel(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+ {
+
+- char *family, *key;
++ char *family = NULL, *key = NULL;
+ JSString *str = NULL;
+ int res;
+
+- *rval = BOOLEAN_TO_JSVAL (JSVAL_FALSE);
++ *rval = BOOLEAN_TO_JSVAL (JS_FALSE);
+
+- if ( !(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_GetStringBytes(str)))) {
++ if ( !(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_EncodeString(cx, str)))) {
+ return JS_FALSE;
+ }
+- if ( !(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_GetStringBytes(str)))) {
++ if ( !(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_EncodeString(cx, str)))) {
++ JS_free(cx, family);
+ return JS_FALSE;
+ }
+
+ res = cw_db_del(family, key);
++
++ JS_free(cx, family);
++ JS_free(cx, key);
++
+ if (!res) {
+- *rval = BOOLEAN_TO_JSVAL ( JSVAL_TRUE);
++ *rval = BOOLEAN_TO_JSVAL ( JS_TRUE);
+ return JS_TRUE;
+ }
+
+@@ -696,22 +749,29 @@ chan_dbput(JSContext *cx, JSObject *obj,
+ JSString *str = NULL;
+ int res;
+
+- *rval = BOOLEAN_TO_JSVAL (JSVAL_NULL);
++ *rval = BOOLEAN_TO_JSVAL (JS_FALSE);
+
+- if ( !(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_GetStringBytes(str)))) {
++ if ( !(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_EncodeString(cx, str)))) {
+ return JS_FALSE;
+ }
+- if ( !(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_GetStringBytes(str)))) {
++ if ( !(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_EncodeString(cx, str)))) {
++ JS_free(cx, family);
+ return JS_FALSE;
+ }
+- if ( !(( str = JS_ValueToString(cx, argv[2])) && ( name = JS_GetStringBytes(str)))) {
++ if ( !(( str = JS_ValueToString(cx, argv[2])) && ( name = JS_EncodeString(cx, str)))) {
++ JS_free(cx, family);
++ JS_free(cx, key);
+ return JS_FALSE;
+ }
+
+ res = cw_db_put(family, key, name);
++
++ JS_free(cx, family);
++ JS_free(cx, key);
++ JS_free(cx, name);
+
+ if (!res) {
+- *rval = BOOLEAN_TO_JSVAL ( JSVAL_TRUE);
++ *rval = BOOLEAN_TO_JSVAL ( JS_TRUE);
+ return JS_TRUE;
+ }
+
+@@ -724,32 +784,38 @@ chan_dbget(JSContext *cx, JSObject *obj,
+
+ int res = 0;
+ char tmp[256];
+- tmp[0] = '\0';
++ tmp[0] = '\0';
+
+ JSString *str = NULL;
+
+ char *family, *key;
+
+- *rval = BOOLEAN_TO_JSVAL(JSVAL_NULL);
++ *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
+
+- if (!(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_GetStringBytes(str) ))) {
++ if (!(( str = JS_ValueToString(cx, argv[0])) && ( family = JS_EncodeString(cx, str) ))) {
+ return JS_FALSE;
+ }
+- if (!(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_GetStringBytes(str) ))) {
++ if (!(( str = JS_ValueToString(cx, argv[1])) && ( key = JS_EncodeString(cx, str) ))) {
++ JS_free(cx, family);
+ return JS_FALSE;
+ }
+
+ res = cw_db_get(family, key, tmp, sizeof(tmp));
+- if (( res = cw_db_get(family, key, tmp, sizeof(tmp)) )) {
+- // Error
+- return JS_TRUE; // Return information in *rval to JSVAL_NULL
+- } else {
+- *rval = BOOLEAN_TO_JSVAL(JSVAL_NULL);
+- if ( cw_strlen_zero(tmp) )
+- *rval = BOOLEAN_TO_JSVAL(JSVAL_NULL); // NULL
+- else
+- *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, tmp)); // Not null
+- }
++ res = cw_db_get(family, key, tmp, sizeof(tmp));
++
++ JS_free(cx, family);
++ JS_free(cx, key);
++
++ if (res) {
++ // Error
++ return JS_TRUE; // Return information in *rval to JSVAL_NULL
++ } else {
++ *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
++ if ( cw_strlen_zero(tmp) )
++ *rval = BOOLEAN_TO_JSVAL(JS_FALSE); // NULL
++ else
++ *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, tmp)); // Not null
++ }
+
+ return JS_TRUE;
+ }
+@@ -795,12 +861,16 @@ chan_getProperty(JSContext *cx, JSObject
+ int param = 0;
+ JSBool res = JS_TRUE;
+
+- char *name = JS_GetStringBytes(JS_ValueToString(cx, id));
++ char *name = JS_EncodeString(cx, JS_ValueToString(cx, id));
+ /* numbers are our props anything else is a method */
+- if (name[0] >= 48 && name[0] <= 57)
++ if (name[0] >= 48 && name[0] <= 57) {
+ param = atoi(name);
+- else
++ JS_free(cx, name);
++ }
++ else {
++ JS_free(cx, name);
+ return JS_TRUE;
++ }
+
+ switch(param) {
+ case CHAN_NAME:
+@@ -930,9 +1000,9 @@ js_fetchurl(JSContext *cx, JSObject *obj
+ CURL *curl_handle = NULL;
+ struct config_data config_data;
+
+- if ( argc > 0 && (url = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) {
++ if ( argc > 0 && (url = JS_EncodeString(cx, JS_ValueToString(cx, argv[0])))) {
+ if (argc > 1)
+- name = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
++ name = JS_EncodeString(cx, JS_ValueToString(cx, argv[1]));
+ curl_global_init(CURL_GLOBAL_ALL);
+ curl_handle = curl_easy_init();
+ if (!strncasecmp(url, "https", 5)) {
+@@ -949,6 +1019,7 @@ js_fetchurl(JSContext *cx, JSObject *obj
+ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "callweaver-js/1.0");
+ curl_easy_perform(curl_handle);
+ curl_easy_cleanup(curl_handle);
++ JS_free(cx, url);
+ } else {
+ cw_log(LOG_ERROR, "Error!\n");
+ return JS_FALSE;
+@@ -976,19 +1047,22 @@ js_unlinksound(JSContext *cx, JSObject *
+ {
+ struct cw_channel *chan = JS_GetPrivate(cx, obj);
+ char *path = NULL, *prefix = NULL, *filename = NULL;
+- char path_info[256];
++ char path_info[256];
+
+- if ( chan && argc > 0 && (filename = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) {
++ if ( chan && argc > 0 && (filename = JS_EncodeString(cx, JS_ValueToString(cx, argv[0])))) {
+ if ((prefix = pbx_builtin_getvar_helper(chan, "private_sound_dir"))) {
+- if (strstr(filename, ".."))
++ if (strstr(filename, "..")) {
++ JS_free(cx, filename);
+ return JS_FALSE;
++ }
+ snprintf(path_info, sizeof(path_info), "%s/%s", prefix, filename);
+ path = path_info;
+- } else
+- return JS_FALSE;
+-
++ }
++
+ if (path)
+ unlink(path);
++
++ JS_free(cx, filename);
+ }
+
+ return JS_FALSE;
+@@ -1012,16 +1086,17 @@ js_email(JSContext *cx, JSObject *obj, u
+ char path_info[256];
+ char *path = NULL, *prefix = NULL;
+ struct cw_channel *chan = JS_GetPrivate(cx, obj);
++ JSBool ret = JS_FALSE;
+
+ if ( chan &&
+ argc > 3 &&
+- (from = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))) &&
+- (to = JS_GetStringBytes(JS_ValueToString(cx, argv[1]))) &&
+- (headers = JS_GetStringBytes(JS_ValueToString(cx, argv[2]))) &&
+- (body = JS_GetStringBytes(JS_ValueToString(cx, argv[3])))
++ (from = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]))) &&
++ (to = JS_EncodeString(cx, JS_ValueToString(cx, argv[1]))) &&
++ (headers = JS_EncodeString(cx, JS_ValueToString(cx, argv[2]))) &&
++ (body = JS_EncodeString(cx, JS_ValueToString(cx, argv[3])))
+ ) {
+ if ( argc > 4)
+- file = JS_GetStringBytes(JS_ValueToString(cx, argv[4]));
++ file = JS_EncodeString(cx, JS_ValueToString(cx, argv[4]));
+
+
+ snprintf(filename, 80, "/tmp/mail.%ld.%ld", time(NULL), (long)pthread_self());
+@@ -1029,7 +1104,7 @@ js_email(JSContext *cx, JSObject *obj, u
+ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
+ if (file) {
+ if (strstr(file, ".."))
+- return JS_FALSE;
++ goto js_email_failed;
+ if ((prefix = pbx_builtin_getvar_helper(chan, "private_sound_dir"))) {
+ snprintf(path_info, sizeof(path_info), "%s/%s", prefix, file);
+ path = path_info;
+@@ -1037,34 +1112,34 @@ js_email(JSContext *cx, JSObject *obj, u
+ path = file;
+
+ if ((ifd = open(path, O_RDONLY)) < 1) {
+- return JS_FALSE;
++ goto js_email_failed;
+ }
+
+
+ snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
+ if (!write_buf(fd, buf))
+- return JS_FALSE;
++ goto js_email_failed;
+ }
+
+ if (!write_buf(fd, headers))
+- return JS_FALSE;
++ goto js_email_failed;
+
+ if (!write_buf(fd, "\n\n"))
+- return JS_FALSE;
++ goto js_email_failed;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
+ if (!write_buf(fd, buf))
+- return JS_FALSE;
++ goto js_email_failed;
+ }
+
+ if (!write_buf(fd, body))
+- return JS_FALSE;
++ goto js_email_failed;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\nContent-Transfer-Encoding: base64\nContent-Description: Sound attachment.\nContent-Disposition: attachment; filename=\"%s\"\n\n", bound, file);
+ if (!write_buf(fd, buf))
+- return JS_FALSE;
++ goto js_email_failed;
+
+ while((ilen=read(ifd, in, B64BUFFLEN))) {
+ for (x=0;x<ilen;x++) {
+@@ -1079,7 +1154,8 @@ js_email(JSContext *cx, JSObject *obj, u
+ }
+ }
+ if (write(fd, &out, bytes) != bytes) {
+- return -1;
++ ret = -1;
++ goto js_email_failed;
+ } else
+ bytes=0;
+
+@@ -1091,7 +1167,8 @@ js_email(JSContext *cx, JSObject *obj, u
+ out[bytes++] = '=', l += 2;
+
+ if (write(fd, &out, bytes) != bytes) {
+- return -1;
++ ret = -1;
++ goto js_email_failed;
+ }
+
+ }
+@@ -1101,7 +1178,7 @@ js_email(JSContext *cx, JSObject *obj, u
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
+ if (!write_buf(fd, buf))
+- return JS_FALSE;
++ goto js_email_failed;
+ }
+ }
+
+@@ -1120,20 +1197,35 @@ js_email(JSContext *cx, JSObject *obj, u
+ else
+ cw_verbose(VERBOSE_PREFIX_3"Emailed data to [%s]\n", to);
+ }
+- return JS_TRUE;
+- }
+-
++
++
++ ret = JS_TRUE;
++ }
++
++js_email_failed:
++
++ if (from)
++ JS_free(cx, from);
++ if (to)
++ JS_free(cx, to);
++ if (headers)
++ JS_free(cx, headers);
++ if (body)
++ JS_free(cx, body);
++ if (file)
++ JS_free(cx, file);
+
+- return JS_FALSE;
++ return ret;
+ }
+
+ static JSBool
+ js_die(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+ {
+ char *msg = NULL;
+- if ( argc > 0 && (msg = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) {
++ if ( argc > 0 && (msg = JS_EncodeString(cx, JS_ValueToString(cx, argv[0])))) {
+ if (option_verbose > 2)
+ cw_verbose(VERBOSE_PREFIX_3"Javascript Die: %s\n", msg);
++ JS_free(cx, msg);
+ }
+ return JS_FALSE;
+ }
+@@ -1145,11 +1237,12 @@ js_getvar(JSContext *cx, JSObject *obj,
+ char *varname = NULL;
+ char *varval = NULL;
+ if (argc > 0) {
+- if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_GetStringBytes(str))) {
++ if ((str = JS_ValueToString(cx, argv[0])) && (varname = JS_EncodeString(cx, str))) {
+ if ((varval = pbx_builtin_getvar_helper(NULL, varname))) {
+ *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, varval));
+ } else
+ *rval = BOOLEAN_TO_JSVAL( JS_FALSE );
++ JS_free(cx, varname);
+ }
+ return JS_TRUE;
+ }
+@@ -1164,6 +1257,7 @@ js_verbose(JSContext *cx, JSObject *obj,
+ int32 level = 0;
+ JSString *str;
+ char *prefix = "";
++ char *tmp;
+
+ if ((ok = JS_ValueToInt32(cx, argv[0], &level))) {
+ if ((str = JS_ValueToString(cx, argv[1]))) {
+@@ -1186,7 +1280,8 @@ js_verbose(JSContext *cx, JSObject *obj,
+ break;
+ };
+
+- cw_verbose("%s%s", prefix, JS_GetStringBytes(str));
++ cw_verbose("%s%s", prefix, tmp = JS_EncodeString(cx, str));
++ JS_free(cx, tmp);
+ }
+ } else
+ return JS_FALSE;
+@@ -1202,8 +1297,9 @@ static JSBool
+ js_include(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+ {
+ char *code;
+- if ( argc > 0 && (code = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) {
++ if ( argc > 0 && (code = JS_EncodeString(cx, JS_ValueToString(cx, argv[0])))) {
+ eval_some_js(code, cx, obj, rval);
++ JS_free(cx, code);
+ return JS_TRUE;
+ }
+ cw_log(LOG_ERROR, "Invalid Arguements\n");
+@@ -1216,8 +1312,8 @@ js_log(JSContext *cx, JSObject *obj, uin
+ char *log;
+ char *msg;
+ if (argc > 1) {
+- if ((log = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))) &&
+- (msg = JS_GetStringBytes(JS_ValueToString(cx, argv[1])))) {
++ if ((log = JS_EncodeString(cx, JS_ValueToString(cx, argv[0]))) &&
++ (msg = JS_EncodeString(cx, JS_ValueToString(cx, argv[1])))) {
+
+ if (!strcasecmp(log, "LOG_EVENT"))
+ cw_log(LOG_EVENT, msg);
+@@ -1231,6 +1327,10 @@ js_log(JSContext *cx, JSObject *obj, uin
+ cw_log(LOG_VERBOSE, msg);
+ else
+ cw_log(LOG_EVENT, msg);
++
++ JS_free(cx, log);
++ JS_free(cx, msg);
++
+ return JS_TRUE;
+ }
+ }
+@@ -1320,7 +1420,7 @@ static int js_exec(struct cw_channel *ch
+
+ if ((cx = JS_NewContext(rt, gStackChunkSize))) {
+ JS_SetErrorReporter(cx, js_error);
+- if ((glob = JS_NewObject(cx, &global_class, NULL, NULL)) &&
++ if ((glob = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL)) &&
+ JS_DefineFunctions(cx, glob, (flags & JC_SECURE_FLAG) ? secure_callweaver_functions : callweaver_functions) &&
+ JS_InitStandardClasses(cx, glob) &&
+ (Chan = new_jchan(cx, glob, chan, &jc, flags))) {
diff --git a/callweaver.spec b/callweaver.spec
index 960899a..dc27c48 100644
--- a/callweaver.spec
+++ b/callweaver.spec
@@ -4,7 +4,7 @@
Name: callweaver
Version: 1.2.1
-Release: 8%{?dist}
+Release: 9%{?dist}
Summary: The Truly Open Source PBX
Group: Applications/Internet
@@ -12,6 +12,7 @@ License: GPLv2
URL: http://www.callweaver.org/
Source0: http://devs.callweaver.org/release/callweaver-%{version}.tar.bz2
+Patch0: callweaver-1.2.1-js.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -169,6 +170,7 @@ convenient interface between CallWeaver and external scripts or programs.
%prep
%setup0 -q
+%patch0 -p1 -b .js
%build
@@ -380,6 +382,9 @@ test "$1" != 0 || /sbin/chkconfig --del callweaver
%{_sbindir}/eogi*
%changelog
+* Tue Apr 19 2011 Martin Stransky <stransky at redhat.com> - 1.2.1-9
+- Build fix for js 1.8.5
+
* Wed Mar 23 2011 Dan Horák <dan at danny.cz> - 1.2.1-8
- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient)
More information about the scm-commits
mailing list