summaryrefslogtreecommitdiff
path: root/ext/session
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2014-08-01 11:17:13 +0200
committerOndřej Surý <ondrej@sury.org>2014-08-01 11:17:13 +0200
commitb60f6e95a473d1ae97fdf20cec4cfefc06b24ec2 (patch)
treee92e8d3c102992bc63eae4327d3498e7203a9168 /ext/session
parent09ed144817606a3a835391b12455e6d9cb3a0ae2 (diff)
downloadphp-b60f6e95a473d1ae97fdf20cec4cfefc06b24ec2.tar.gz
New upstream version 5.6.0~rc3+dfsgupstream/5.6.0_rc3+dfsg
Diffstat (limited to 'ext/session')
-rw-r--r--ext/session/session.c25
-rw-r--r--ext/session/tests/bug66827.phpt12
2 files changed, 27 insertions, 10 deletions
diff --git a/ext/session/session.c b/ext/session/session.c
index 1d60c4018..d1a7a073a 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -301,7 +301,8 @@ PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY &&
- zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS
+ zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS &&
+ Z_TYPE_PP(token) == IS_STRING
) {
remote_addr = Z_STRVAL_PP(token);
}
@@ -1444,9 +1445,16 @@ PHPAPI const ps_serializer *_php_find_ps_serializer(char *name TSRMLS_DC) /* {{{
}
/* }}} */
-#define PPID2SID \
- convert_to_string((*ppid)); \
- PS(id) = estrndup(Z_STRVAL_PP(ppid), Z_STRLEN_PP(ppid))
+static void ppid2sid(zval **ppid TSRMLS_DC) {
+ if (Z_TYPE_PP(ppid) != IS_STRING) {
+ PS(id) = NULL;
+ PS(send_cookie) = 1;
+ } else {
+ convert_to_string((*ppid));
+ PS(id) = estrndup(Z_STRVAL_PP(ppid), Z_STRLEN_PP(ppid));
+ PS(send_cookie) = 0;
+ }
+}
PHPAPI void php_session_reset_id(TSRMLS_D) /* {{{ */
{
@@ -1540,9 +1548,8 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
- PPID2SID;
+ ppid2sid(ppid TSRMLS_CC);
PS(apply_trans_sid) = 0;
- PS(send_cookie) = 0;
PS(define_sid) = 0;
}
@@ -1551,8 +1558,7 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
- PPID2SID;
- PS(send_cookie) = 0;
+ ppid2sid(ppid TSRMLS_CC);
}
if (!PS(use_only_cookies) && !PS(id) &&
@@ -1560,8 +1566,7 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
- PPID2SID;
- PS(send_cookie) = 0;
+ ppid2sid(ppid TSRMLS_CC);
}
}
diff --git a/ext/session/tests/bug66827.phpt b/ext/session/tests/bug66827.phpt
new file mode 100644
index 000000000..4e1a4f7ae
--- /dev/null
+++ b/ext/session/tests/bug66827.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #66827: Session raises E_NOTICE when session name variable is array.
+--INI--
+--SKIPIF--
+<?php include('skipif.inc'); ?>
+--FILE--
+<?php
+$_COOKIE[session_name()] = array();
+session_start();
+echo 'OK';
+--EXPECTF--
+OK