From 36dbfacbe64697d959f524e537b15b73c090d898 Mon Sep 17 00:00:00 2001 From: Stefan Esser Date: Sun, 21 Feb 2010 11:44:54 +0100 Subject: Inital commit --- memory_limit.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 memory_limit.c (limited to 'memory_limit.c') diff --git a/memory_limit.c b/memory_limit.c new file mode 100644 index 0000000..fd54301 --- /dev/null +++ b/memory_limit.c @@ -0,0 +1,90 @@ +/* + +----------------------------------------------------------------------+ + | Suhosin Version 1 | + +----------------------------------------------------------------------+ + | Copyright (c) 2006-2007 The Hardened-PHP Project | + | Copyright (c) 2007 SektionEins GmbH | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Stefan Esser | + +----------------------------------------------------------------------+ +*/ +/* + $Id: memory_limit.c,v 1.1.1.1 2007-11-28 01:15:35 sesser Exp $ +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "php_suhosin.h" + + +/* {{{ PHP_INI_MH + */ +static PHP_INI_MH(suhosin_OnChangeMemoryLimit) +{ + long hard_memory_limit = 1<<30; + + if (stage == ZEND_INI_STAGE_RUNTIME) { + if (SUHOSIN_G(memory_limit) > 0) { + SUHOSIN_G(hard_memory_limit) = SUHOSIN_G(memory_limit); + } else if (SUHOSIN_G(hard_memory_limit) == 0) { + SUHOSIN_G(hard_memory_limit) = PG(memory_limit); + } + hard_memory_limit = SUHOSIN_G(hard_memory_limit); + } else { + SUHOSIN_G(hard_memory_limit) = 0; + } + if (new_value) { + PG(memory_limit) = zend_atoi(new_value, new_value_length); + if (PG(memory_limit) > hard_memory_limit || PG(memory_limit) < 0) { + suhosin_log(S_MISC, "script tried to increase memory_limit to %u bytes which is above the allowed value", PG(memory_limit)); + if (!SUHOSIN_G(simulation)) { + PG(memory_limit) = hard_memory_limit; + return FAILURE; + } + } + } else { + PG(memory_limit) = hard_memory_limit; + } + return zend_set_memory_limit(PG(memory_limit)); +} +/* }}} */ + + +void suhosin_hook_memory_limit() +{ + zend_ini_entry *ini_entry; + TSRMLS_FETCH(); + + /* check if we are compiled against memory_limit */ + if (zend_hash_find(EG(ini_directives), "memory_limit", sizeof("memory_limit"), (void **) &ini_entry)==FAILURE) { + return; + } + + /* replace OnUpdateMemoryLimit handler */ + ini_entry->on_modify = suhosin_OnChangeMemoryLimit; +} + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + + -- cgit v1.3