Testing the ARRAY pointer is insufficent. Arrays emptied by 'shift' or
'pop' may still have non-NULL 'ARRAY' pointers. Check more carefully to
determine whether the array has anything worth duplicating. If not, reset
the FILL and MAX offsets to -1 just as 'undef @ARRAY' would.
This avoids potential corruption in the PL_ptr_table during perl_clone().
IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
break;
case SVt_PVAV:
- if (AvARRAY((const AV *)sstr)) {
+ /* avoid cloning an empty array */
+ if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
SV **dst_ary, **src_ary;
SSize_t items = AvFILLp((const AV *)sstr) + 1;
else {
AvARRAY(MUTABLE_AV(dstr)) = NULL;
AvALLOC((const AV *)dstr) = (SV**)NULL;
+ AvMAX( (const AV *)dstr) = -1;
+ AvFILLp((const AV *)dstr) = -1;
}
break;
case SVt_PVHV: