@@ -2468,37 +2468,44 @@ static int php_memc_handle_error(php_memc_t *i_obj, memcached_return status TSRM
2468
2468
static char * php_memc_zval_to_payload (zval * value , size_t * payload_len , uint32_t * flags , enum memcached_serializer serializer , enum memcached_compression_type compression_type TSRMLS_DC )
2469
2469
{
2470
2470
char * payload ;
2471
+ char * p ;
2472
+ int l ;
2473
+ zend_bool buf_used = 0 ;
2471
2474
smart_str buf = {0 };
2475
+ char tmp [40 ] = {0 };
2472
2476
2473
2477
switch (Z_TYPE_P (value )) {
2474
2478
2475
2479
case IS_STRING :
2476
- smart_str_appendl (& buf , Z_STRVAL_P (value ), Z_STRLEN_P (value ));
2480
+ p = Z_STRVAL_P (value );
2481
+ l = Z_STRLEN_P (value );
2477
2482
MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_STRING );
2478
2483
break ;
2479
2484
2480
2485
case IS_LONG :
2481
- case IS_DOUBLE :
2482
- case IS_BOOL :
2483
- {
2484
- zval value_copy ;
2486
+ l = sprintf ( tmp , "%ld" , Z_LVAL_P ( value ));
2487
+ p = tmp ;
2488
+ MEMC_VAL_SET_TYPE ( * flags , MEMC_VAL_IS_LONG );
2489
+ break ;
2485
2490
2486
- value_copy = * value ;
2487
- zval_copy_ctor ( & value_copy );
2488
- convert_to_string ( & value_copy ) ;
2489
- smart_str_appendl ( & buf , Z_STRVAL ( value_copy ), Z_STRLEN ( value_copy ) );
2490
- zval_dtor ( & value_copy ) ;
2491
+ case IS_DOUBLE :
2492
+ l = sprintf ( tmp , "%f" , Z_DVAL_P ( value ) );
2493
+ p = tmp ;
2494
+ MEMC_VAL_SET_TYPE ( * flags , MEMC_VAL_IS_DOUBLE );
2495
+ break ;
2491
2496
2492
- * flags &= ~MEMC_VAL_COMPRESSED ;
2493
- if (Z_TYPE_P (value ) == IS_LONG ) {
2494
- MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_LONG );
2495
- } else if (Z_TYPE_P (value ) == IS_DOUBLE ) {
2496
- MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_DOUBLE );
2497
- } else if (Z_TYPE_P (value ) == IS_BOOL ) {
2498
- MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_BOOL );
2497
+ case IS_BOOL :
2498
+ if (Z_BVAL_P (value )) {
2499
+ l = 1 ;
2500
+ tmp [0 ] = '1' ;
2501
+ tmp [1 ] = '\0' ;
2502
+ } else {
2503
+ l = 0 ;
2504
+ tmp [0 ] = '\0' ;
2499
2505
}
2506
+ p = tmp ;
2507
+ MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_BOOL );
2500
2508
break ;
2501
- }
2502
2509
2503
2510
default :
2504
2511
switch (serializer ) {
@@ -2508,6 +2515,9 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t
2508
2515
smart_str_free (& buf );
2509
2516
return NULL ;
2510
2517
}
2518
+ p = buf .c ;
2519
+ l = buf .len ;
2520
+ buf_used = 1 ;
2511
2521
MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_IGBINARY );
2512
2522
break ;
2513
2523
#endif
@@ -2522,6 +2532,9 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t
2522
2532
php_json_encode (& buf , value , 0 TSRMLS_CC ); /* options */
2523
2533
#endif
2524
2534
buf .c [buf .len ] = 0 ;
2535
+ p = buf .c ;
2536
+ l = buf .len ;
2537
+ buf_used = 1 ;
2525
2538
MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_JSON );
2526
2539
break ;
2527
2540
}
@@ -2538,7 +2551,9 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t
2538
2551
smart_str_free (& buf );
2539
2552
return NULL ;
2540
2553
}
2541
-
2554
+ p = buf .c ;
2555
+ l = buf .len ;
2556
+ buf_used = 1 ;
2542
2557
MEMC_VAL_SET_TYPE (* flags , MEMC_VAL_IS_SERIALIZED );
2543
2558
break ;
2544
2559
}
@@ -2547,6 +2562,12 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t
2547
2562
break ;
2548
2563
}
2549
2564
2565
+ /* Check for exceptions caused by serializers */
2566
+ if (EG (exception ) && buf_used ) {
2567
+ smart_str_free (& buf );
2568
+ return NULL ;
2569
+ }
2570
+
2550
2571
/* turn off compression for values below the threshold */
2551
2572
if ((* flags & MEMC_VAL_COMPRESSED ) && buf .len < MEMC_G (compression_threshold )) {
2552
2573
* flags &= ~MEMC_VAL_COMPRESSED ;
@@ -2557,44 +2578,48 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t
2557
2578
zend_bool compress_status = 0 ;
2558
2579
2559
2580
/* Additional 5% for the data */
2560
- unsigned long payload_comp_len = (unsigned long )((buf . len * 1.05 ) + 1 );
2581
+ unsigned long payload_comp_len = (unsigned long )((l * 1.05 ) + 1 );
2561
2582
char * payload_comp = emalloc (payload_comp_len + sizeof (uint32_t ));
2562
2583
payload = payload_comp ;
2563
- memcpy (payload_comp , & buf . len , sizeof (uint32_t ));
2584
+ memcpy (payload_comp , & l , sizeof (uint32_t ));
2564
2585
payload_comp += sizeof (uint32_t );
2565
2586
2566
2587
if (compression_type == COMPRESSION_TYPE_FASTLZ ) {
2567
- compress_status = ((payload_comp_len = fastlz_compress (buf . c , buf . len , payload_comp )) > 0 );
2588
+ compress_status = ((payload_comp_len = fastlz_compress (p , l , payload_comp )) > 0 );
2568
2589
* flags |= MEMC_VAL_COMPRESSION_FASTLZ ;
2569
2590
} else if (compression_type == COMPRESSION_TYPE_ZLIB ) {
2570
- compress_status = (compress ((Bytef * )payload_comp , & payload_comp_len , (Bytef * )buf . c , buf . len ) == Z_OK );
2591
+ compress_status = (compress ((Bytef * )payload_comp , & payload_comp_len , (Bytef * )p , l ) == Z_OK );
2571
2592
* flags |= MEMC_VAL_COMPRESSION_ZLIB ;
2572
2593
}
2573
2594
2574
2595
if (!compress_status ) {
2575
2596
php_error_docref (NULL TSRMLS_CC , E_WARNING , "could not compress value" );
2576
2597
efree (payload );
2577
- smart_str_free (& buf );
2598
+ if (buf_used ) {
2599
+ smart_str_free (& buf );
2600
+ }
2578
2601
return NULL ;
2579
2602
}
2580
2603
2581
2604
/* Check that we are above ratio */
2582
- if (buf . len > (payload_comp_len * MEMC_G (compression_factor ))) {
2605
+ if (l > (payload_comp_len * MEMC_G (compression_factor ))) {
2583
2606
* payload_len = payload_comp_len + sizeof (uint32_t );
2584
2607
payload [* payload_len ] = 0 ;
2585
2608
} else {
2586
2609
/* Store plain value */
2587
2610
* flags &= ~MEMC_VAL_COMPRESSED ;
2588
- * payload_len = buf . len ;
2589
- memcpy (payload , buf . c , buf . len );
2590
- payload [buf . len ] = 0 ;
2611
+ * payload_len = l ;
2612
+ memcpy (payload , p , l );
2613
+ payload [l ] = 0 ;
2591
2614
}
2592
2615
} else {
2593
- * payload_len = buf . len ;
2594
- payload = estrndup (buf . c , buf . len );
2616
+ * payload_len = l ;
2617
+ payload = estrndup (p , l );
2595
2618
}
2596
2619
2597
- smart_str_free (& buf );
2620
+ if (buf_used ) {
2621
+ smart_str_free (& buf );
2622
+ }
2598
2623
return payload ;
2599
2624
}
2600
2625
0 commit comments