diff options
Diffstat (limited to 'ext/mcrypt/mcrypt.c')
-rw-r--r-- | ext/mcrypt/mcrypt.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/ext/mcrypt/mcrypt.c b/ext/mcrypt/mcrypt.c index 45dd5a5f6f..7539d9e53f 100644 --- a/ext/mcrypt/mcrypt.c +++ b/ext/mcrypt/mcrypt.c @@ -45,7 +45,7 @@ static int le_mcrypt; -typedef struct _php_mcrypt { +typedef struct _php_mcrypt { MCRYPT td; zend_bool init; } php_mcrypt; @@ -295,7 +295,7 @@ ZEND_DECLARE_MODULE_GLOBALS(mcrypt) zend_module_entry mcrypt_module_entry = { STANDARD_MODULE_HEADER, - "mcrypt", + "mcrypt", mcrypt_functions, PHP_MINIT(mcrypt), PHP_MSHUTDOWN(mcrypt), NULL, NULL, @@ -343,7 +343,7 @@ typedef enum { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mcryptind) == FAILURE) { \ return; \ } \ - ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt); + ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt); #define MCRYPT_GET_MODE_DIR_ARGS(DIRECTORY) \ char *dir = NULL; \ @@ -374,7 +374,7 @@ PHP_INI_END() static void php_mcrypt_module_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */ { php_mcrypt *pm = (php_mcrypt *) rsrc->ptr; - if (pm) { + if (pm) { mcrypt_generic_deinit(pm->td); mcrypt_module_close(pm->td); efree(pm); @@ -517,7 +517,7 @@ PHP_MINFO_FUNCTION(mcrypt) /* {{{ */ smart_str_free(&tmp1); smart_str_free(&tmp2); php_info_print_table_end(); - + DISPLAY_INI_ENTRIES(); } /* }}} */ @@ -532,17 +532,17 @@ PHP_FUNCTION(mcrypt_module_open) int mode_len, mode_dir_len; MCRYPT td; php_mcrypt *pm; - + if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ssss", &cipher, &cipher_len, &cipher_dir, &cipher_dir_len, &mode, &mode_len, &mode_dir, &mode_dir_len)) { return; } - + td = mcrypt_module_open ( cipher, cipher_dir_len > 0 ? cipher_dir : MCG(algorithms_dir), - mode, + mode, mode_dir_len > 0 ? mode_dir : MCG(modes_dir) ); @@ -569,7 +569,7 @@ PHP_FUNCTION(mcrypt_generic_init) int max_key_size, key_size, iv_size; php_mcrypt *pm; int result = 0; - + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &mcryptind, &key, &key_len, &iv, &iv_len) == FAILURE) { return; } @@ -648,7 +648,7 @@ PHP_FUNCTION(mcrypt_generic) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &mcryptind, &data, &data_len) == FAILURE) { return; } - + ZEND_FETCH_RESOURCE(pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt); PHP_MCRYPT_INIT_CHECK @@ -661,6 +661,10 @@ PHP_FUNCTION(mcrypt_generic) if (mcrypt_enc_is_block_mode(pm->td) == 1) { /* It's a block algorithm */ block_size = mcrypt_enc_get_block_size(pm->td); data_size = (((data_len - 1) / block_size) + 1) * block_size; + if (data_size <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Integer overflow in data size"); + RETURN_FALSE; + } data_s = emalloc(data_size + 1); memset(data_s, 0, data_size); memcpy(data_s, data, data_len); @@ -670,7 +674,7 @@ PHP_FUNCTION(mcrypt_generic) memset(data_s, 0, data_size); memcpy(data_s, data, data_len); } - + mcrypt_generic(pm->td, data_s, data_size); data_s[data_size] = '\0'; @@ -689,11 +693,11 @@ PHP_FUNCTION(mdecrypt_generic) php_mcrypt *pm; char* data_s; int block_size, data_size; - + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &mcryptind, &data, &data_len) == FAILURE) { return; } - + ZEND_FETCH_RESOURCE(pm, php_mcrypt * , &mcryptind, -1, "MCrypt", le_mcrypt); PHP_MCRYPT_INIT_CHECK @@ -706,6 +710,10 @@ PHP_FUNCTION(mdecrypt_generic) if (mcrypt_enc_is_block_mode(pm->td) == 1) { /* It's a block algorithm */ block_size = mcrypt_enc_get_block_size(pm->td); data_size = (((data_len - 1) / block_size) + 1) * block_size; + if (data_size <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Integer overflow in data size"); + RETURN_FALSE; + } data_s = emalloc(data_size + 1); memset(data_s, 0, data_size); memcpy(data_s, data, data_len); @@ -715,7 +723,7 @@ PHP_FUNCTION(mdecrypt_generic) memset(data_s, 0, data_size); memcpy(data_s, data, data_len); } - + mdecrypt_generic(pm->td, data_s, data_size); RETVAL_STRINGL(data_s, data_size, 1); @@ -729,7 +737,7 @@ PHP_FUNCTION(mcrypt_enc_get_supported_key_sizes) { int i, count = 0; int *key_sizes; - + MCRYPT_GET_TD_ARG array_init(return_value); @@ -798,7 +806,7 @@ PHP_FUNCTION(mcrypt_enc_is_block_algorithm) MCRYPT_GET_TD_ARG if (mcrypt_enc_is_block_algorithm(pm->td) == 1) { - RETURN_TRUE + RETURN_TRUE } else { RETURN_FALSE } @@ -877,7 +885,7 @@ PHP_FUNCTION(mcrypt_enc_get_modes_name) PHP_FUNCTION(mcrypt_module_self_test) { MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir); - + if (mcrypt_module_self_test(module, dir) == 0) { RETURN_TRUE; } else { @@ -891,7 +899,7 @@ PHP_FUNCTION(mcrypt_module_self_test) PHP_FUNCTION(mcrypt_module_is_block_algorithm_mode) { MCRYPT_GET_MODE_DIR_ARGS(modes_dir) - + if (mcrypt_module_is_block_algorithm_mode(module, dir) == 1) { RETURN_TRUE; } else { @@ -905,7 +913,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm_mode) PHP_FUNCTION(mcrypt_module_is_block_algorithm) { MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir) - + if (mcrypt_module_is_block_algorithm(module, dir) == 1) { RETURN_TRUE; } else { @@ -919,7 +927,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm) PHP_FUNCTION(mcrypt_module_is_block_mode) { MCRYPT_GET_MODE_DIR_ARGS(modes_dir) - + if (mcrypt_module_is_block_mode(module, dir) == 1) { RETURN_TRUE; } else { @@ -933,7 +941,7 @@ PHP_FUNCTION(mcrypt_module_is_block_mode) PHP_FUNCTION(mcrypt_module_get_algo_block_size) { MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir) - + RETURN_LONG(mcrypt_module_get_algo_block_size(module, dir)); } /* }}} */ @@ -943,7 +951,7 @@ PHP_FUNCTION(mcrypt_module_get_algo_block_size) PHP_FUNCTION(mcrypt_module_get_algo_key_size) { MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir); - + RETURN_LONG(mcrypt_module_get_algo_key_size(module, dir)); } /* }}} */ @@ -954,7 +962,7 @@ PHP_FUNCTION(mcrypt_module_get_supported_key_sizes) { int i, count = 0; int *key_sizes; - + MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir) array_init(return_value); @@ -980,7 +988,7 @@ PHP_FUNCTION(mcrypt_list_algorithms) &lib_dir, &lib_dir_len) == FAILURE) { return; } - + array_init(return_value); modules = mcrypt_list_algorithms(lib_dir, &count); @@ -1027,7 +1035,7 @@ PHP_FUNCTION(mcrypt_get_key_size) { char *cipher; char *module; - int cipher_len, module_len; + int cipher_len, module_len; char *cipher_dir_string; char *module_dir_string; MCRYPT td; @@ -1038,7 +1046,7 @@ PHP_FUNCTION(mcrypt_get_key_size) &cipher, &cipher_len, &module, &module_len) == FAILURE) { return; } - + td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string); if (td != MCRYPT_FAILED) { RETVAL_LONG(mcrypt_enc_get_key_size(td)); @@ -1056,7 +1064,7 @@ PHP_FUNCTION(mcrypt_get_block_size) { char *cipher; char *module; - int cipher_len, module_len; + int cipher_len, module_len; char *cipher_dir_string; char *module_dir_string; MCRYPT td; @@ -1067,7 +1075,7 @@ PHP_FUNCTION(mcrypt_get_block_size) &cipher, &cipher_len, &module, &module_len) == FAILURE) { return; } - + td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string); if (td != MCRYPT_FAILED) { RETVAL_LONG(mcrypt_enc_get_block_size(td)); @@ -1085,7 +1093,7 @@ PHP_FUNCTION(mcrypt_get_iv_size) { char *cipher; char *module; - int cipher_len, module_len; + int cipher_len, module_len; char *cipher_dir_string; char *module_dir_string; MCRYPT td; @@ -1096,7 +1104,7 @@ PHP_FUNCTION(mcrypt_get_iv_size) &cipher, &cipher_len, &module, &module_len) == FAILURE) { return; } - + td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string); if (td != MCRYPT_FAILED) { RETVAL_LONG(mcrypt_enc_get_iv_size(td)); @@ -1360,7 +1368,7 @@ PHP_FUNCTION(mcrypt_ecb) zval **mode; char *cipher, *key, *data, *iv = NULL; int cipher_len, key_len, data_len, iv_len = 0; - + MCRYPT_GET_CRYPT_ARGS convert_to_long_ex(mode); @@ -1392,7 +1400,7 @@ PHP_FUNCTION(mcrypt_cfb) zval **mode; char *cipher, *key, *data, *iv = NULL; int cipher_len, key_len, data_len, iv_len = 0; - + MCRYPT_GET_CRYPT_ARGS convert_to_long_ex(mode); @@ -1408,7 +1416,7 @@ PHP_FUNCTION(mcrypt_ofb) zval **mode; char *cipher, *key, *data, *iv = NULL; int cipher_len, key_len, data_len, iv_len = 0; - + MCRYPT_GET_CRYPT_ARGS convert_to_long_ex(mode); @@ -1434,9 +1442,9 @@ PHP_FUNCTION(mcrypt_create_iv) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create an IV with a size of less than 1 or greater than %d", INT_MAX); RETURN_FALSE; } - + iv = ecalloc(size + 1, 1); - + if (source == RANDOM || source == URANDOM) { #if PHP_WIN32 /* random/urandom equivalent on Windows */ |