php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #72269
Patch htscanner_php7.0.patch revision 2016-07-03 10:11 UTC by roel at abittechnical dot com
revision 2016-07-02 21:32 UTC by roel at abittechnical dot com
revision 2016-07-02 14:02 UTC by roel at abittechnical dot com
revision 2016-06-05 20:51 UTC by roel at abittechnical dot com
revision 2016-06-05 20:37 UTC by roel at abittechnical dot com
revision 2016-05-31 20:14 UTC by roel at abittechnical dot com

Patch htscanner_php7.0.patch for htscanner Bug #72269

Patch version 2016-06-05 20:37 UTC

Return to Bug #72269 | Download this patch
This patch is obsolete

Obsoleted by patches:

This patch renders other patches obsolete

Obsolete patches:

Patch Revisions:

Developer: roel@abittechnical.com

diff --git a/htscanner.c b/htscanner.c
index 55bc68b..9490afb 100644
--- a/htscanner.c
+++ b/htscanner.c
@@ -147,18 +147,39 @@ static int value_hnd(char *name, char *value, int flag, int mode, HashTable *ini
 #endif
 #if PHP_VERSION_ID < 50204
 	if (zend_alter_ini_entry(name, name_len + 1, value, value_len, mode, PHP_INI_STAGE_RUNTIME) == FAILURE) {
-#else
+#elif PHP_VERSION_ID < 70000
 	if (zend_alter_ini_entry(name, name_len + 1, value, value_len, mode, PHP_INI_STAGE_HTACCESS) == FAILURE) {
+#else
+	zend_string *zname, *zvalue;
+	zname = zend_string_init(name, name_len, 0);
+	zvalue = zend_string_init(value, value_len, 0);
+	int res = zend_alter_ini_entry(zname, zvalue, mode, PHP_INI_STAGE_HTACCESS);
+	if (res == FAILURE) {
 #endif
 		htscanner_debug("zend_alter_ini_entry failed!");
 		if (HTG(verbose)) {
 			zend_error(E_WARNING, "Adding option (Name: '%s' Value: '%s') (%lu, %lu) failed!\n", name, value, name_len, value_len);
 		}
+#if PHP_VERSION_ID >= 70000
+		zend_string_release(zname);
+		zend_string_release(zvalue);
+#endif
 		return FAILURE;
 	}
 
+#if PHP_VERSION_ID < 70000
 	if (ini_entries)
 		zend_hash_update(ini_entries, name, name_len + 1, value, value_len + 1, NULL);
+#else
+	zval zval_value;
+	ZVAL_STR(&zval_value, zvalue);
+
+	if (ini_entries)
+		zend_hash_update(ini_entries, zname, &zval_value);
+
+	zend_string_release(zname);
+	zend_string_release(zvalue);
+#endif
 
 	return SUCCESS;
 }
@@ -186,7 +207,11 @@ static void parse_config_file(char *file, HashTable *ini_entries TSRMLS_DC)
 	}
 #endif
 
+#if PHP_VERSION_ID < 70000
 	stream = php_stream_open_wrapper(file, "rb", IGNORE_URL | ENFORCE_SAFE_MODE, NULL);
+#else
+	stream = php_stream_open_wrapper(file, "rb", IGNORE_URL, NULL);
+#endif
 	if (stream != NULL) {
 		char buf[FILE_BUFFER], *bufp, *tok, *value;
 		int flag, parse = 1;
@@ -259,7 +284,7 @@ ZEND_GET_MODULE(htscanner)
 PHP_INI_BEGIN()
 	STD_PHP_INI_ENTRY("htscanner.config_file", ".htaccess", PHP_INI_SYSTEM, OnUpdateString, config_file, zend_htscanner_globals, htscanner_globals)
 	STD_PHP_INI_ENTRY("htscanner.default_docroot", "/", PHP_INI_SYSTEM, OnUpdateString, default_docroot, zend_htscanner_globals, htscanner_globals)
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0)
+#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) || PHP_MAJOR_VERSION >= 7
 	STD_PHP_INI_ENTRY("htscanner.default_ttl", "300", PHP_INI_SYSTEM, OnUpdateLong, default_ttl, zend_htscanner_globals, htscanner_globals)
 	STD_PHP_INI_ENTRY("htscanner.stop_on_error", "0", PHP_INI_SYSTEM, OnUpdateLong, stop_on_error, zend_htscanner_globals, htscanner_globals)
 	STD_PHP_INI_ENTRY("htscanner.verbose", "0", PHP_INI_SYSTEM, OnUpdateLong, verbose, zend_htscanner_globals, htscanner_globals)
@@ -274,18 +299,29 @@ PHP_INI_END()
 htscannerMutexDeclare(ini_entries_cache_mutex);
 static HashTable *ini_entries_cache = NULL;
 
+#if PHP_VERSION_ID < 70000
 static void ini_cache_entry_dtor(htscanner_cache_entry *entry) /* {{{ */
 {
 	zend_hash_destroy(entry->ini_entries);
-	free(entry->ini_entries);
+	efree(entry->ini_entries);
+}
+/* }}} */
+#else
+static void ini_cache_entry_dtor(zval *zentry) /* {{{ */
+{
+	htscanner_cache_entry *entry = Z_PTR_P(zentry);
+	zend_hash_destroy(entry->ini_entries);
+	efree(entry->ini_entries);
+	efree(entry);
 }
 /* }}} */
+#endif
 
 static int php_htscanner_create_cache() /* {{{ */
 {
 	htscannerMutexSetup(ini_entries_cache_mutex);
 
-	ini_entries_cache = malloc(sizeof(HashTable));
+	ini_entries_cache = emalloc(sizeof(HashTable));
 	if (!ini_entries_cache) {
 		return FAILURE;
 	}
@@ -347,26 +383,48 @@ static int htscanner_main(TSRMLS_D) /* {{{ */
 #endif
 
 	htscannerMutexLock(ini_entries_cache_mutex);
+#if PHP_VERSION_ID < 70000
 	if (zend_hash_find(ini_entries_cache, cwd, cwd_len, (void**)&entry_fetched) == SUCCESS) {
+#else
+	entry_fetched = zend_hash_str_find_ptr(ini_entries_cache, cwd, cwd_len);
+	if (entry_fetched != NULL) {
+#endif
 		/* fetch cache and assign */
 		if ((unsigned int)(t - entry_fetched->created_on) < HTG(default_ttl)) {
+#if PHP_VERSION_ID < 70000
 			char *value, *name;
-			HashPosition pos;
 			uint len;
+#else
+			zend_string *name;
+			zval *value;
+#endif
+			HashPosition pos;
 			ulong num;
 
 			zend_hash_internal_pointer_reset_ex(entry_fetched->ini_entries, &pos);
 
+#if PHP_VERSION_ID < 70000
 			while (SUCCESS == zend_hash_get_current_data_ex(entry_fetched->ini_entries, (void**)&value, &pos)) {
 				zend_hash_get_current_key_ex(entry_fetched->ini_entries, &name, &len, &num, 0, &pos);
 				htscanner_debug("setting: %s = %s (cache hit)", name, value);
+#else
+			while ((value = zend_hash_get_current_data_ex(entry_fetched->ini_entries, &pos))) {
+				zend_hash_get_current_key_ex(entry_fetched->ini_entries, &name, &num, &pos);
+				htscanner_debug("setting: %s = %s (cache hit)", name, Z_STRVAL_P(value));
+#endif
 #if PHP_VERSION_ID < 50204
 				if (zend_alter_ini_entry(name, len, value, strlen(value), PHP_INI_PERDIR, PHP_INI_STAGE_PHP_INI_STAGE_RUNTIME) == FAILURE) {
-#else
+#elif PHP_VERSION_ID < 70000
 				if (zend_alter_ini_entry(name, len, value, strlen(value), PHP_INI_PERDIR, PHP_INI_STAGE_HTACCESS) == FAILURE) {
+#else
+				if (zend_alter_ini_entry(name, Z_STR_P(value), PHP_INI_PERDIR, PHP_INI_STAGE_HTACCESS) == FAILURE) {
 #endif
 					char msg[1024];
+#if PHP_VERSION_ID < 70000
 					snprintf(msg, sizeof (msg), "Adding option from cache (Name: '%s' Value: '%s') failed!\n", name, value);
+#else
+					snprintf(msg, sizeof (msg), "Adding option from cache (Name: '%s' Value: '%s') failed!\n", name->val, Z_STR_P(value));
+#endif
 					htscannerMutexUnlock(ini_entries_cache_mutex);
 					RETURN_FAILURE(msg);
 				}
@@ -380,7 +438,7 @@ static int htscanner_main(TSRMLS_D) /* {{{ */
 	/* parse, insert, assign */
 	if (HTG(default_ttl)) {
 		entry.created_on = t;
-		entry.ini_entries = ini_entries = malloc(sizeof(HashTable));
+		entry.ini_entries = ini_entries = emalloc(sizeof(HashTable));
 		if (ini_entries)
 			zend_hash_init(ini_entries, 0, NULL, NULL, 1);
 	}
@@ -405,8 +463,13 @@ static int htscanner_main(TSRMLS_D) /* {{{ */
 		}
 	}
 
+#if PHP_VERSION_ID < 70000
 	if (ini_entries)
 		zend_hash_update(ini_entries_cache, cwd, cwd_len, &entry, sizeof(htscanner_cache_entry), NULL);
+#else
+	if (ini_entries)
+		zend_hash_str_update_mem(ini_entries_cache, cwd, cwd_len, &entry, sizeof(htscanner_cache_entry));
+#endif
 	htscannerMutexUnlock(ini_entries_cache_mutex);
 
 	return SUCCESS;
@@ -451,7 +514,7 @@ static PHP_MSHUTDOWN_FUNCTION(htscanner) /* {{{ */
 	if (ini_entries_cache) {
 		htscannerMutexLock(ini_entries_cache_mutex);
 		zend_hash_destroy(ini_entries_cache);
-		free(ini_entries_cache);
+		efree(ini_entries_cache);
 		htscannerMutexShutdown(ini_entries_cache_mutex);
 	}
 
 
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Sat Dec 04 08:03:38 2021 UTC