Author: byterock
Date: Wed Jul 23 06:58:07 2008
New Revision: 11576

Modified:
   dbd-oracle/trunk/Changes
   dbd-oracle/trunk/dbdimp.c

Log:
  Fix for memory hemorrhage in bind_param_inout_array found by Ricky Egeland, 
Fix by John Scoles

Modified: dbd-oracle/trunk/Changes
==============================================================================
--- dbd-oracle/trunk/Changes    (original)
+++ dbd-oracle/trunk/Changes    Wed Jul 23 06:58:07 2008
@@ -1,4 +1,5 @@
 =head1 Changes in DBD-Oracle 1.22(svn rev xxxx)  2008 
+  Fix for memory hemorrhage in bind_param_inout_array found by Ricky Egeland, 
Fix by John Scoles
   Fix for a typo in oracle.xs from Milo van der Leij 
   Fix for bugs on SPs with Lobs reported by Martin Evans, Fix by J Scoles
   Changed the way Ping works rather than using prepare and execute it now 
makes a single round trip call to DB by John Scoles

Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c   (original)
+++ dbd-oracle/trunk/dbdimp.c   Wed Jul 23 06:58:07 2008
@@ -2194,11 +2194,8 @@
                PerlIO_printf(DBILOGFP, "dbd_rebind_ph_char() (1): bind %s <== 
%.1000s (", phs->name, val);
                if (!SvOK(phs->sv))
                    PerlIO_printf(DBILOGFP, "NULL, ");
-               PerlIO_printf(DBILOGFP, "size %ld/%ld/%ld, ",
-           (long)SvCUR(phs->sv),(long)SvLEN(phs->sv),phs->maxlen);
-               PerlIO_printf(DBILOGFP, "ptype %d(%s), otype %d%s)\n",
-           (int)SvTYPE(phs->sv), sql_typecode_name(phs->ftype),phs->ftype,
-           (phs->is_inout) ? ", inout" : "");
+               PerlIO_printf(DBILOGFP, "size %ld/%ld/%d, 
",(long)SvCUR(phs->sv),(long)SvLEN(phs->sv),phs->maxlen);
+               PerlIO_printf(DBILOGFP, "ptype %d(%s), otype %d 
%s)\n",(int)SvTYPE(phs->sv), 
sql_typecode_name(phs->ftype),phs->ftype,(phs->is_inout) ? ", inout" : "");
     }
 
     /* At the moment we always do sv_setsv() and rebind.       */
@@ -2249,8 +2246,15 @@
     }
 
     phs->sv_type = SvTYPE(phs->sv);    /* part of mutation check       */
-    phs->maxlen  = ((IV)SvLEN(phs->sv)); /* avail buffer space (64bit safe) 
Logicaly maxlen should never change but it does why I know not*/
+    if (SvTYPE(phs->sv) == SVt_RV && SvTYPE(SvRV(phs->sv)) == SVt_PVAV) { /* 
it is returning an array of scalars not a single scalar*/
+       phs->maxlen  = 4000; /* Just make is a varchar max should be ok for 
most things*/
 
+    } else {
+               phs->maxlen  = ((IV)SvLEN(phs->sv)); /* avail buffer space 
(64bit safe) Logicaly maxlen should never change but it does why I know not*/
+
+    }
+          
+    
     if (phs->maxlen < 0)               /* can happen with nulls        */
          phs->maxlen = 0;
 
@@ -2498,7 +2502,7 @@
     if (trace_level >= 5 || dbd_verbose >= 5 )
                PerlIO_printf(DBILOGFP, "dbd_rebind_ph() (1): rebinding %s as 
%s (%s, ftype %d (%s), csid %d, csform %d, inout %d)\n",
                phs->name, (SvPOK(phs->sv) ? neatsvpv(phs->sv,10) : 
"NULL"),(SvUTF8(phs->sv) ? "is-utf8" : "not-utf8"),
-               phs->ftype,sql_typecode_name(phs->ftype), phs->csform, 
phs->is_inout);
+               phs->ftype,sql_typecode_name(phs->ftype),phs->csid, 
phs->csform, phs->is_inout);
 
 
     switch (phs->ftype) {

Reply via email to