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) {