In some places in we put an error into a local Error*, but forget to check for failure and pass it back to the caller. Add a Coccinelle patch to catch and automatically add the missing code.
Inspired-by: Peter Maydell <peter.mayd...@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- v3: Fixed typo 'provides', let prototype return 'void' (eblake) --- .../add-missing-error_propagate.cocci | 30 +++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 31 insertions(+) create mode 100644 scripts/coccinelle/add-missing-error_propagate.cocci diff --git a/scripts/coccinelle/add-missing-error_propagate.cocci b/scripts/coccinelle/add-missing-error_propagate.cocci new file mode 100644 index 0000000000..4b82e40418 --- /dev/null +++ b/scripts/coccinelle/add-missing-error_propagate.cocci @@ -0,0 +1,30 @@ +// Add missing error-propagation code where caller provides a Error* argument +// +// Copyright: (C) 2020 Philippe Mathieu-Daudé +// This work is licensed under the terms of the GNU GPLv2 or later. +// +// spatch \ +// --macro-file scripts/cocci-macro-file.h --include-headers \ +// --sp-file scripts/coccinelle/add-missing-error_propagate.cocci \ +// --keep-comments --in-place +// +// Inspired by https://www.mail-archive.com/qemu-devel@nongnu.org/msg691638.html + + +@ add_missing_error_propagate @ +typedef Error; +Error *local_err; +identifier func, errp, errfunc1, errfunc2; +@@ +void func(..., Error **errp) +{ + <... + errfunc1(..., &local_err); ++ if (local_err) { ++ error_propagate(errp, local_err); ++ return; ++ } + ... when != local_err + errfunc2(..., &local_err); + ...> +} diff --git a/MAINTAINERS b/MAINTAINERS index 54e05ecbdf..f996e72780 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2054,6 +2054,7 @@ F: include/qemu/error-report.h F: qapi/error.json F: util/error.c F: util/qemu-error.c +F: scripts/coccinelle/add-missing-error_propagate.cocci F: scripts/coccinelle/err-bad-newline.cocci F: scripts/coccinelle/error-use-after-free.cocci F: scripts/coccinelle/error_propagate_null.cocci -- 2.21.1