John E. Malmberg wrote:
John E. Malmberg wrote:
Nicholas Clark wrote:
On Mon, Apr 27, 2009 at 12:27:02AM -0500, John E. Malmberg wrote:
I just started looking into a failure of 19_CPANPLUS-Dist. I have not determined what exactly is wrong, and am out of time for the moment.

I will try to get some more information later.

It is failing from an access violation in SV.C.

ok 57 -    Perl version not high enough
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=000000000000002C, PC=00000000000F9AB8, PS=0000001B
%TRACE-F-TRACEBACK, symbolic stack dump follows
  image    module    routine             line      rel PC
abs PC
DBGPERLSHR SV Perl_sv_upgrade 73671 0000000000001F58

#define new_body_inline(xpv, sv_type) \
    STMT_START { \
    void ** const r3wt = &PL_body_roots[sv_type]; \
    xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
      ? *((void **)(r3wt)) : more_bodies(sv_type)); \
    *(r3wt) = *(void**)(xpv); \
    } STMT_END

I'm curious what the value of sv_type is. It's the second (real) parameter:

void
Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)

case SVt_PVMG:
     ...
    new_body_inline(new_body, new_type);

new_type = SVt_PVMG,
SVt_PVMG has a value of 7.

new_body = 44.

PL_Body_roots[sv_type] = 44.

From the code, it looks like this was expected to contain a valid pointer.

From looking at the source code, it appears that the linked list of bodies is corrupted. my_perl->Ibodyroots[7] has 44.

I have been looking at the S_more_bodies routine. Would it be practical to put an assert on for a pointer being added to the linked list with a value above 512? On VMS, the first page of memory is protected no access.

I put a modified test script at http://eisner.encompasserve.org/~malmberg/perl/19_CPANPLUS-DIST.TXT

I commented out as much as I could and still reproduce the access violation.

-John
wb8...@qsl.net
Personal Opinion Only

Reply via email to