mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge remote-tracking branch 'origin/master' into phpng
Conflicts: Zend/zend_compile.h ext/openssl/xp_ssl.c
This commit is contained in:
commit
110bf9c720
17 changed files with 333 additions and 47 deletions
39
Zend/tests/bug66608.phpt
Normal file
39
Zend/tests/bug66608.phpt
Normal file
|
@ -0,0 +1,39 @@
|
|||
--TEST--
|
||||
Bug #66608 (Incorrect behavior with nested "finally" blocks)
|
||||
--FILE--
|
||||
<?php
|
||||
function bar() {
|
||||
try {
|
||||
echo "1\n";
|
||||
} finally {
|
||||
try {
|
||||
throw new Exception ("");
|
||||
} catch (Exception $ab) {
|
||||
echo "2\n";
|
||||
} finally {
|
||||
try {
|
||||
} finally {
|
||||
echo "3\n";
|
||||
try {
|
||||
} finally {
|
||||
}
|
||||
echo "4\n";
|
||||
}
|
||||
}
|
||||
echo "5\n";
|
||||
try {
|
||||
} finally {
|
||||
echo "6\n";
|
||||
}
|
||||
}
|
||||
echo "7\n";
|
||||
}
|
||||
bar();
|
||||
--EXPECT--
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
|
@ -840,6 +840,9 @@ int zend_add_literal(zend_op_array *op_array, zval *zv TSRMLS_DC);
|
|||
#define ZEND_FAST_RET_TO_CATCH 1
|
||||
#define ZEND_FAST_RET_TO_FINALLY 2
|
||||
|
||||
#define ZEND_FAST_CALL_FOR_CATCH 1
|
||||
#define ZEND_FAST_CALL_FOR_FINALLY 2
|
||||
|
||||
#define ZEND_ARRAY_ELEMENT_REF (1<<0)
|
||||
#define ZEND_ARRAY_NOT_PACKED (1<<1)
|
||||
#define ZEND_ARRAY_SIZE_SHIFT 2
|
||||
|
|
|
@ -509,7 +509,7 @@ static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num,
|
|||
SET_UNUSED(opline->op2);
|
||||
opline->op1.opline_num = op_array->try_catch_array[i].finally_op;
|
||||
if (op_array->try_catch_array[i].catch_op) {
|
||||
opline->extended_value = 1;
|
||||
opline->extended_value = ZEND_FAST_CALL_FOR_CATCH;
|
||||
opline->op2.opline_num = op_array->try_catch_array[i].catch_op;
|
||||
}
|
||||
|
||||
|
@ -574,6 +574,26 @@ static void zend_resolve_finally_ret(zend_op_array *op_array, zend_uint op_num T
|
|||
}
|
||||
}
|
||||
|
||||
static void zend_resolve_fast_call(zend_op_array *op_array, zend_uint op_num TSRMLS_DC)
|
||||
{
|
||||
int i;
|
||||
zend_uint finally_op_num = 0;
|
||||
|
||||
for (i = 0; i < op_array->last_try_catch; i++) {
|
||||
if (op_array->try_catch_array[i].finally_op > op_num) {
|
||||
break;
|
||||
}
|
||||
if (op_num < op_array->try_catch_array[i].finally_end) {
|
||||
finally_op_num = op_array->try_catch_array[i].finally_op;
|
||||
}
|
||||
}
|
||||
|
||||
if (finally_op_num) {
|
||||
op_array->opcodes[op_num].extended_value = ZEND_FAST_CALL_FOR_FINALLY;
|
||||
op_array->opcodes[op_num].op2.opline_num = finally_op_num - 2; /* it must be ZEND_FAST_CALL */
|
||||
}
|
||||
}
|
||||
|
||||
static void zend_resolve_finally_calls(zend_op_array *op_array TSRMLS_DC)
|
||||
{
|
||||
zend_uint i;
|
||||
|
@ -615,6 +635,9 @@ static void zend_resolve_finally_calls(zend_op_array *op_array TSRMLS_DC)
|
|||
case ZEND_JMP:
|
||||
zend_resolve_finally_call(op_array, i, opline->op1.opline_num TSRMLS_CC);
|
||||
break;
|
||||
case ZEND_FAST_CALL:
|
||||
zend_resolve_fast_call(op_array, i TSRMLS_CC);
|
||||
break;
|
||||
case ZEND_FAST_RET:
|
||||
zend_resolve_finally_ret(op_array, i TSRMLS_CC);
|
||||
break;
|
||||
|
|
|
@ -5757,13 +5757,13 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, ANY, ANY)
|
|||
{
|
||||
USE_OPLINE
|
||||
|
||||
if (opline->extended_value &&
|
||||
if ((opline->extended_value & ZEND_FAST_CALL_FOR_CATCH) &&
|
||||
UNEXPECTED(EG(prev_exception) != NULL)) {
|
||||
/* in case of unhandled exception jump to catch block instead of finally */
|
||||
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
|
||||
ZEND_VM_CONTINUE();
|
||||
}
|
||||
EX(fast_ret) = opline + 1;
|
||||
EX(fast_ret) = opline;
|
||||
EX(delayed_exception) = NULL;
|
||||
ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
|
||||
ZEND_VM_CONTINUE();
|
||||
|
@ -5772,7 +5772,10 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, ANY, ANY)
|
|||
ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, ANY)
|
||||
{
|
||||
if (EX(fast_ret)) {
|
||||
ZEND_VM_SET_OPCODE(EX(fast_ret));
|
||||
ZEND_VM_SET_OPCODE(EX(fast_ret) + 1);
|
||||
if ((EX(fast_ret)->extended_value & ZEND_FAST_CALL_FOR_FINALLY)) {
|
||||
EX(fast_ret) = &EX(func)->op_array.opcodes[EX(fast_ret)->op2.opline_num];
|
||||
}
|
||||
ZEND_VM_CONTINUE();
|
||||
} else {
|
||||
/* special case for unhandled exceptions */
|
||||
|
|
|
@ -1466,13 +1466,13 @@ static int ZEND_FASTCALL ZEND_FAST_CALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
|||
{
|
||||
USE_OPLINE
|
||||
|
||||
if (opline->extended_value &&
|
||||
if ((opline->extended_value & ZEND_FAST_CALL_FOR_CATCH) &&
|
||||
UNEXPECTED(EG(prev_exception) != NULL)) {
|
||||
/* in case of unhandled exception jump to catch block instead of finally */
|
||||
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
|
||||
ZEND_VM_CONTINUE();
|
||||
}
|
||||
EX(fast_ret) = opline + 1;
|
||||
EX(fast_ret) = opline;
|
||||
EX(delayed_exception) = NULL;
|
||||
ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
|
||||
ZEND_VM_CONTINUE();
|
||||
|
@ -1481,7 +1481,10 @@ static int ZEND_FASTCALL ZEND_FAST_CALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
|||
static int ZEND_FASTCALL ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
if (EX(fast_ret)) {
|
||||
ZEND_VM_SET_OPCODE(EX(fast_ret));
|
||||
ZEND_VM_SET_OPCODE(EX(fast_ret) + 1);
|
||||
if ((EX(fast_ret)->extended_value & ZEND_FAST_CALL_FOR_FINALLY)) {
|
||||
EX(fast_ret) = &EX(func)->op_array.opcodes[EX(fast_ret)->op2.opline_num];
|
||||
}
|
||||
ZEND_VM_CONTINUE();
|
||||
} else {
|
||||
/* special case for unhandled exceptions */
|
||||
|
|
|
@ -50,7 +50,11 @@ static inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i;
|
|||
int st = snprintf(s, len, "%lld", i); \
|
||||
s[st] = '\0'; \
|
||||
} while (0);
|
||||
#ifdef HAVE_ATOLL
|
||||
# define DATE_A64I(i, s) i = atoll(s)
|
||||
#else
|
||||
# define DATE_A64I(i, s) i = strtoll(s, NULL, 10)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* {{{ arginfo */
|
||||
|
|
|
@ -721,6 +721,10 @@ PHP_MINIT_FUNCTION(mysqli)
|
|||
REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, CONST_CS | CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_FOUND_ROWS", CLIENT_FOUND_ROWS, CONST_CS | CONST_PERSISTENT);
|
||||
#if (MYSQL_VERSION_ID >= 50611 && defined(CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS)) || defined(MYSQLI_USE_MYSQLND)
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS", CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS, CONST_CS | CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS", MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, CONST_CS | CONST_PERSISTENT);
|
||||
#endif
|
||||
|
||||
/* for mysqli_query */
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_STORE_RESULT", MYSQLI_STORE_RESULT, CONST_CS | CONST_PERSISTENT);
|
||||
|
@ -854,9 +858,6 @@ PHP_MINIT_FUNCTION(mysqli)
|
|||
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_BACKUP_LOG", REFRESH_BACKUP_LOG, CONST_CS | CONST_PERSISTENT);
|
||||
#endif
|
||||
|
||||
#if (MYSQL_VERSION_ID >= 50611 && defined(CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS)) || defined(MYSQLI_USE_MYSQLND)
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS", MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, CONST_CS | CONST_PERSISTENT);
|
||||
#endif
|
||||
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT", TRANS_START_WITH_CONSISTENT_SNAPSHOT, CONST_CS | CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("MYSQLI_TRANS_START_READ_WRITE", TRANS_START_READ_WRITE, CONST_CS | CONST_PERSISTENT);
|
||||
|
|
|
@ -196,6 +196,7 @@ require_once('skipifconnectfailure.inc');
|
|||
if (($IS_MYSQLND && version_compare(PHP_VERSION, ' 5.4.12-dev', '>=')) || (!$IS_MYSQLND && ($version > 50610))) {
|
||||
/* could be that MySQL/libmysql 5.6.9 had the flag already but it was no stable release */
|
||||
$expected_constants["MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true;
|
||||
$expected_constants["MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true;
|
||||
}
|
||||
|
||||
$unexpected_constants = array();
|
||||
|
|
|
@ -320,6 +320,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, simple_command_send_request)(MYSQLND_CONN_DATA
|
|||
DBG_ENTER("mysqlnd_conn_data::simple_command_send_request");
|
||||
DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent);
|
||||
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
|
||||
DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */
|
||||
|
||||
switch (CONN_GET_STATE(conn)) {
|
||||
case CONN_READY:
|
||||
|
@ -447,6 +448,31 @@ mysqlnd_switch_to_ssl_if_needed(
|
|||
const MYSQLND_CHARSET * charset;
|
||||
MYSQLND_PACKET_AUTH * auth_packet;
|
||||
DBG_ENTER("mysqlnd_switch_to_ssl_if_needed");
|
||||
DBG_INF_FMT("client_capability_flags=%lu", mysql_flags);
|
||||
DBG_INF_FMT("CLIENT_LONG_PASSWORD= %d", mysql_flags & CLIENT_LONG_PASSWORD? 1:0);
|
||||
DBG_INF_FMT("CLIENT_FOUND_ROWS= %d", mysql_flags & CLIENT_FOUND_ROWS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_LONG_FLAG= %d", mysql_flags & CLIENT_LONG_FLAG? 1:0);
|
||||
DBG_INF_FMT("CLIENT_NO_SCHEMA= %d", mysql_flags & CLIENT_NO_SCHEMA? 1:0);
|
||||
DBG_INF_FMT("CLIENT_COMPRESS= %d", mysql_flags & CLIENT_COMPRESS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_ODBC= %d", mysql_flags & CLIENT_ODBC? 1:0);
|
||||
DBG_INF_FMT("CLIENT_LOCAL_FILES= %d", mysql_flags & CLIENT_LOCAL_FILES? 1:0);
|
||||
DBG_INF_FMT("CLIENT_IGNORE_SPACE= %d", mysql_flags & CLIENT_IGNORE_SPACE? 1:0);
|
||||
DBG_INF_FMT("CLIENT_PROTOCOL_41= %d", mysql_flags & CLIENT_PROTOCOL_41? 1:0);
|
||||
DBG_INF_FMT("CLIENT_INTERACTIVE= %d", mysql_flags & CLIENT_INTERACTIVE? 1:0);
|
||||
DBG_INF_FMT("CLIENT_SSL= %d", mysql_flags & CLIENT_SSL? 1:0);
|
||||
DBG_INF_FMT("CLIENT_IGNORE_SIGPIPE= %d", mysql_flags & CLIENT_IGNORE_SIGPIPE? 1:0);
|
||||
DBG_INF_FMT("CLIENT_TRANSACTIONS= %d", mysql_flags & CLIENT_TRANSACTIONS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_RESERVED= %d", mysql_flags & CLIENT_RESERVED? 1:0);
|
||||
DBG_INF_FMT("CLIENT_SECURE_CONNECTION=%d", mysql_flags & CLIENT_SECURE_CONNECTION? 1:0);
|
||||
DBG_INF_FMT("CLIENT_MULTI_STATEMENTS=%d", mysql_flags & CLIENT_MULTI_STATEMENTS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_MULTI_RESULTS= %d", mysql_flags & CLIENT_MULTI_RESULTS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_PS_MULTI_RESULTS=%d", mysql_flags & CLIENT_PS_MULTI_RESULTS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_CONNECT_ATTRS= %d", mysql_flags & CLIENT_PLUGIN_AUTH? 1:0);
|
||||
DBG_INF_FMT("CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA= %d", mysql_flags & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA? 1:0);
|
||||
DBG_INF_FMT("CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS= %d", mysql_flags & CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS? 1:0);
|
||||
DBG_INF_FMT("CLIENT_SESSION_TRACK= %d", mysql_flags & CLIENT_SESSION_TRACK? 1:0);
|
||||
DBG_INF_FMT("CLIENT_SSL_VERIFY_SERVER_CERT= %d", mysql_flags & CLIENT_SSL_VERIFY_SERVER_CERT? 1:0);
|
||||
DBG_INF_FMT("CLIENT_REMEMBER_OPTIONS= %d", mysql_flags & CLIENT_REMEMBER_OPTIONS? 1:0);
|
||||
|
||||
auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC);
|
||||
if (!auth_packet) {
|
||||
|
@ -1862,6 +1888,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_close)(MYSQLND_CONN_DATA * const conn TSR
|
|||
enum_func_status ret = PASS;
|
||||
MYSQLND_NET * net = conn->net;
|
||||
php_stream * net_stream = net->data->m.get_stream(net TSRMLS_CC);
|
||||
enum mysqlnd_connection_state state;
|
||||
|
||||
DBG_ENTER("mysqlnd_send_close");
|
||||
DBG_INF_FMT("conn=%llu net->data->stream->abstract=%p", conn->thread_id, net_stream? net_stream->abstract:NULL);
|
||||
|
@ -1872,7 +1899,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_close)(MYSQLND_CONN_DATA * const conn TSR
|
|||
MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS);
|
||||
}
|
||||
}
|
||||
switch (CONN_GET_STATE(conn)) {
|
||||
state = CONN_GET_STATE(conn);
|
||||
DBG_INF_FMT("state=%u", state);
|
||||
switch (state) {
|
||||
case CONN_READY:
|
||||
DBG_INF("Connection clean, sending COM_QUIT");
|
||||
if (net_stream) {
|
||||
|
|
|
@ -100,7 +100,9 @@
|
|||
#define CLIENT_CONNECT_ATTRS (1UL << 20) /* Client supports connection attributes */
|
||||
#define CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA (1UL << 21) /* Enable authentication response packet to be larger than 255 bytes. */
|
||||
#define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22) /* Don't close the connection for a connection with expired password. */
|
||||
#define CLIENT_SESSION_TRACK (1UL << 23) /* Extended OK */
|
||||
#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30)
|
||||
#define CLIENT_REMEMBER_OPTIONS (1UL << 31)
|
||||
|
||||
#define MYSQLND_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | \
|
||||
CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | \
|
||||
|
@ -214,23 +216,23 @@ typedef enum mysqlnd_protocol_type
|
|||
|
||||
typedef enum mysqlnd_field_types
|
||||
{
|
||||
MYSQL_TYPE_DECIMAL,
|
||||
MYSQL_TYPE_TINY,
|
||||
MYSQL_TYPE_SHORT,
|
||||
MYSQL_TYPE_LONG,
|
||||
MYSQL_TYPE_FLOAT,
|
||||
MYSQL_TYPE_DOUBLE,
|
||||
MYSQL_TYPE_NULL,
|
||||
MYSQL_TYPE_TIMESTAMP,
|
||||
MYSQL_TYPE_LONGLONG,
|
||||
MYSQL_TYPE_INT24,
|
||||
MYSQL_TYPE_DATE,
|
||||
MYSQL_TYPE_TIME,
|
||||
MYSQL_TYPE_DATETIME,
|
||||
MYSQL_TYPE_YEAR,
|
||||
MYSQL_TYPE_NEWDATE,
|
||||
MYSQL_TYPE_VARCHAR,
|
||||
MYSQL_TYPE_BIT,
|
||||
MYSQL_TYPE_DECIMAL = 0,
|
||||
MYSQL_TYPE_TINY = 1,
|
||||
MYSQL_TYPE_SHORT = 2,
|
||||
MYSQL_TYPE_LONG = 3,
|
||||
MYSQL_TYPE_FLOAT = 4,
|
||||
MYSQL_TYPE_DOUBLE = 5,
|
||||
MYSQL_TYPE_NULL = 6,
|
||||
MYSQL_TYPE_TIMESTAMP= 7,
|
||||
MYSQL_TYPE_LONGLONG = 8,
|
||||
MYSQL_TYPE_INT24 = 9,
|
||||
MYSQL_TYPE_DATE = 10,
|
||||
MYSQL_TYPE_TIME = 11,
|
||||
MYSQL_TYPE_DATETIME = 12,
|
||||
MYSQL_TYPE_YEAR = 13,
|
||||
MYSQL_TYPE_NEWDATE = 14,
|
||||
MYSQL_TYPE_VARCHAR = 15,
|
||||
MYSQL_TYPE_BIT = 16,
|
||||
MYSQL_TYPE_NEWDECIMAL=246,
|
||||
MYSQL_TYPE_ENUM=247,
|
||||
MYSQL_TYPE_SET=248,
|
||||
|
@ -322,23 +324,23 @@ typedef enum mysqlnd_server_option
|
|||
typedef enum mysqlnd_connection_state
|
||||
{
|
||||
CONN_ALLOCED = 0,
|
||||
CONN_READY,
|
||||
CONN_QUERY_SENT,
|
||||
CONN_SENDING_LOAD_DATA,
|
||||
CONN_FETCHING_DATA,
|
||||
CONN_NEXT_RESULT_PENDING,
|
||||
CONN_QUIT_SENT /* object is "destroyed" at this stage */
|
||||
CONN_READY = 1,
|
||||
CONN_QUERY_SENT = 2,
|
||||
CONN_SENDING_LOAD_DATA = 3,
|
||||
CONN_FETCHING_DATA = 4,
|
||||
CONN_NEXT_RESULT_PENDING = 5,
|
||||
CONN_QUIT_SENT = 6 /* object is "destroyed" at this stage */
|
||||
} enum_mysqlnd_connection_state;
|
||||
|
||||
|
||||
typedef enum mysqlnd_stmt_state
|
||||
{
|
||||
MYSQLND_STMT_INITTED = 0,
|
||||
MYSQLND_STMT_PREPARED,
|
||||
MYSQLND_STMT_EXECUTED,
|
||||
MYSQLND_STMT_WAITING_USE_OR_STORE,
|
||||
MYSQLND_STMT_USE_OR_STORE_CALLED,
|
||||
MYSQLND_STMT_USER_FETCHING /* fetch_row_buff or fetch_row_unbuf */
|
||||
MYSQLND_STMT_PREPARED = 1,
|
||||
MYSQLND_STMT_EXECUTED = 2,
|
||||
MYSQLND_STMT_WAITING_USE_OR_STORE = 3,
|
||||
MYSQLND_STMT_USE_OR_STORE_CALLED = 4,
|
||||
MYSQLND_STMT_USER_FETCHING = 5/* fetch_row_buff or fetch_row_unbuf */
|
||||
} enum_mysqlnd_stmt_state;
|
||||
|
||||
|
||||
|
@ -596,9 +598,10 @@ enum php_mysqlnd_server_command
|
|||
COM_STMT_RESET = 26,
|
||||
COM_SET_OPTION = 27,
|
||||
COM_STMT_FETCH = 28,
|
||||
COM_DAEMON,
|
||||
COM_BINLOG_DUMP_GTID,
|
||||
COM_RESET_CONNECTION,
|
||||
COM_DAEMON = 29,
|
||||
COM_BINLOG_DUMP_GTID = 30,
|
||||
COM_RESET_CONNECTION = 31,
|
||||
COM_STMT_EXECUTE_BATCH = 32,
|
||||
COM_END
|
||||
};
|
||||
|
||||
|
|
|
@ -99,6 +99,7 @@ MYSQLND_METHOD(mysqlnd_net, network_write_ex)(MYSQLND_NET * const net, const zen
|
|||
{
|
||||
size_t ret;
|
||||
DBG_ENTER("mysqlnd_net::network_write_ex");
|
||||
DBG_INF_FMT("sending %u bytes", count);
|
||||
ret = php_stream_write(net->data->m.get_stream(net TSRMLS_CC), (char *)buffer, count);
|
||||
DBG_RETURN(ret);
|
||||
}
|
||||
|
@ -365,6 +366,10 @@ MYSQLND_METHOD(mysqlnd_net, send_ex)(MYSQLND_NET * const net, zend_uchar * const
|
|||
|
||||
do {
|
||||
to_be_sent = MIN(left, MYSQLND_MAX_PACKET_SIZE);
|
||||
DBG_INF_FMT("to_be_sent=%u", to_be_sent);
|
||||
DBG_INF_FMT("packets_sent=%u", packets_sent);
|
||||
DBG_INF_FMT("compressed_envelope_packet_no=%u", net->compressed_envelope_packet_no);
|
||||
DBG_INF_FMT("packet_no=%u", net->packet_no);
|
||||
#ifdef MYSQLND_COMPRESSION_ENABLED
|
||||
if (net->data->compressed == TRUE) {
|
||||
/* here we need to compress the data and then write it, first comes the compressed header */
|
||||
|
|
|
@ -1157,12 +1157,13 @@ static int set_server_specific_opts(php_stream *stream, SSL_CTX *ctx TSRMLS_DC)
|
|||
ssl_ctx_options |= SSL_OP_SINGLE_DH_USE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_ECDH
|
||||
if (NULL != (val = php_stream_context_get_option(
|
||||
stream->context, "ssl", "single_ecdh_use")) &&
|
||||
zend_is_true(val TSRMLS_CC)
|
||||
) {
|
||||
zend_is_true(val TSRMLS_CC)) {
|
||||
ssl_ctx_options |= SSL_OP_SINGLE_ECDH_USE;
|
||||
}
|
||||
#endif
|
||||
|
||||
SSL_CTX_set_options(ctx, ssl_ctx_options);
|
||||
|
||||
|
|
|
@ -904,7 +904,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
|
|||
}
|
||||
|
||||
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
|
||||
#ifdef HAVE_ATOLL
|
||||
max_file_size = atoll(value);
|
||||
#else
|
||||
max_file_size = strtoll(value, NULL, 10);
|
||||
#endif
|
||||
}
|
||||
|
||||
efree(param);
|
||||
|
|
|
@ -4,6 +4,8 @@ Bug #61605 (header_remove() does not remove all headers)
|
|||
<?php include "skipif.inc"; ?>
|
||||
--GET--
|
||||
foo=bar
|
||||
--INI--
|
||||
expose_php=On
|
||||
--FILE--
|
||||
<?php
|
||||
header("A: first");
|
||||
|
|
|
@ -6,6 +6,7 @@ MT="$(MT)"
|
|||
PHPSDK_DIR=$(PHP_DIR)
|
||||
PHPLIB=$(PHPSDK_DIR)\lib\$(PHPLIB)
|
||||
LDFLAGS=$(LDFLAGS) /libpath:"$(PHPSDK_DIR)\lib\;$(PHPSDK_DIR)"
|
||||
BUILD_DIR_DEV=$(PHPSDK_DIR)
|
||||
|
||||
all: $(EXT_TARGETS) $(PECL_TARGETS)
|
||||
|
||||
|
@ -33,3 +34,5 @@ _VC_MANIFEST_EMBED_EXE= if exist $@.manifest $(MT) -nologo -manifest $@.manifest
|
|||
_VC_MANIFEST_EMBED_DLL= if exist $@.manifest $(MT) -nologo -manifest $@.manifest -outputresource:$@;2
|
||||
!endif
|
||||
|
||||
install: build-headers build-bins
|
||||
|
||||
|
|
|
@ -1203,9 +1203,14 @@ function ADD_EXTENSION_DEP(extname, dependson, optional)
|
|||
ERROR("static " + extname + " cannot depend on shared " + dependson);
|
||||
}
|
||||
|
||||
ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");
|
||||
ADD_FLAG("LIBS_" + EXT, "php_" + dependson + ".lib");
|
||||
if (MODE_PHPIZE) {
|
||||
ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR_DEV)\\lib");
|
||||
ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR_DEV)\\lib\\php_" + dependson + ".lib");
|
||||
} else {
|
||||
ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");
|
||||
ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR)\\php_" + dependson + ".lib");
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -1356,6 +1361,12 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
|
|||
|
||||
DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_PHP) $(CFLAGS_' + EXT + ')');
|
||||
}
|
||||
if (MODE_PHPIZE && FSO.FileExists(PHP_DIR + "/include/main/config.pickle.h")) {
|
||||
cflags = "/FI main/config.pickle.h " + cflags;
|
||||
}
|
||||
if (MODE_PHPIZE && FSO.FileExists(PHP_DIR + "/include/main/config.pickle.h")) {
|
||||
cflags = "/FI main/config.pickle.h " + cflags;
|
||||
}
|
||||
ADD_FLAG("CFLAGS_" + EXT, cflags);
|
||||
|
||||
if (PHP_DSP != "no") {
|
||||
|
@ -1672,6 +1683,9 @@ function generate_files()
|
|||
generate_internal_functions();
|
||||
generate_config_h();
|
||||
generate_phpize();
|
||||
} else {
|
||||
generate_config_pickle_h();
|
||||
generate_ext_pickle();
|
||||
}
|
||||
STDOUT.WriteLine("Done.");
|
||||
STDOUT.WriteBlankLines(1);
|
||||
|
@ -1684,6 +1698,140 @@ function generate_files()
|
|||
}
|
||||
}
|
||||
|
||||
function generate_ext_pickle()
|
||||
{
|
||||
var content;
|
||||
var DEPS = null;
|
||||
var dest;
|
||||
var deps_lines = new Array();
|
||||
|
||||
var build_var_name = function(name) {
|
||||
return "PHP_" + name.toUpperCase();
|
||||
}
|
||||
|
||||
STDOUT.WriteLine("Generating pickle deps");
|
||||
dest = PHP_DIR + "/script/";
|
||||
|
||||
if (!FSO.FolderExists(dest)) {
|
||||
FSO.CreateFolder(dest);
|
||||
}
|
||||
|
||||
if (FSO.FileExists(dest + "/ext_pickle.js")) {
|
||||
DEPS = FSO.OpenTextFile(dest + "/ext_pickle.js", 1);
|
||||
|
||||
while (!DEPS.AtEndOfStream) {
|
||||
var ln = DEPS.ReadLine();
|
||||
var found = false;
|
||||
|
||||
for (var i in extensions_enabled) {
|
||||
var reg0 = new RegExp(build_var_name(extensions_enabled[i][0]) + "\s*=.+", "g");
|
||||
var reg1 = new RegExp(build_var_name(extensions_enabled[i][0]) + "_SHARED" + "\s*=.+", "g");
|
||||
|
||||
if (ln.match(reg1) || ln.match(reg0)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
deps_lines.push(ln);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var i in extensions_enabled) {
|
||||
deps_lines.push(build_var_name(extensions_enabled[i][0]) + "=true;");
|
||||
deps_lines.push(build_var_name(extensions_enabled[i][0]) + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";");
|
||||
}
|
||||
|
||||
if (!!DEPS) {
|
||||
DEPS.Close();
|
||||
DEPS = null;
|
||||
}
|
||||
|
||||
/* Replace the ext_pickle.js with the new content */
|
||||
DEPS = FSO.CreateTextFile(dest + "/ext_pickle.js", true);
|
||||
|
||||
for (var j in deps_lines) {
|
||||
DEPS.WriteLine(deps_lines[j]);
|
||||
}
|
||||
|
||||
DEPS.Close();
|
||||
}
|
||||
|
||||
function generate_config_pickle_h()
|
||||
{
|
||||
var outfile = null;
|
||||
var lines = new Array();
|
||||
var keys = (new VBArray(configure_hdr.Keys())).toArray();
|
||||
dest = PHP_DIR + "/include/main";
|
||||
|
||||
var ignore_key = function(key) {
|
||||
var ignores = [ "CONFIGURE_COMMAND", "PHP_COMPILER_ID", "COMPILER", "ARCHITECTURE", "HAVE_STRNLEN", "PHP_DIR" ];
|
||||
|
||||
for (var k in ignores) {
|
||||
if (ignores[k] == key) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
STDOUT.WriteLine("Generating main/config.pickle.h");
|
||||
|
||||
if (FSO.FileExists(dest + "/config.pickle.h")) {
|
||||
outfile = FSO.OpenTextFile(dest + "/config.pickle.h", 1);
|
||||
|
||||
while (!outfile.AtEndOfStream) {
|
||||
var found = false;
|
||||
var ln = outfile.ReadLine();
|
||||
|
||||
for (var i in keys) {
|
||||
var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g");
|
||||
|
||||
if (ln.match(reg)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
lines.push(ln);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var i in keys) {
|
||||
var item = configure_hdr.Item(keys[i]);
|
||||
|
||||
if (ignore_key(keys[i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* XXX fix comment handling */
|
||||
/*if (!lines[j].match(/^#define.+/g)) {
|
||||
continue;
|
||||
}*/
|
||||
|
||||
lines.push("#define " + keys[i] + " " + item[0]);
|
||||
}
|
||||
|
||||
if (outfile) {
|
||||
outfile.Close();
|
||||
outfile = null;
|
||||
}
|
||||
|
||||
outfile = FSO.CreateTextFile(dest + "/config.pickle.h", true);
|
||||
|
||||
for (var k in lines) {
|
||||
outfile.WriteLine(lines[k]);
|
||||
}
|
||||
|
||||
outfile.Close();
|
||||
}
|
||||
|
||||
function generate_config_h()
|
||||
{
|
||||
var infile, outfile;
|
||||
|
@ -1836,6 +1984,16 @@ function generate_makefile()
|
|||
}
|
||||
}
|
||||
MF.WriteLine(" @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(BUILD_DIR_DEV)\\include\\%D /y >nul");
|
||||
if (MODE_PHPIZE) {
|
||||
MF.WriteBlankLines(1);
|
||||
MF.WriteLine("build-bins:");
|
||||
for (var i in extensions_enabled) {
|
||||
var lib = "php_" + extensions_enabled[i][0] + ".lib";
|
||||
var dll = "php_" + extensions_enabled[i][0] + ".dll";
|
||||
MF.WriteLine(" @copy $(BUILD_DIR)\\" + lib + " $(BUILD_DIR_DEV)\\lib\\" + lib);
|
||||
//MF.WriteLine(" @copy $(BUILD_DIR)\\" + dll + " $(PHP_PREFIX)\\" + dll);
|
||||
}
|
||||
}
|
||||
TF.Close();
|
||||
|
||||
MF.WriteBlankLines(2);
|
||||
|
|
|
@ -208,8 +208,12 @@ STDOUT.WriteLine(PHP_DIR);
|
|||
C.WriteLine("/* This file automatically generated from script/confutils.js */");
|
||||
C.WriteLine("var MODE_PHPIZE = true;");
|
||||
C.WriteLine("var PHP_DIR = " + '"' + PHP_DIR.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"');
|
||||
C.WriteLine("var PHP_PREFIX = " + '"' + PHP_PREFIX.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"');
|
||||
|
||||
C.Write(file_get_contents(PHP_DIR + "//script//ext_deps.js"));
|
||||
if (FSO.FileExists(PHP_DIR + "/script/ext_pickle.js")) {
|
||||
C.Write(file_get_contents(PHP_DIR + "//script//ext_pickle.js"));
|
||||
}
|
||||
|
||||
C.Write(file_get_contents(PHP_DIR + "/script/confutils.js"));
|
||||
C.Write(file_get_contents(PHP_DIR + "/script/config.phpize.js"));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue