Skip to content

fix for PHP 8.0.0beta3 #474

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed

Conversation

remicollet
Copy link
Contributor

@remicollet
Copy link
Contributor Author

Tested with 8.0.0RC1, still OK.

@VBart VBart self-assigned this Sep 30, 2020
@VBart
Copy link
Contributor

VBart commented Oct 6, 2020

Thanks for the PR, but it's not going to work right as the value string isn't null-terminated, while zend_disable_functions() expects null-termination.

Here's a proper fix (also fixes functional tests):

# HG changeset patch
# User Valentin Bartenev <[email protected]>
# Date 1601997125 -10800
#      Tue Oct 06 18:12:05 2020 +0300
# Node ID 24effdc72044e594525906987618fd4c4e83ab8c
# Parent  94c6b5bbf3fcb5f1951f7f3b12effc482c583773
PHP: compatibility with 8.0.0 RC1.

This closes #474 PR on GitHub.

diff --git a/src/nxt_php_sapi.c b/src/nxt_php_sapi.c
--- a/src/nxt_php_sapi.c
+++ b/src/nxt_php_sapi.c
@@ -88,6 +88,9 @@ static void nxt_php_set_options(nxt_task
     int type);
 static nxt_int_t nxt_php_alter_option(nxt_str_t *name, nxt_str_t *value,
     int type);
+#ifdef NXT_PHP8
+static void nxt_php_disable_functions(nxt_str_t *str);
+#endif
 static void nxt_php_disable(nxt_task_t *task, const char *type,
     nxt_str_t *value, char **ptr, nxt_php_disable_t disable);
 
@@ -589,9 +592,13 @@ nxt_php_set_options(nxt_task_t *task, nx
             }
 
             if (nxt_str_eq(&name, "disable_functions", 17)) {
+#ifdef NXT_PHP8
+                nxt_php_disable_functions(&value);
+#else
                 nxt_php_disable(task, "function", &value,
                                 &PG(disable_functions),
                                 zend_disable_function);
+#endif
                 continue;
             }
 
