ID:               24693
 Updated by:       [EMAIL PROTECTED]
 Reported By:      chris_se at gmx dot net
-Status:           Wont fix
+Status:           Closed
 Bug Type:         Feature/Change Request
 Operating System: GNU/Linux
 PHP Version:      4.3.2
 New Comment:

This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.

This is now possible in PHP 5.0.


Previous Comments:
------------------------------------------------------------------------

[2003-07-19 06:52:47] chris_se at gmx dot net

> as there is no mechanism for ini_set to check whether output has
started

There is a mechanism: these OnUpdate*-functions. I added a function
OnUpdateTransSid which is essentially the OnUpdateBool function
definied within Zend/zend_ini.c but with an if-block in front of it, if
the session was already started. (the if-block was taken from another
OnUpdate-function that was in session.c)

It probably would be cleaner to call OnUpdateBool directly instead of
just copying the code, but as all those functions are defined by
precompiler macros, I assume the parameters of these functios could
change, so just copying the code from OnUpdateBool seems to be more
portable to me.

Here are my changes so far: (tested with PHP 4.3.2)

-----------------------------------------------------------------------
--- ext/session/session.c.old   2003-07-19 12:29:58.000000000 +0200
+++ ext/session/session.c       2003-07-19 13:46:33.000000000 +0200
@@ -105,6 +105,32 @@
        return SUCCESS;
 }
 
+static PHP_INI_MH(OnUpdateTransSid)
+{
+       if (PS(session_status) == php_session_active) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "A session is active.
You cannot change the session module's ini settings at this time.");
+               return FAILURE;
+       }
+
+       zend_bool *p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       p = (zend_bool *) (base+(size_t) mh_arg1);
+
+       if (strncasecmp("on", new_value, sizeof("on"))) {
+               *p = (zend_bool) atoi(new_value);
+       } else {
+               *p = (zend_bool) 1;
+       }
+       return SUCCESS;
+}
+
 static PHP_INI_MH(OnUpdateSerializer)
 {
        if (PS(session_status) == php_session_active) {
@@ -151,7 +177,7 @@
        STD_PHP_INI_ENTRY("session.entropy_length",     "0",        
PHP_INI_ALL, OnUpdateInt,    entropy_length,     php_ps_globals,   
ps_globals)
        STD_PHP_INI_ENTRY("session.cache_limiter",      "nocache",  
PHP_INI_ALL, OnUpdateString, cache_limiter,      php_ps_globals,   
ps_globals)
        STD_PHP_INI_ENTRY("session.cache_expire",       "180",      
PHP_INI_ALL, OnUpdateInt,    cache_expire,       php_ps_globals,   
ps_globals)
-       STD_PHP_INI_BOOLEAN("session.use_trans_sid",    "0",        
PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool,   use_trans_sid,     
php_ps_globals,    ps_globals)
+       STD_PHP_INI_BOOLEAN("session.use_trans_sid",    "0",        
PHP_INI_ALL, OnUpdateTransSid, use_trans_sid,      php_ps_globals,   
ps_globals)
 
        /* Commented out until future discussion */
        /* PHP_INI_ENTRY("session.encode_sources", "globals,track",
PHP_INI_ALL, NULL) */
-----------------------------------------------------------------------

------------------------------------------------------------------------

[2003-07-19 06:20:13] alan at akbkhome dot com

see  http://bugs.php.net/bug.php?id=14991 
- this wont really fix it

I agree it's a feature request - it would have to be a function like
session_use_transid(true|false) as there is no mechanism for ini_set to
check whether output has started...

------------------------------------------------------------------------

[2003-07-19 05:45:10] chris_se at gmx dot net

I tried to figure out myself how this could be solved. I just changed
the definition of session.use_trans_sid to PHP_INI_ALL and I recompiled
my PHP module.

Now, I can change session.use_trans_sid before session_start() is
called and it works fine.

Here's the 'patch' (against PHP 4.3.2):

---------------------------------------------------------
--- ext/session/session.c.old   2003-07-19 12:29:58.000000000 +0200
+++ ext/session/session.c       2003-07-19 12:34:31.000000000 +0200
@@ -151,7 +151,7 @@
        STD_PHP_INI_ENTRY("session.entropy_length",     "0",        
PHP_INI_ALL, OnUpdateInt,    entropy_length,     php_ps_globals,   
ps_globals)
        STD_PHP_INI_ENTRY("session.cache_limiter",      "nocache",  
PHP_INI_ALL, OnUpdateString, cache_limiter,      php_ps_globals,   
ps_globals)
        STD_PHP_INI_ENTRY("session.cache_expire",       "180",      
PHP_INI_ALL, OnUpdateInt,    cache_expire,       php_ps_globals,   
ps_globals)
-       STD_PHP_INI_BOOLEAN("session.use_trans_sid",    "0",        
PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool,   use_trans_sid,     
php_ps_globals,    ps_globals)
+       STD_PHP_INI_BOOLEAN("session.use_trans_sid",    "0",        
PHP_INI_ALL, OnUpdateBool,   use_trans_sid,      php_ps_globals,   
ps_globals)
 
        /* Commented out until future discussion */
        /* PHP_INI_ENTRY("session.encode_sources", "globals,track",
PHP_INI_ALL, NULL) */
---------------------------------------------------------

------------------------------------------------------------------------

[2003-07-18 09:39:27] chris_se at gmx dot net

Why is that so? In my eyes, the point that makes sense for the rewriter
to be started, is session_start().

Furthermore: If I kind of 'deactivate' the rewriter by ini_set
('url_rewriter.tags', ''); it also has effect on links that were
already sent to output:

---------------------------------------
<?php

session_start ();

?>
<a href="a.php">Test</a>
<?php
ini_set ('url_rewriter.tags', '');
?>
<a href="a.php">Test</a>
---------------------------------------

will generate:

<a href="a.php">Test</a>
<a href="a.php">Test</a>

whereas 

---------------------------------------
<?php

session_start ();

?>
<a href="a.php">Test</a>
<?php
// ini_set ('url_rewriter.tags', '');
?>
<a href="a.php">Test</a>
---------------------------------------

appends the session id to both links.

Therefore I don't quite understand why deactivating the rewriter before
session_start() is not possible whereas modifying it is even possible
after session_start() and even after output that has to be rewritten
was already generated.

------------------------------------------------------------------------

[2003-07-18 09:24:20] [EMAIL PROTECTED]

The decision to enable the rewriter is made before your script starts
running.
Once it has started it cannot be turned off again.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/24693

-- 
Edit this bug report at http://bugs.php.net/?id=24693&edit=1

Reply via email to