]> granicus.if.org Git - php/commitdiff
- add global startup/shutdown handlers
authorSascha Schumann <sas@php.net>
Fri, 3 Sep 1999 17:46:39 +0000 (17:46 +0000)
committerSascha Schumann <sas@php.net>
Fri, 3 Sep 1999 17:46:39 +0000 (17:46 +0000)
- 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

ChangeLog
acinclude.m4
ext/session/config.m4
ext/session/mod_mm.c
ext/session/mod_mm.h
ext/session/session.c
genif.sh
main/SAPI.c
main/internal_functions.c.in
main/main.c
main/php.h

index 4ae9e9f08e0a88c2deec14bd0eb4dbc241c89f8c..9847a675a5538362a8aeeb37ff6eefdceb42cde6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index b8e80403da7e998c23c082c2910c756962160deb..dac362130402853ed0d982f4a6553ffa4c1aee6b 100644 (file)
@@ -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)
index a85c321f24b9d82b3272a0d6e06a9f8a20d054a8..ac39c53cf415ce2fab71ec6d9ba0b407e8ee70d7 100644 (file)
@@ -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)
index 5361dc38ff34e634d4e603f241b00018a09ee3ca..41b82ecf620f1d617db224db99afa0edb220a8c9 100644 (file)
 #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
index e3cfe2db1f66c5876169741526ba0c404bb28bb0..69d9a7d3e193cfe6a98b35a9da7b4af87b3bf6a9 100644 (file)
 
 #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
 
index 873a4b0247d0794625ebb931e6d195e51a2df71e..0157868a5b3d4dcf173382687fc9a99020b18654 100644 (file)
@@ -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);
        }
 
index 09194b774122cd3cfc52d23d2940eba2d0dd1045..4c182ec67ea26bf73a4d728e1ca949cc40bd5ee7 100644 (file)
--- a/genif.sh
+++ b/genif.sh
@@ -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'" \
index 87fe3dd902ae69326ae237f79eb78e979b4817c3..be6a2d5bb3a7f60028d9462592030e0e6e764fd3 100644 (file)
@@ -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);
 }
 
index d63679b52d12c2f2a12cc07605ba5b4d8b135d81..4f3ec7fac24924e0c95a5d885ae7da9defeef587 100644 (file)
@@ -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:
index ac95c88a13f606bce8b17ec6f2cb46817d49d435..f778212c0776e423e4cff6c9fc94ff89f87fd412 100644 (file)
@@ -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);
        
index 49966d2a9cda78a3494029f3db5463081c2d285a..99746fb11fda035e7382f492ba2ec78391aee816 100644 (file)
@@ -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 */