You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apreq-dev@httpd.apache.org by Joe Schaefer <jo...@sunstarsys.com> on 2001/08/10 16:46:26 UTC

[patch] Re: Apache::Upload bug?

Joe Schaefer <jo...@sunstarsys.com> writes:

> In the meantine, try inserting the following line at the top of the 
> CLEANUP: section of ApacheUpload_fh in Request.xs:
> 
>       SvREFCNT_dec(SvRV(ST(0))); /* ~ line 523 in Request.xs */
> 

It looks to me like the stub code in perl's ExtUtils/typemap for T_IN 
is causing the inflated refcount.  Here's a patch that overrides T_IN;
it also cleans up the "Apache::Upload" symbol table a little earlier
than the original code does.  Will commit if there's no objections.

% cvs diff
cvs server: Diffing .
Index: typemap
===================================================================
RCS file: /home/cvs/httpd-apreq/typemap,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 typemap
--- typemap	1999/01/27 01:33:20	1.1.1.1
+++ typemap	2001/08/10 14:35:41
@@ -3,8 +3,20 @@
 Apache::Upload		T_PTROBJ
 Apache			T_APACHEOBJ
 const char *		T_PV
+ApreqInputStream        T_APREQIN
 
 OUTPUT
+
+T_APREQIN
+        {
+            GV *gv = newGVgen("$Package");
+            if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
+                sv_setsv($arg, sv_bless(newRV_noinc((SV*)gv), 
+                                        gv_stashpv("$Package",1)));
+            else
+                $arg = &PL_sv_undef;
+            (void)hv_delete(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), G_DISCARD);
+        }
 
 T_APACHEOBJ
 	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
cvs server: Diffing Cookie
cvs server: Diffing Request
Index: Request/Request.xs
===================================================================
RCS file: /home/cvs/httpd-apreq/Request/Request.xs,v
retrieving revision 1.25
diff -u -r1.25 Request.xs
--- Request/Request.xs	2001/06/29 19:13:17	1.25
+++ Request/Request.xs	2001/08/10 14:35:41
@@ -109,7 +109,7 @@
 #define ApacheUpload_tempname(upload) upload->tempname
 
 #ifdef PerlIO
-typedef PerlIO * InputStream;
+typedef PerlIO * ApreqInputStream;
 
 /* XXX: or should this be #ifdef PERL_IMPLICIT_SYS ? */
 #ifdef WIN32
@@ -125,7 +125,7 @@
 
 #else /*PerlIO not defined*/
 
-typedef FILE * InputStream;
+typedef FILE * ApreqInputStream;
 #define PerlIO_importFILE(fp,flags) 	fp
 #define PerlIO_write(a,b,c)  		fwrite((b),1,(c),(a))
 
@@ -256,14 +256,6 @@
     SvMAGIC(SvRV(sv))->mg_ptr = (char *)req->r;
 }
 
-static void apreq_close_handle(void *data)
-{
-    GV *handle = (GV*)data;
-    (void)hv_delete(GvSTASH(handle),
-		    GvNAME(handle), GvNAMELEN(handle), G_DISCARD);
-}
-
-
 #ifdef CGI_COMPAT
 static void register_uploads (ApacheRequest *req) {
     ApacheUpload *upload;
@@ -505,7 +497,7 @@
 
 PROTOTYPES: DISABLE 
 
-InputStream
+ApreqInputStream
 ApacheUpload_fh(upload)
     Apache::Upload upload
 
@@ -530,9 +522,7 @@
 	if (upload->req->parsed)
 	    PerlIO_seek(fp, 0, 0);
 
-	IoIFP(GvIOn((GV*)SvRV(ST(0)))) = fp;  	
-	ap_register_cleanup(upload->req->r->pool, (void*)SvRV(ST(0)), 
-			    apreq_close_handle, ap_null_cleanup);      
+	IoIFP(io) = fp;  	
     }
 
 long

-- 
Joe Schaefer