Skip to content

Commit

Permalink
Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not d…
Browse files Browse the repository at this point in the history
…efined)
  • Loading branch information
dstogov committed Sep 15, 2021
1 parent b053192 commit 0badc7d
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
4 changes: 4 additions & 0 deletions NEWS
Expand Up @@ -6,6 +6,10 @@ PHP NEWS
. Fixed bug #81433 (DOMElement::setIdAttribute() called twice may remove ID).
(Viktor Volkov)

- FFI:
. Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not
defined). (Dmitry)

- PCRE:
. Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb)

Expand Down
2 changes: 1 addition & 1 deletion ext/ffi/ffi.g
Expand Up @@ -147,7 +147,7 @@ declaration_specifiers(zend_ffi_dcl *dcl):

specifier_qualifier_list(zend_ffi_dcl *dcl):
"__extension__"?
( ?{sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)}
( ?{sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text) || (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) == 0}
( type_specifier(dcl)
| type_qualifier(dcl)
| attributes(dcl)
Expand Down
2 changes: 1 addition & 1 deletion ext/ffi/ffi_parser.c
Expand Up @@ -2190,7 +2190,7 @@ static int parse_specifier_qualifier_list(int sym, zend_ffi_dcl *dcl) {
} else {
yy_error_sym("unexpected", sym);
}
} while ((YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)));
} while ((YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text) || (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) == 0));
return sym;
}

Expand Down
35 changes: 35 additions & 0 deletions ext/ffi/tests/bug79576.phpt
@@ -0,0 +1,35 @@
--TEST--
Bug #79576 ("TYPE *" shows unhelpful message when type is not defined)
--SKIPIF--
<?php
if (!extension_loaded('ffi')) die('skip ffi extension not available');
if (PHP_DEBUG || getenv('SKIP_ASAN')) echo "xfail: FFI cleanup after parser error is nor implemented";
?>
--FILE--
<?php
try {
FFI::cdef('struct tree *get_tree(const oid *, size_t, struct tree *);');
} catch (Throwable $e) {
echo get_class($e) . ": " . $e->getMessage()."\n";
}
try {
FFI::cdef('struct tree *get_tree(oid, size_t, struct tree *);');
} catch (Throwable $e) {
echo get_class($e) . ": " . $e->getMessage()."\n";
}
try {
FFI::cdef('
typedef struct _simple_struct {
const some_not_declared_type **property;
} simple_struct;
');
} catch (Throwable $e) {
echo get_class($e) . ": " . $e->getMessage()."\n";
}
?>
DONE
--EXPECT--
FFI\ParserException: undefined C type 'oid' at line 1
FFI\ParserException: undefined C type 'oid' at line 1
FFI\ParserException: undefined C type 'some_not_declared_type' at line 3
DONE

0 comments on commit 0badc7d

Please sign in to comment.