This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix use of == to compare strings in perlref.pod
[perl5.git] / doop.c
diff --git a/doop.c b/doop.c
index c6ee847..5dbd8a2 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -1220,11 +1220,12 @@ Perl_do_kv(pTHX)
     dSP;
     HV * const keys = MUTABLE_HV(POPs);
     HE *entry;
+    SSize_t extend_size;
     const I32 gimme = GIMME_V;
     const I32 dokv =     (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV);
     /* op_type is OP_RKEYS/OP_RVALUES if pp_rkeys delegated to here */
-    const I32 dokeys =   dokv || (PL_op->op_type == OP_KEYS || PL_op->op_type == OP_RKEYS);
-    const I32 dovalues = dokv || (PL_op->op_type == OP_VALUES || PL_op->op_type == OP_RVALUES);
+    const I32 dokeys =   dokv || (PL_op->op_type == OP_KEYS);
+    const I32 dovalues = dokv || (PL_op->op_type == OP_VALUES);
 
     (void)hv_iterinit(keys);   /* always reset iterator regardless */
 
@@ -1255,7 +1256,10 @@ Perl_do_kv(pTHX)
        RETURN;
     }
 
-    EXTEND(SP, HvUSEDKEYS(keys) * (dokeys + dovalues));
+    /* 2*HvUSEDKEYS() should never be big enough to truncate or wrap */
+    assert(HvUSEDKEYS(keys) <= (SSize_t_MAX >> 1));
+    extend_size = (SSize_t)HvUSEDKEYS(keys) * (dokeys + dovalues);
+    EXTEND(SP, extend_size);
 
     while ((entry = hv_iternext(keys))) {
        if (dokeys) {
@@ -1263,8 +1267,7 @@ Perl_do_kv(pTHX)
            XPUSHs(sv);
        }
        if (dovalues) {
-           SV *tmpstr;
-           tmpstr = hv_iterval(keys,entry);
+           SV *tmpstr = hv_iterval(keys,entry);
            DEBUG_H(Perl_sv_setpvf(aTHX_ tmpstr, "%lu%%%d=%lu",
                            (unsigned long)HeHASH(entry),
                            (int)HvMAX(keys)+1,