@@ -2960,6 +2960,19 @@ static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
2960
2960
keyval = SvPV (key , keylen_tmp );
2961
2961
keylen = keylen_tmp ;
2962
2962
if (SvUTF8 (key )) {
2963
+
2964
+ #ifdef utf8_to_bytes_overwrite
2965
+
2966
+ /* If we are able to downgrade here; that means that we have a
2967
+ * key which only had chars 0-255, but was utf8 encoded. */
2968
+ if (utf8_to_bytes_overwrite ( (U8 * * ) & keyval , & keylen_tmp )) {
2969
+ keylen = keylen_tmp ;
2970
+ flags |= SHV_K_WASUTF8 ;
2971
+ }
2972
+ else {
2973
+ flags |= SHV_K_UTF8 ;
2974
+ }
2975
+ #else
2963
2976
const char * keysave = keyval ;
2964
2977
bool is_utf8 = TRUE;
2965
2978
@@ -2982,6 +2995,7 @@ static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
2982
2995
to assign back to keylen. */
2983
2996
flags |= SHV_K_UTF8 ;
2984
2997
}
2998
+ #endif
2985
2999
}
2986
3000
2987
3001
if (flagged_hash ) {
@@ -3000,8 +3014,12 @@ static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
3000
3014
WLEN (keylen );
3001
3015
if (keylen )
3002
3016
WRITE (keyval , keylen );
3017
+
3018
+ #ifndef utf8_to_bytes_overwrite
3019
+
3003
3020
if (flags & SHV_K_WASUTF8 )
3004
3021
Safefree (keyval );
3022
+ #endif
3005
3023
}
3006
3024
3007
3025
/*
@@ -7431,13 +7449,26 @@ static SV *do_retrieve(
7431
7449
if (SvUTF8 (in )) {
7432
7450
STRLEN length ;
7433
7451
const char * orig = SvPV (in , length );
7434
- char * asbytes ;
7435
7452
/* This is quite deliberate. I want the UTF8 routines
7436
7453
to encounter the '\0' which perl adds at the end
7437
7454
of all scalars, so that any new string also has
7438
7455
this.
7439
7456
*/
7440
7457
STRLEN klen_tmp = length + 1 ;
7458
+
7459
+ # define CROAK_TO_BYTES_TEXT \
7460
+ "Frozen string corrupt - contains characters outside 0-255"
7461
+ # ifdef utf8_to_bytes_overwrite
7462
+
7463
+ if (! utf8_to_bytes_overwrite ( (U8 * * ) & orig , & klen_tmp )) {
7464
+ CROAK ((CROAK_TO_BYTES_TEXT ));
7465
+ }
7466
+
7467
+ SvLEN_set (in , klen_tmp );
7468
+ SvCUR_set (in , klen_tmp - 1 );
7469
+
7470
+ # else
7471
+ char * asbytes ;
7441
7472
bool is_utf8 = TRUE;
7442
7473
7443
7474
/* Just casting the &klen to (STRLEN) won't work
@@ -7447,7 +7478,7 @@ static SV *do_retrieve(
7447
7478
& klen_tmp ,
7448
7479
& is_utf8 );
7449
7480
if (is_utf8 ) {
7450
- CROAK (("Frozen string corrupt - contains characters outside 0-255" ));
7481
+ CROAK ((CROAK_TO_BYTES_TEXT ));
7451
7482
}
7452
7483
if (asbytes != orig ) {
7453
7484
/* String has been converted.
@@ -7462,6 +7493,8 @@ static SV *do_retrieve(
7462
7493
SvLEN_set (in , klen_tmp );
7463
7494
SvCUR_set (in , klen_tmp - 1 );
7464
7495
}
7496
+ # endif
7497
+
7465
7498
}
7466
7499
#endif
7467
7500
MBUF_SAVE_AND_LOAD (in );
0 commit comments