diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2008-11-12 10:22:49 +0100 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2008-11-12 10:22:49 +0100 |
commit | 164fda2a37fb5fb0c84896ee840e486ae8883bd5 (patch) | |
tree | 78d1d629bd2e3ffbf5c45c2ab18d35ab1e533f96 | |
parent | 50e3eb142dfd38c2fc1696549d75fee153bae709 (diff) | |
download | weechat-164fda2a37fb5fb0c84896ee840e486ae8883bd5.zip |
Fix crash in weechat_perl_exec() when a callback from another script is executed, fix compilation warnings for Perl on FreeBSD
-rw-r--r-- | src/plugins/scripts/perl/weechat-perl.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/src/plugins/scripts/perl/weechat-perl.c b/src/plugins/scripts/perl/weechat-perl.c index 6af4cfafc..684ed06fc 100644 --- a/src/plugins/scripts/perl/weechat-perl.c +++ b/src/plugins/scripts/perl/weechat-perl.c @@ -117,12 +117,14 @@ weechat_perl_exec (struct t_plugin_script *script, void *ret_value; int *ret_i, mem_err, length; SV *ret_s; - - perl_current_script = script; + struct t_plugin_script *old_perl_current_script; /* this code is placed here to conform ISO C90 */ dSP; + old_perl_current_script = perl_current_script; + perl_current_script = script; + #ifdef MULTIPLICITY (void) length; func = (char *) function; @@ -133,7 +135,7 @@ weechat_perl_exec (struct t_plugin_script *script, if (!func) return NULL; snprintf (func, length, "%s::%s", (char *) script->interpreter, function); -#endif +#endif ENTER; SAVETMPS; @@ -195,7 +197,15 @@ weechat_perl_exec (struct t_plugin_script *script, PUTBACK; FREETMPS; LEAVE; - + + if (old_perl_current_script) + { + perl_current_script = old_perl_current_script; +#ifdef MULTIPLICITY + PERL_SET_CONTEXT (perl_current_script->interpreter); +#endif + } + #ifndef MULTIPLICITY free (func); #endif @@ -220,7 +230,7 @@ int weechat_perl_load (const char *filename) { STRLEN len; - struct t_plugin_script tempscript; + struct t_plugin_script temp_script; int *eval; struct stat buf; char *perl_argv[2]; @@ -231,6 +241,16 @@ weechat_perl_load (const char *filename) char pkgname[64]; #endif + temp_script.filename = NULL; + temp_script.interpreter = NULL; + temp_script.name = NULL; + temp_script.author = NULL; + temp_script.version = NULL; + temp_script.license = NULL; + temp_script.description = NULL; + temp_script.shutdown_func = NULL; + temp_script.charset = NULL; + if (stat (filename, &buf) != 0) { weechat_printf (NULL, @@ -261,7 +281,7 @@ weechat_perl_load (const char *filename) PERL_SET_CONTEXT (perl_current_interpreter); perl_construct (perl_current_interpreter); - tempscript.interpreter = (PerlInterpreter *) perl_current_interpreter; + temp_script.interpreter = (PerlInterpreter *) perl_current_interpreter; perl_parse (perl_current_interpreter, weechat_perl_api_init, perl_args_count, perl_args, NULL); @@ -271,12 +291,12 @@ weechat_perl_load (const char *filename) #else snprintf (pkgname, sizeof(pkgname), "%s%d", PKG_NAME_PREFIX, perl_num); perl_num++; - tempscript.interpreter = "WeechatPerlScriptLoader"; + temp_script.interpreter = "WeechatPerlScriptLoader"; perl_argv[0] = (char *)filename; perl_argv[1] = pkgname; perl_argv[2] = NULL; #endif - eval = weechat_perl_exec (&tempscript, + eval = weechat_perl_exec (&temp_script, WEECHAT_SCRIPT_EXEC_INT, "weechat_perl_load_eval_file", perl_argv); @@ -332,7 +352,7 @@ weechat_perl_load (const char *filename) perl_destruct (perl_current_interpreter); perl_free (perl_current_interpreter); #endif - if (perl_current_script && (perl_current_script != &tempscript)) + if (perl_current_script && (perl_current_script != &temp_script)) { script_remove (weechat_perl_plugin, &perl_scripts, perl_current_script); @@ -608,16 +628,19 @@ weechat_perl_buffer_closed_cb (void *data, const char *signal, const char *type_ int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) { +#ifdef PERL_SYS_INIT3 + int a; + char **perl_args_local; + char *perl_env[] = {}; +#endif + /* make C compiler happy */ (void) argc; (void) argv; #ifdef PERL_SYS_INIT3 - int a = perl_args_count; - char **perl_args_local = perl_args; - char *perl_env[] = {}; - (void) a; - (void) perl_args_local; + a = perl_args_count; + perl_args_local = perl_args; (void) perl_env; PERL_SYS_INIT3 (&a, (char ***)&perl_args_local, (char ***)&perl_env); #endif |