stas        2003/07/30 05:18:06

  Modified:    src/modules/perl mod_perl.c modperl_apache_includes.h
               .        Changes
  Log:
  perl 5.8.1 randomizes the hash seed, because we precalculate the hash
  values of mgv elements the hash seed has to be the same across all
  perl interpreters. So mod_perl now intercepts cases where perl would
  have randomize it, do the seed randomization by itself and tell perl
  to use that value.
  
  Revision  Changes    Path
  1.174     +71 -0     modperl-2.0/src/modules/perl/mod_perl.c
  
  Index: mod_perl.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
  retrieving revision 1.173
  retrieving revision 1.174
  diff -u -r1.173 -r1.174
  --- mod_perl.c        7 Jul 2003 03:06:14 -0000       1.173
  +++ mod_perl.c        30 Jul 2003 12:18:06 -0000      1.174
  @@ -9,6 +9,74 @@
   #define MP_IS_STARTING    (MP_init_status == 1 ? 1 : 0)
   #define MP_IS_RUNNING     (MP_init_status == 2 ? 1 : 0)
   
  +#if !(PERL_REVISION == 5 && ( PERL_VERSION < 8 || \
  +    (PERL_VERSION == 8 && PERL_SUBVERSION == 0))) && \
  +    (defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT))
  +#define MP_NEED_HASH_SEED_FIXUP
  +#endif
  +
  +
  +#ifdef MP_NEED_HASH_SEED_FIXUP
  +static UV   MP_init_hash_seed = 0;
  +static bool MP_init_hash_seed_set = FALSE;
  +#endif
  +
  +/* see modperl_hash_seed_set() */
  +static void modperl_hash_seed_init(apr_pool_t *p) 
  +{
  +#ifdef MP_NEED_HASH_SEED_FIXUP
  +    char *s;
  +
  +    /* check if there is a specific hash seed passed via the env var
  +     * and if that's the case -- use it */
  +    apr_status_t rv = apr_env_get(&s, "PERL_HASH_SEED", p);
  +    if (rv != APR_ENOTIMPL) {
  +        if (s) {
  +            while (isSPACE(*s)) s++;
  +        }
  +        if (s && isDIGIT(*s)) {
  +            MP_init_hash_seed = (UV)Atol(s); // XXX: Atoul()?
  +            MP_init_hash_seed_set = TRUE;
  +        }
  +    }
  +
  +    /* calculate our own random hash seed */
  +    if (!MP_init_hash_seed_set) {
  +        apr_uuid_t *uuid = (apr_uuid_t *)safemalloc(sizeof(apr_uuid_t));
  +        char buf[APR_UUID_FORMATTED_LENGTH + 1];
  +        int i;
  +
  +        apr_initialize();
  +        apr_uuid_get(uuid);
  +        apr_uuid_format(buf, uuid);
  +        /* fprintf(stderr, "UUID: %s\n", buf); */
  +
  +        /* XXX: need a better alg to convert uuid string into a seed */
  +        for (i=0; buf[i]; i++){
  +            MP_init_hash_seed += (UV)(i+1)*(buf[i]+MP_init_hash_seed);
  +        }
  +
  +        MP_init_hash_seed_set = TRUE;
  +    }
  +
  +    /* fprintf(stderr, "GOT SEED: %ld\n", MP_init_hash_seed); */
  +#endif
  +}
  +
  +/* before 5.8.1, perl was using HASH_SEED=0, starting from 5.8.1
  + * it randomizes if perl was compiled with ccflags -DUSE_HASH_SEED
  + * or -DUSE_HASH_SEED_EXPLICIT, in which case we need to tell perl
  + * to use the same seed everywhere */
  +static void modperl_hash_seed_set(pTHX) 
  +{
  +#ifdef MP_NEED_HASH_SEED_FIXUP
  +    if (MP_init_hash_seed_set) {
  +        PL_hash_seed_set = TRUE;
  +        PL_hash_seed = MP_init_hash_seed;
  +    }
  +#endif
  +}
  +
   #ifndef USE_ITHREADS
   static apr_status_t modperl_shutdown(void *data)
   {
  @@ -164,6 +232,8 @@
   
       perl_construct(perl);
   
  +    modperl_hash_seed_set(aTHX);
  +
       PL_perl_destruct_level = 2;
   
       MP_boot_data_set(p, s);
  @@ -510,6 +580,7 @@
       /* XXX: htf can we have PerlPreConfigHandler
        * without first configuring mod_perl ?
        */
  +    modperl_hash_seed_init(p);
   
       return OK;
   }
  
  
  
  1.24      +3 -0      modperl-2.0/src/modules/perl/modperl_apache_includes.h
  
  Index: modperl_apache_includes.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_apache_includes.h,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- modperl_apache_includes.h 24 Apr 2003 01:51:37 -0000      1.23
  +++ modperl_apache_includes.h 30 Jul 2003 12:18:06 -0000      1.24
  @@ -34,6 +34,9 @@
   #include "apr_buckets.h"
   #include "apr_time.h"
   #include "apr_network_io.h"
  +#include "apr_general.h"
  +#include "apr_uuid.h"
  +#include "apr_env.h"
   
   #include "util_filter.h"
   
  
  
  
  1.201     +6 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.200
  retrieving revision 1.201
  diff -u -r1.200 -r1.201
  --- Changes   29 Jul 2003 09:28:19 -0000      1.200
  +++ Changes   30 Jul 2003 12:18:06 -0000      1.201
  @@ -12,6 +12,12 @@
   
   =item 1.99_10-dev
   
  +perl 5.8.1 randomizes the hash seed, because we precalculate the hash
  +values of mgv elements the hash seed has to be the same across all
  +perl interpreters. So mod_perl now intercepts cases where perl would
  +have randomize it, do the seed randomization by itself and tell perl
  +to use that value. [Stas]
  +
   fix APR::PerlIO layer to pop itself if open() has failed. [Stas]
   
   move the definition of DEFINE='-DMP_HAVE_APR_LIBS' to the top level
  
  
  

Reply via email to