@@ -680,6 +687,29 @@ nxt_php_alter_option(nxt_str_t *name, nx
 #endif
 
 
+#ifdef NXT_PHP8
+
+static void
+nxt_php_disable_functions(nxt_str_t *str)
+{
+    char  *p;
+
+    p = nxt_malloc(str->length + 1);
+    if (nxt_slow_path(p == NULL)) {
+        return;
+    }
+
+    nxt_memcpy(p, str->start, str->length);
+    p[str->length] = '\0';
+
+    zend_disable_functions(p);
+
+    nxt_free(p);
+}
+
+#endif
+
+
 static void
 nxt_php_disable(nxt_task_t *task, const char *type, nxt_str_t *value,
     char **ptr, nxt_php_disable_t disable)
diff --git a/test/php/get_variables/index.php b/test/php/get_variables/index.php
--- a/test/php/get_variables/index.php
+++ b/test/php/get_variables/index.php
@@ -1,7 +1,7 @@
 <?php
 header('Content-Length: 0');
 header('X-Var-1: ' . $_GET['var1']);
-header('X-Var-2: ' . $_GET['var2'] . isset($_GET['var2']));
-header('X-Var-3: ' . $_GET['var3'] . isset($_GET['var3']));
-header('X-Var-4: ' . $_GET['var4'] . isset($_GET['var4']));
+header('X-Var-2: ' . (isset($_GET['var2']) ? $_GET['var2'] : 'not set'));
+header('X-Var-3: ' . (isset($_GET['var3']) ? $_GET['var3'] : 'not set'));
+header('X-Var-4: ' . (isset($_GET['var4']) ? $_GET['var4'] : 'not set'));
 ?>
diff --git a/test/php/post_variables/index.php b/test/php/post_variables/index.php
--- a/test/php/post_variables/index.php
+++ b/test/php/post_variables/index.php
@@ -1,6 +1,6 @@
 <?php
 header('Content-Length: 0');
 header('X-Var-1: ' . $_POST['var1']);
-header('X-Var-2: ' . $_POST['var2'] . isset($_POST['var2']));
-header('X-Var-3: ' . $_POST['var3'] . isset($_POST['var3']));
+header('X-Var-2: ' . (isset($_POST['var2']) ? $_POST['var2'] : 'not set'));
+header('X-Var-3: ' . (isset($_POST['var3']) ? $_POST['var3'] : 'not set'));
 ?>
diff --git a/test/test_php_application.py b/test/test_php_application.py
--- a/test/test_php_application.py
+++ b/test/test_php_application.py
@@ -197,9 +197,9 @@ class TestPHPApplication(TestApplication
 
         resp = self.get(url='/?var1=val1&var2=&var3')
         assert resp['headers']['X-Var-1'] == 'val1', 'GET variables'
-        assert resp['headers']['X-Var-2'] == '1', 'GET variables 2'
-        assert resp['headers']['X-Var-3'] == '1', 'GET variables 3'
-        assert resp['headers']['X-Var-4'] == '', 'GET variables 4'
+        assert resp['headers']['X-Var-2'] == '', 'GET variables 2'
+        assert resp['headers']['X-Var-3'] == '', 'GET variables 3'
+        assert resp['headers']['X-Var-4'] == 'not set', 'GET variables 4'
 
     def test_php_application_post_variables(self):
         self.load('post_variables')
@@ -213,8 +213,8 @@ class TestPHPApplication(TestApplication
             body='var1=val1&var2=',
         )
         assert resp['headers']['X-Var-1'] == 'val1', 'POST variables'
-        assert resp['headers']['X-Var-2'] == '1', 'POST variables 2'
-        assert resp['headers']['X-Var-3'] == '', 'POST variables 3'
+        assert resp['headers']['X-Var-2'] == '', 'POST variables 2'
+        assert resp['headers']['X-Var-3'] == 'not set', 'POST variables 3'
 
     def test_php_application_cookies(self):
         self.load('cookies')

@remicollet remicollet deleted the issue-php8b3 branch October 9, 2020 06:49
@khs1994
Copy link

khs1994 commented May 9, 2021

-o build/src/nxt_php_sapi-php81.o src/nxt_php_sapi.c
src/nxt_php_sapi.c: In function 'nxt_php_execute':
src/nxt_php_sapi.c:1079:26: error: assignment to 'zend_string *' {aka 'struct _zend_string *'} from incompatible pointer type 'char *' [-Werror=incompatible-pointer-types]
 1079 |     file_handle.filename = (char *) ctx->script_filename.start;
      |                          ^
cc1: all warnings being treated as errors

build with php-src master meet error

@khs1994
Copy link

khs1994 commented May 9, 2021

@remicollet

@VBart
Copy link
Contributor

VBart commented May 20, 2021

@khs1994 try this patch:

diff --git a/src/nxt_php_sapi.c b/src/nxt_php_sapi.c
--- a/src/nxt_php_sapi.c
+++ b/src/nxt_php_sapi.c
@@ -1101,10 +1101,20 @@ nxt_php_execute(nxt_php_run_ctx_t *ctx, 
     nxt_memzero(&file_handle, sizeof(file_handle));
 
     file_handle.type = ZEND_HANDLE_FILENAME;
+#if (PHP_VERSION_ID >= 80100)
+    file_handle.filename = zend_string_init((char *) ctx->script_filename.start,
+                                            ctx->script_filename.length, 0);
+    file_handle.primary_script = 1;
+#else
     file_handle.filename = (char *) ctx->script_filename.start;
+#endif
 
     php_execute_script(&file_handle TSRMLS_CC);
 
+#if (PHP_VERSION_ID >= 80100)
+    zend_destroy_file_handle(&file_handle);
+#endif
+
     /* Prevention of consuming possible unread request body. */
 #if (PHP_VERSION_ID < 50600)
     read_post = sapi_module.read_post;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants