return Event;
}
+#define MAX_STACK_DEPTH 12
static switch_status_t js_common_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
{
return SWITCH_STATUS_FALSE;
}
+ jss->stack_depth++;
+
switch (itype) {
case SWITCH_INPUT_TYPE_EVENT:
if ((event = (switch_event_t *) input)) {
}
}
if (!Event) {
+ jss->stack_depth--;
return SWITCH_STATUS_FALSE;
}
break;
argv[argc++] = cb_state->arg;
}
+ if (jss->stack_depth > MAX_STACK_DEPTH) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Maximum recursive callback limit %d reached.\n", MAX_STACK_DEPTH);
+ jss->stack_depth--;
+ return SWITCH_STATUS_FALSE;
+ }
+
JS_ResumeRequest(cb_state->cx, cb_state->saveDepth);
JS_CallFunction(cb_state->cx, cb_state->obj, cb_state->function, argc, argv, &cb_state->ret);
cb_state->saveDepth = JS_SuspendRequest(cb_state->cx);
+ jss->stack_depth--;
return SWITCH_STATUS_SUCCESS;
}
jss->flags = flags;
jss->cx = cx;
jss->obj = session_obj;
+ jss->stack_depth = 0;
if ((JS_SetPrivate(cx, session_obj, jss) &&
JS_DefineProperties(cx, session_obj, session_props) && JS_DefineFunctions(cx, session_obj, session_methods))) {
return session_obj;