On Mon, Feb 17, 2003 at 09:16:17PM +1100, Bradley Baetz wrote:
> On Mon, Feb 17, 2003 at 09:25:33AM +0000, Tim Bunce wrote:
> > Did you try moving these two lines:
> >  
> >         SV *ka_rv = *hv_fetch((HV*)DBIc_MY_H(imp_sth), 
>keyattrib,strlen(keyattrib), TRUE);
> >         ka_rv = newSVsv(ka_rv); /* copy to invoke FETCH magic */
> >  
> > to the top of the function, specifically before the perl_call_method("fetch",)
> > 
> > Tim.
> > 
> 
> Hmm. I thought I had, but it turned out that I didn't move the keyattrib
> test too, so stuff got tainted from there.
> 
> Patch attached, passes 5.6.1 and 5.8.0. 5.005_03 passes if I comment out
> the Time::HiRes use, and ignore some Test.pm undefined var warnings.

Great! Thanks.

Tim.

> Bradley

> --- DBI-1.32.orig/DBI.xs      Sun Dec  1 14:36:44 2002
> +++ DBI-1.32/DBI.xs   Mon Feb 17 01:49:35 2003
> @@ -3455,13 +3455,12 @@
>      char *   keyattrib
>      PREINIT:
>      SV *rowavr;
> +    SV *ka_rv;
>      D_imp_sth(sth);
>      CODE:
>      PUSHMARK(sp);
>      XPUSHs(sth);
>      PUTBACK;
> -    if (perl_call_method("fetch", G_SCALAR) != 1)
> -     croak("panic: DBI fetch");      /* should never happen */
>      if (!keyattrib || !*keyattrib) {
>       SV *kn = DBIc_FetchHashKeyName(imp_sth);
>       if (kn && SvOK(kn))
> @@ -3469,6 +3468,10 @@
>       else
>           keyattrib = "NAME";
>      }
> +    ka_rv = *hv_fetch((HV*)DBIc_MY_H(imp_sth), keyattrib,strlen(keyattrib), TRUE);
> +    ka_rv = newSVsv(ka_rv);  /* copy to invoke FETCH magic */
> +    if (perl_call_method("fetch", G_SCALAR) != 1)
> +     croak("panic: DBI fetch");      /* should never happen */
>      SPAGAIN;
>      rowavr = POPs;
>      PUTBACK;
> @@ -3479,8 +3482,6 @@
>       int num_fields = AvFILL(rowav)+1;
>       HV *hv;
>       AV *ka_av;
> -        SV *ka_rv = *hv_fetch((HV*)DBIc_MY_H(imp_sth), keyattrib,strlen(keyattrib), 
>TRUE);
> -        ka_rv = newSVsv(ka_rv);      /* copy to invoke FETCH magic */
>       if (!(SvROK(ka_rv) && SvTYPE(SvRV(ka_rv))==SVt_PVAV)) {
>           sv_setiv(DBIc_ERR(imp_sth), 1);
>           sv_setpvf(DBIc_ERRSTR(imp_sth),

Reply via email to