cvs: embed /php-irssi ext-irssi.c

[email protected] ("Wez Furlong") Sun, 02 Feb 2003 15:08:53 -0000
Newsgroups php.embed.cvs
Message-ID <cvswez1044198533@cvsserver>
wez		Sun Feb  2 10:08:53 2003 EDT

  Modified files:              
    /embed/php-irssi	ext-irssi.c 
  Log:
  Fix pointer mess that screwed up args for user-space signal handlers...
  
  
Index: embed/php-irssi/ext-irssi.c
diff -u embed/php-irssi/ext-irssi.c:1.11 embed/php-irssi/ext-irssi.c:1.12
--- embed/php-irssi/ext-irssi.c:1.11	Sun Feb  2 09:22:36 2003
+++ embed/php-irssi/ext-irssi.c	Sun Feb  2 10:08:53 2003
@@ -14,7 +14,7 @@
   +----------------------------------------------------------------------+
   | Author: Wez Furlong <[email protected]>                                    |
   +----------------------------------------------------------------------+
-  $Id: ext-irssi.c,v 1.11 2003/02/02 14:22:36 wez Exp $
+  $Id: ext-irssi.c,v 1.12 2003/02/02 15:08:53 wez Exp $
 */
 #include "php-irssi.h"
 #include "php-signals-list.h" /* generated by php during make */
@@ -149,7 +149,7 @@
 	int sigid = signal_get_emitted_id();
 	struct sig_record *rec = (struct sig_record*)signal_get_user_data();
 	struct php_irssi_signal_args *sigargs;
-	zval **zargs[6];
+	zval ***zargs;
 	zval *val, *retval = NULL, *func_name = NULL;
 	int i, call_result;
 
@@ -164,13 +164,17 @@
 
 	func_name = rec->handler;
 	
+	zargs = emalloc(sigargs->argc * sizeof(zval **));
+	
 	for (i = 0; i < sigargs->argc; i++) {
 		/* TODO: would be nice to replace this with php_irssi_C_to_PHP(),
 		 * but we need to make some assumptions and optimizations here
 		 * for the NICK records */
 
-		MAKE_STD_ZVAL(val);
-		
+		zargs[i] = emalloc(sizeof(zval *));
+		MAKE_STD_ZVAL(*zargs[i]);
+		val = *zargs[i];
+
 		switch(sigargs->argtypes[i]) {
 			case PIAT_STRING:
 				ZVAL_STRING(val, (char *)args[i], 1);
@@ -203,7 +207,6 @@
 			default:
 				ZVAL_NULL(val);
 		}
-		zargs[i] = &val;
 	}
 
 	call_result = call_user_function_ex(EG(function_table),
@@ -228,7 +231,9 @@
 	/* release those zvals */
 	for (i = 0; i < sigargs->argc; i++) {
 		zval_ptr_dtor(zargs[i]);
+		efree(zargs[i]);
 	}
+	efree(zargs);
 }
 
 /* ---------- Global functions */