diff options
author | Sascha Schumann <sas@php.net> | 1999-09-03 17:46:39 +0000 |
---|---|---|
committer | Sascha Schumann <sas@php.net> | 1999-09-03 17:46:39 +0000 |
commit | 5b293ecd4dcd22a391784a88cead34d810e7eac7 (patch) | |
tree | 368e68e3f30932d16012778b301c2c78fbf5e46a | |
parent | 690575e51f1866e00074411aae18f98d76cfdf26 (diff) | |
download | php-git-5b293ecd4dcd22a391784a88cead34d810e7eac7.tar.gz |
- add global startup/shutdown handlers
- improve genif.sh to also consider all header files for inclusion
(checks for phpext_)
- use vsnprintf in main.c to avoid buffer overflows
- improve sessions's mm module to cope better with OOM situations
within the shared memory segment
- fix typo wrt session.auto_start
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | acinclude.m4 | 2 | ||||
-rw-r--r-- | ext/session/config.m4 | 1 | ||||
-rw-r--r-- | ext/session/mod_mm.c | 85 | ||||
-rw-r--r-- | ext/session/mod_mm.h | 6 | ||||
-rw-r--r-- | ext/session/session.c | 3 | ||||
-rw-r--r-- | genif.sh | 14 | ||||
-rw-r--r-- | main/SAPI.c | 4 | ||||
-rw-r--r-- | main/internal_functions.c.in | 33 | ||||
-rw-r--r-- | main/main.c | 2 | ||||
-rw-r--r-- | main/php.h | 16 |
11 files changed, 140 insertions, 28 deletions
@@ -2,6 +2,8 @@ PHP 4.0 CHANGE LOG ChangeLog ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ?? 1999, Version 4.0 Beta 3 +- Added shared memory module for session data storage (Sascha) +- Fixed session.auto_start (Sascha) - Fixed several problems with output buffering and HEAD requests (Zeev) - Fixed HTTP Status code issue with ISAPI module (Zeev) - Fixed a problem that prevented $GLOBALS from working properly (Zeev, Zend diff --git a/acinclude.m4 b/acinclude.m4 index b8e80403da..dac3621304 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -141,6 +141,7 @@ dnl XXX have to change the hardcoding of ".a" when we want to be able dnl to make dynamic libraries as well. dnl AC_DEFUN(PHP_EXTENSION,[ + if test -d "$cwd/$srcdir/ext/$1" ; then EXT_SUBDIRS="$EXT_SUBDIRS $1" if test "$2" != "shared" -a "$2" != "yes"; then _extlib="libphpext_$1.a" @@ -153,6 +154,7 @@ AC_DEFUN(PHP_EXTENSION,[ dnl EXT_INCLUDE_CODE="\#include \"ext/$1/php3_$1.h\"\\n$EXT_INCLUDE_CODE" dnl EXT_MODULE_PTRS="phpext_$1_ptr, $EXT_MODULE_PTRS" dnl " + fi ]) AC_SUBST(EXT_SUBDIRS) diff --git a/ext/session/config.m4 b/ext/session/config.m4 index a85c321f24..ac39c53cf4 100644 --- a/ext/session/config.m4 +++ b/ext/session/config.m4 @@ -23,6 +23,7 @@ AC_ARG_WITH(mm, AC_ADD_INCLUDE($MM_DIR/include) AC_DEFINE(HAVE_LIBMM, 1) MM_RESULT=yes + PHP_EXTENSION(ps_mm) fi ]) AC_MSG_RESULT($MM_RESULT) diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c index 5361dc38ff..41b82ecf62 100644 --- a/ext/session/mod_mm.c +++ b/ext/session/mod_mm.c @@ -30,12 +30,18 @@ #include "php_session.h" #include "mod_mm.h" +#define PS_MM_PATH "/tmp/session_mm" + +/* + * this list holds all data associated with one session + */ + typedef struct ps_sd { + struct ps_sd *next, *prev; time_t ctime; char *key; void *data; size_t datalen; - struct ps_sd *next, *prev; } ps_sd; typedef struct { @@ -46,7 +52,7 @@ typedef struct { static ps_mm *ps_mm_instance = NULL; /* should be a prime */ -#define HASH_SIZE 11 +#define HASH_SIZE 577 #if 0 #define ps_mm_debug(a...) fprintf(stderr, a) @@ -59,6 +65,11 @@ static ps_mm *ps_mm_instance = NULL; #define ONE_EIGTH ((int) (BITS_IN_int / 8)) #define HIGH_BITS (~((unsigned int)(~0) >> ONE_EIGTH)) +/* + * Weinberger's generic hash algorithm, adapted by Holub + * (published in [Holub 1990]) + */ + static unsigned int ps_sd_hash(const char *data) { unsigned int val, i; @@ -82,13 +93,27 @@ static ps_sd *ps_sd_new(ps_mm *data, const char *key, const void *sdata, size_t h = ps_sd_hash(key) % HASH_SIZE; sd = mm_malloc(data->mm, sizeof(*sd)); + if(!sd) { + return NULL; + } sd->ctime = 0; sd->data = mm_malloc(data->mm, sdatalen); - memcpy(sd->data, sdata, sdatalen); + if(!sd->data) { + mm_free(data->mm, sd); + return NULL; + } + sd->datalen = sdatalen; sd->key = mm_strdup(data->mm, key); + if(!sd->key) { + mm_free(data->mm, sd->data); + mm_free(data->mm, sd); + return NULL; + } + + memcpy(sd->data, sdata, sdatalen); if((sd->next = data->hash[h])) sd->next->prev = sd; @@ -116,7 +141,7 @@ static void ps_sd_destroy(ps_mm *data, ps_sd *sd) data->hash[h] = sd->next; mm_free(data->mm, sd->key); - mm_free(data->mm, sd->data); + if(sd->data) mm_free(data->mm, sd->data); mm_free(data->mm, sd); } @@ -159,17 +184,38 @@ static int ps_mm_initialize(ps_mm *data, const char *path) static void ps_mm_destroy(ps_mm *data) { + int h; + ps_sd *sd, *next; + + for(h = 0; h < HASH_SIZE; h++) { + for(sd = data->hash[h]; sd; sd = next) { + next = sd->next; + ps_sd_destroy(data, sd); + } + } + mm_free(data->mm, data->hash); mm_destroy(data->mm); } -PS_OPEN_FUNC(mm) +PHP_GINIT_FUNCTION(ps_mm) { - if(!ps_mm_instance) { - ps_mm_instance = calloc(sizeof(*data), 1); - ps_mm_initialize(ps_mm_instance, save_path); - } + ps_mm_instance = calloc(sizeof(*ps_mm_instance), 1); + ps_mm_initialize(ps_mm_instance, PS_MM_PATH); + return SUCCESS; +} + +PHP_GSHUTDOWN_FUNCTION(ps_mm) +{ + ps_mm_destroy(ps_mm_instance); + free(ps_mm_instance); + return SUCCESS; +} +PS_OPEN_FUNC(mm) +{ + ps_mm_debug("open: ps_mm_instance=%x\n", ps_mm_instance); + PS_SET_MOD_DATA(ps_mm_instance); return SUCCESS; @@ -219,14 +265,19 @@ PS_WRITE_FUNC(mm) mm_free(data->mm, sd->data); sd->datalen = vallen; sd->data = mm_malloc(data->mm, vallen); - memcpy(sd->data, val, vallen); + if(!sd->data) { + ps_sd_destroy(data, sd); + sd = NULL; + } else { + memcpy(sd->data, val, vallen); + } } - time(&sd->ctime); + if(sd) time(&sd->ctime); mm_unlock(data->mm); - return SUCCESS; + return sd ? SUCCESS : FAILURE; } PS_DESTROY_FUNC(mm) @@ -274,4 +325,14 @@ PS_GC_FUNC(mm) return SUCCESS; } +zend_module_entry php_session_mm_module = { + "Session MM", + NULL, + NULL, NULL, + NULL, NULL, + NULL, + PHP_GINIT(ps_mm), PHP_GSHUTDOWN(ps_mm), + STANDARD_MODULE_PROPERTIES_EX +}; + #endif diff --git a/ext/session/mod_mm.h b/ext/session/mod_mm.h index e3cfe2db1f..69d9a7d3e1 100644 --- a/ext/session/mod_mm.h +++ b/ext/session/mod_mm.h @@ -32,14 +32,20 @@ #ifdef HAVE_LIBMM +#include "php_session.h" + extern ps_module ps_mod_mm; #define ps_mm_ptr &ps_mod_mm +extern zend_module_entry php_session_mm_module; +#define phpext_ps_mm_ptr &php_session_mm_module + PS_FUNCS(mm); #else #define ps_mm_ptr NULL +#define phpext_ps_mm_ptr NULL #endif diff --git a/ext/session/session.c b/ext/session/session.c index 873a4b0247..0157868a5b 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -281,7 +281,6 @@ static void _php_session_send_cookie(PSLS_D) cookie = ecalloc(len + 1, 1); snprintf(cookie, len, COOKIE_FMT, PS(session_name), PS(id)); - cookie[len] = '\0'; if (PS(lifetime) > 0) { strcat(cookie, COOKIE_EXPIRES); strcat(cookie, date_fmt); @@ -701,7 +700,7 @@ int php_rinit_session(INIT_FUNC_ARGS) return FAILURE; } - if(INI_INT("session_auto_start")) { + if(INI_INT("session.auto_start")) { _php_session_start(PSLS_C); } @@ -1,6 +1,6 @@ #! /bin/sh -# $Id: genif.sh,v 1.6 1999-05-21 10:05:41 sas Exp $ +# $Id: genif.sh,v 1.7 1999-09-03 17:46:39 sas Exp $ # replacement for genif.pl infile="$1" @@ -16,16 +16,20 @@ fi module_ptrs="" includes="" +olddir=`pwd` +cd $srcdir + for ext in ${1+"$@"} ; do module_ptrs=" phpext_${ext}_ptr,\\\n$module_ptrs" - for pre in php3_ php_ php4_ zend_ "" ; do - hdrfile="ext/$ext/${pre}${ext}.h" - if test -f "$srcdir/$hdrfile" ; then - includes="#include \"$hdrfile\"\\\n$includes" + for header in ext/$ext/*.h ; do + if grep phpext_ $header >/dev/null 2>&1 ; then + includes="#include \"$header\"\\\n$includes" fi done done +cd $olddir + cat $infile | \ sed \ -e "s'@EXT_INCLUDE_CODE@'$includes'" \ diff --git a/main/SAPI.c b/main/SAPI.c index 87fe3dd902..be6a2d5bb3 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -75,11 +75,13 @@ SAPI_API void sapi_startup(sapi_module_struct *sf) #ifdef ZTS sapi_globals_id = ts_allocate_id(sizeof(sapi_globals_struct), NULL, NULL); #endif -} + module_global_startup_modules(); +} SAPI_API void sapi_shutdown() { + module_global_shutdown_modules(); zend_hash_destroy(&known_post_content_types); } diff --git a/main/internal_functions.c.in b/main/internal_functions.c.in index d63679b52d..4f3ec7fac2 100644 --- a/main/internal_functions.c.in +++ b/main/internal_functions.c.in @@ -80,7 +80,7 @@ zend_module_entry *php3_builtin_modules[] = { @EXT_MODULE_PTRS@ }; - + int module_startup_modules(void) { zend_module_entry **ptr = php3_builtin_modules, **end = ptr+(sizeof(php3_builtin_modules)/sizeof(zend_module_entry *)); @@ -96,6 +96,37 @@ int module_startup_modules(void) return SUCCESS; } +int module_global_startup_modules(void) +{ + zend_module_entry **ptr = php3_builtin_modules, **end = ptr+(sizeof(php3_builtin_modules)/sizeof(zend_module_entry *)); + + while (ptr < end) { + if (*ptr) { + if ((*ptr)->global_startup_func && + (*ptr)->global_startup_func()==FAILURE) { + return FAILURE; + } + } + ptr++; + } + return SUCCESS; +} + +int module_global_shutdown_modules(void) +{ + zend_module_entry **ptr = php3_builtin_modules, **end = ptr+(sizeof(php3_builtin_modules)/sizeof(zend_module_entry *)); + + while (ptr < end) { + if (*ptr) { + if ((*ptr)->global_shutdown_func && + (*ptr)->global_shutdown_func()==FAILURE) { + return FAILURE; + } + } + ptr++; + } + return SUCCESS; +} /* * Local variables: diff --git a/main/main.c b/main/main.c index ac95c88a13..f778212c07 100644 --- a/main/main.c +++ b/main/main.c @@ -325,7 +325,7 @@ PHPAPI int php_printf(const char *format,...) int size; va_start(args, format); - size = vsprintf(buffer, format, args); + size = vsnprintf(buffer, sizeof(buffer), format, args); ret = PHPWRITE(buffer, size); va_end(args); diff --git a/main/php.h b/main/php.h index 49966d2a9c..99746fb11f 100644 --- a/main/php.h +++ b/main/php.h @@ -259,12 +259,16 @@ extern int ap_vsnprintf(char *, size_t, const char *, va_list); #define PHP_RINIT(module) php3_rinit_##module #define PHP_RSHUTDOWN(module) php3_rshutdown_##module #define PHP_MINFO(module) php3_info_##module - -#define PHP_MINIT_FUNCTION(module) int php3_minit_##module(INIT_FUNC_ARGS) -#define PHP_MSHUTDOWN_FUNCTION(module) int php3_mshutdown_##module(SHUTDOWN_FUNC_ARGS) -#define PHP_RINIT_FUNCTION(module) int php3_rinit_##module(INIT_FUNC_ARGS) -#define PHP_RSHUTDOWN_FUNCTION(module) int php3_rshutdown_##module(SHUTDOWN_FUNC_ARGS) -#define PHP_MINFO_FUNCTION(module) void php3_info_##module(ZEND_MODULE_INFO_FUNC_ARGS) +#define PHP_GINIT(module) php3_ginit_##module +#define PHP_GSHUTDOWN(module) php3_gshutdown_##module + +#define PHP_MINIT_FUNCTION(module) int PHP_MINIT(module)(INIT_FUNC_ARGS) +#define PHP_MSHUTDOWN_FUNCTION(module) int PHP_MSHUTDOWN(module)(SHUTDOWN_FUNC_ARGS) +#define PHP_RINIT_FUNCTION(module) int PHP_RINIT(module)(INIT_FUNC_ARGS) +#define PHP_RSHUTDOWN_FUNCTION(module) int PHP_RSHUTDOWN(module)(SHUTDOWN_FUNC_ARGS) +#define PHP_MINFO_FUNCTION(module) void PHP_MINFO(module)(ZEND_MODULE_INFO_FUNC_ARGS) +#define PHP_GINIT_FUNCTION(module) static int PHP_GINIT(module)(void) +#define PHP_GSHUTDOWN_FUNCTION(module) static int PHP_GSHUTDOWN(module)(void) /* global variables */ |