[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