Skip to content

Commit ff09d39

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Added suppot for glob() wildcard matching in ffi.preload directive Reverting push to wrong repo Update alloc patch
2 parents aacea14 + fea8c54 commit ff09d39

File tree

4 files changed

+99
-13
lines changed

4 files changed

+99
-13
lines changed

ext/ffi/ffi.c

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
#include <sys/stat.h>
3535
#include <fcntl.h>
3636

37+
#ifdef HAVE_GLOB
38+
#ifdef PHP_WIN32
39+
#include "win32/glob.h"
40+
#else
41+
#include <glob.h>
42+
#endif
43+
#endif
44+
3745
ZEND_DECLARE_MODULE_GLOBALS(ffi)
3846

3947
typedef enum _zend_ffi_tag_kind {
@@ -4713,26 +4721,81 @@ ZEND_INI_BEGIN()
47134721
STD_ZEND_INI_ENTRY("ffi.preload", NULL, ZEND_INI_SYSTEM, OnUpdateString, preload, zend_ffi_globals, ffi_globals)
47144722
ZEND_INI_END()
47154723

4724+
static int zend_ffi_preload_glob(const char *filename) /* {{{ */
4725+
{
4726+
#ifdef HAVE_GLOB
4727+
glob_t globbuf;
4728+
int ret;
4729+
unsigned int i;
4730+
4731+
memset(&globbuf, 0, sizeof(glob_t));
4732+
4733+
ret = glob(filename, 0, NULL, &globbuf);
4734+
#ifdef GLOB_NOMATCH
4735+
if (ret == GLOB_NOMATCH || !globbuf.gl_pathc) {
4736+
#else
4737+
if (!globbuf.gl_pathc) {
4738+
#endif
4739+
/* pass */
4740+
} else {
4741+
for(i=0 ; i<globbuf.gl_pathc; i++) {
4742+
zend_ffi *ffi = zend_ffi_load(globbuf.gl_pathv[i], 1);
4743+
if (!ffi) {
4744+
globfree(&globbuf);
4745+
return FAILURE;
4746+
}
4747+
efree(ffi);
4748+
}
4749+
globfree(&globbuf);
4750+
}
4751+
#else
4752+
zend_ffi *ffi = zend_ffi_load(filename, 1);
4753+
if (!ffi) {
4754+
return FAILURE;
4755+
}
4756+
efree(ffi);
4757+
#endif
4758+
4759+
return SUCCESS;
4760+
}
4761+
/* }}} */
4762+
47164763
static int zend_ffi_preload(char *preload) /* {{{ */
47174764
{
47184765
zend_ffi *ffi;
47194766
char *s = NULL, *e, *filename;
4767+
zend_bool is_glob = 0;
47204768

47214769
e = preload;
47224770
while (*e) {
47234771
switch (*e) {
47244772
case ZEND_PATHS_SEPARATOR:
47254773
if (s) {
47264774
filename = estrndup(s, e-s);
4727-
ffi = zend_ffi_load(filename, 1);
4728-
efree(filename);
4729-
if (!ffi) {
4730-
return FAILURE;
4731-
}
4732-
efree(ffi);
47334775
s = NULL;
4776+
if (!is_glob) {
4777+
ffi = zend_ffi_load(filename, 1);
4778+
efree(filename);
4779+
if (!ffi) {
4780+
return FAILURE;
4781+
}
4782+
efree(ffi);
4783+
} else {
4784+
int ret = zend_ffi_preload_glob(filename);
4785+
4786+
efree(filename);
4787+
if (ret != SUCCESS) {
4788+
return FAILURE;
4789+
}
4790+
is_glob = 0;
4791+
}
47344792
}
47354793
break;
4794+
case '*':
4795+
case '?':
4796+
case '[':
4797+
is_glob = 1;
4798+
break;
47364799
default:
47374800
if (!s) {
47384801
s = e;
@@ -4743,12 +4806,20 @@ static int zend_ffi_preload(char *preload) /* {{{ */
47434806
}
47444807
if (s) {
47454808
filename = estrndup(s, e-s);
4746-
ffi = zend_ffi_load(filename, 1);
4747-
efree(filename);
4748-
if (!ffi) {
4749-
return FAILURE;
4809+
if (!is_glob) {
4810+
ffi = zend_ffi_load(filename, 1);
4811+
efree(filename);
4812+
if (!ffi) {
4813+
return FAILURE;
4814+
}
4815+
efree(ffi);
4816+
} else {
4817+
int ret = zend_ffi_preload_glob(filename);
4818+
efree(filename);
4819+
if (ret != SUCCESS) {
4820+
return FAILURE;
4821+
}
47504822
}
4751-
efree(ffi);
47524823
}
47534824

47544825
return SUCCESS;

ext/ffi/tests/303.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
FFI 303: FFI preloading flob
3+
--SKIPIF--
4+
<?php require_once('skipif.inc'); ?>
5+
<?php if (substr(PHP_OS, 0, 3) == 'WIN') die('skip not for Windows'); ?>
6+
--INI--
7+
ffi.enable=1
8+
ffi.preload={PWD}/300*.h
9+
--FILE--
10+
<?php
11+
$ffi = FFI::scope("TEST_300");
12+
$ffi->printf("Hello World from %s!\n", "PHP");
13+
?>
14+
--EXPECT--
15+
Hello World from PHP!

php.ini-development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1916,5 +1916,5 @@ ldap.max_links = -1
19161916
; "true" - always enabled
19171917
;ffi.enable=preload
19181918

1919-
; List of headers files to preload
1919+
; List of headers files to preload, wilcards allowed.
19201920
;ffi.preload=

php.ini-production

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1918,5 +1918,5 @@ ldap.max_links = -1
19181918
; "true" - always enabled
19191919
;ffi.enable=preload
19201920

1921-
; List of headers files to preload
1921+
; List of headers files to preload, wilcards allowed.
19221922
;ffi.preload=

0 commit comments

Comments
 (0)