Handle typemap argument without a value
This now gives an error, previously SWIG segfaulted. Fixes #891
This commit is contained in:
parent
735fe4b60a
commit
aa24e6b22b
4 changed files with 29 additions and 10 deletions
|
|
@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.1.0 (in progress)
|
Version 4.1.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2022-03-02: olly
|
||||||
|
#891 Give error for typemap argument without a value. Previously
|
||||||
|
SWIG segfaulted.
|
||||||
|
|
||||||
2022-02-27: wsfulton
|
2022-02-27: wsfulton
|
||||||
[Python] #735 #1561 Function annotations containing C/C++ types are no longer
|
[Python] #735 #1561 Function annotations containing C/C++ types are no longer
|
||||||
generated when using the -py3 option. Function annotations support has been
|
generated when using the -py3 option. Function annotations support has been
|
||||||
|
|
|
||||||
6
Examples/test-suite/errors/swig_typemap_missing_value.i
Normal file
6
Examples/test-suite/errors/swig_typemap_missing_value.i
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
%module xxx
|
||||||
|
|
||||||
|
%typemap(in, numinputs=1, foo) int ""
|
||||||
|
|
||||||
|
/* SWIG segfaulted trying to use the above typemap in SWIG < 4.1.0. */
|
||||||
|
void func(int arg);
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
swig_typemap_missing_value.i:3: Error: %typemap argument 'foo' is missing value
|
||||||
|
|
@ -2723,26 +2723,34 @@ typemap_directive : TYPEMAP LPAREN typemap_type RPAREN tm_list stringbrace {
|
||||||
/* typemap method type (lang,method) or (method) */
|
/* typemap method type (lang,method) or (method) */
|
||||||
|
|
||||||
typemap_type : kwargs {
|
typemap_type : kwargs {
|
||||||
Hash *p;
|
String *name = Getattr($1, "name");
|
||||||
String *name;
|
Hash *p = nextSibling($1);
|
||||||
p = nextSibling($1);
|
|
||||||
if (p && (!Getattr(p,"value"))) {
|
if (p && (!Getattr(p,"value"))) {
|
||||||
/* this is the deprecated two argument typemap form */
|
/* this is the deprecated two argument typemap form */
|
||||||
Swig_warning(WARN_DEPRECATED_TYPEMAP_LANG,cparse_file, cparse_line,
|
Swig_warning(WARN_DEPRECATED_TYPEMAP_LANG,cparse_file, cparse_line,
|
||||||
"Specifying the language name in %%typemap is deprecated - use #ifdef SWIG<LANG> instead.\n");
|
"Specifying the language name in %%typemap is deprecated - use #ifdef SWIG<LANG> instead.\n");
|
||||||
/* two argument typemap form */
|
/* two argument typemap form */
|
||||||
name = Getattr($1,"name");
|
Printf(stdout, "name=%s typemap_lang=%s\n", name, typemap_lang);
|
||||||
if (!name || (Strcmp(name,typemap_lang))) {
|
if (!name || (Strcmp(name,typemap_lang))) {
|
||||||
$$.method = 0;
|
name = 0;
|
||||||
$$.kwargs = 0;
|
p = 0;
|
||||||
} else {
|
} else {
|
||||||
$$.method = Getattr(p,"name");
|
name = Getattr(p,"name");
|
||||||
$$.kwargs = nextSibling(p);
|
p = nextSibling(p);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* one-argument typemap-form */
|
/* one-argument typemap-form */
|
||||||
$$.method = Getattr($1,"name");
|
}
|
||||||
$$.kwargs = p;
|
$$.method = name;
|
||||||
|
$$.kwargs = p;
|
||||||
|
while (p) {
|
||||||
|
if (!Getattr(p, "value")) {
|
||||||
|
Swig_error(cparse_file, cparse_line,
|
||||||
|
"%%typemap argument '%s' is missing value\n", Getattr(p, "name"));
|
||||||
|
/* Set to empty value to avoid segfaults later. */
|
||||||
|
Setattr(p, "value", NewStringEmpty());
|
||||||
|
}
|
||||||
|
p = nextSibling(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue