@@ -82,6 +82,7 @@ static int php_memc_list_entry(void) {
82
82
#define MEMC_OPT_STORE_RETRY_COUNT -1005
83
83
#define MEMC_OPT_USER_FLAGS -1006
84
84
#define MEMC_OPT_COMPRESSION_LEVEL -1007
85
+ #define MEMC_OPT_ITEM_SIZE_LIMIT -1008
85
86
86
87
/****************************************
87
88
Custom result codes
@@ -162,6 +163,7 @@ typedef struct {
162
163
163
164
zend_long store_retry_count ;
164
165
zend_long set_udf_flags ;
166
+ zend_long item_size_limit ;
165
167
166
168
#ifdef HAVE_MEMCACHED_SASL
167
169
zend_bool has_sasl_data ;
@@ -423,6 +425,7 @@ PHP_INI_BEGIN()
423
425
MEMC_INI_ENTRY ("compression_threshold" , "2000" , OnUpdateLong , compression_threshold )
424
426
MEMC_INI_ENTRY ("serializer" , SERIALIZER_DEFAULT_NAME , OnUpdateSerializer , serializer_name )
425
427
MEMC_INI_ENTRY ("store_retry_count" , "0" , OnUpdateLong , store_retry_count )
428
+ MEMC_INI_ENTRY ("item_size_limit" , "0" , OnUpdateLongGEZero , item_size_limit )
426
429
427
430
MEMC_INI_BOOL ("default_consistent_hash" , "0" , OnUpdateBool , default_behavior .consistent_hash_enabled )
428
431
MEMC_INI_BOOL ("default_binary_protocol" , "0" , OnUpdateBool , default_behavior .binary_protocol_enabled )
@@ -1127,6 +1130,21 @@ zend_string *s_zval_to_payload(php_memc_object_t *intern, zval *value, uint32_t
1127
1130
return payload ;
1128
1131
}
1129
1132
1133
+ static
1134
+ zend_bool s_is_payload_too_big (php_memc_object_t * intern , zend_string * payload )
1135
+ {
1136
+ php_memc_user_data_t * memc_user_data = memcached_get_user_data (intern -> memc );
1137
+
1138
+ /* An item size limit of 0 implies no limit enforced */
1139
+ if (memc_user_data -> item_size_limit == 0 ) {
1140
+ return 0 ;
1141
+ }
1142
+ if (ZSTR_LEN (payload ) > memc_user_data -> item_size_limit ) {
1143
+ return 1 ;
1144
+ }
1145
+ return 0 ;
1146
+ }
1147
+
1130
1148
static
1131
1149
zend_bool s_should_retry_write (php_memc_object_t * intern , memcached_return status )
1132
1150
{
@@ -1153,6 +1171,12 @@ zend_bool s_memc_write_zval (php_memc_object_t *intern, php_memc_write_op op, ze
1153
1171
s_memc_set_status (intern , MEMC_RES_PAYLOAD_FAILURE , 0 );
1154
1172
return 0 ;
1155
1173
}
1174
+
1175
+ if (s_is_payload_too_big (intern , payload )) {
1176
+ s_memc_set_status (intern , MEMCACHED_E2BIG , 0 );
1177
+ zend_string_release (payload );
1178
+ return 0 ;
1179
+ }
1156
1180
}
1157
1181
1158
1182
#define memc_write_using_fn (fn_name ) payload ? fn_name(intern->memc, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(payload), ZSTR_LEN(payload), expiration, flags) : MEMC_RES_PAYLOAD_FAILURE;
@@ -1305,6 +1329,7 @@ static PHP_METHOD(Memcached, __construct)
1305
1329
memc_user_data -> encoding_enabled = 0 ;
1306
1330
memc_user_data -> store_retry_count = MEMC_G (store_retry_count );
1307
1331
memc_user_data -> set_udf_flags = -1 ;
1332
+ memc_user_data -> item_size_limit = MEMC_G (item_size_limit );
1308
1333
memc_user_data -> is_persistent = is_persistent ;
1309
1334
1310
1335
memcached_set_user_data (intern -> memc , memc_user_data );
@@ -2145,6 +2170,12 @@ static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
2145
2170
RETURN_FALSE ;
2146
2171
}
2147
2172
2173
+ if (s_is_payload_too_big (intern , payload )) {
2174
+ intern -> rescode = MEMCACHED_E2BIG ;
2175
+ zend_string_release (payload );
2176
+ RETURN_FALSE ;
2177
+ }
2178
+
2148
2179
if (by_key ) {
2149
2180
status = memcached_cas_by_key (intern -> memc , ZSTR_VAL (server_key ), ZSTR_LEN (server_key ), ZSTR_VAL (key ), ZSTR_LEN (key ), ZSTR_VAL (payload ), ZSTR_LEN (payload ), expiration , flags , cas );
2150
2181
} else {
@@ -2970,6 +3001,9 @@ static PHP_METHOD(Memcached, getOption)
2970
3001
case MEMC_OPT_COMPRESSION :
2971
3002
RETURN_BOOL (memc_user_data -> compression_enabled );
2972
3003
3004
+ case MEMC_OPT_ITEM_SIZE_LIMIT :
3005
+ RETURN_LONG (memc_user_data -> item_size_limit );
3006
+
2973
3007
case MEMC_OPT_PREFIX_KEY :
2974
3008
{
2975
3009
memcached_return retval ;
@@ -3041,6 +3075,15 @@ int php_memc_set_option(php_memc_object_t *intern, long option, zval *value)
3041
3075
}
3042
3076
break ;
3043
3077
3078
+ case MEMC_OPT_ITEM_SIZE_LIMIT :
3079
+ lval = zval_get_long (value );
3080
+ if (lval < 0 ) {
3081
+ php_error_docref (NULL , E_WARNING , "ITEM_SIZE_LIMIT must be >= 0" );
3082
+ return 0 ;
3083
+ }
3084
+ memc_user_data -> item_size_limit = lval ;
3085
+ break ;
3086
+
3044
3087
case MEMC_OPT_PREFIX_KEY :
3045
3088
{
3046
3089
zend_string * str ;
@@ -4013,6 +4056,7 @@ PHP_GINIT_FUNCTION(php_memcached)
4013
4056
php_memcached_globals -> memc .compression_factor = 1.30 ;
4014
4057
php_memcached_globals -> memc .compression_level = 3 ;
4015
4058
php_memcached_globals -> memc .store_retry_count = 2 ;
4059
+ php_memcached_globals -> memc .item_size_limit = 0 ;
4016
4060
4017
4061
php_memcached_globals -> memc .sasl_initialised = 0 ;
4018
4062
php_memcached_globals -> no_effect = 0 ;
@@ -4063,6 +4107,7 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
4063
4107
4064
4108
REGISTER_MEMC_CLASS_CONST_LONG (OPT_USER_FLAGS , MEMC_OPT_USER_FLAGS );
4065
4109
REGISTER_MEMC_CLASS_CONST_LONG (OPT_STORE_RETRY_COUNT , MEMC_OPT_STORE_RETRY_COUNT );
4110
+ REGISTER_MEMC_CLASS_CONST_LONG (OPT_ITEM_SIZE_LIMIT , MEMC_OPT_ITEM_SIZE_LIMIT );
4066
4111
4067
4112
/*
4068
4113
* Indicate whether igbinary serializer is available
0 commit comments