[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v2 1/9] error: auto propagated local_err
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[RFC v2 1/9] error: auto propagated local_err |
Date: |
Mon, 23 Sep 2019 19:12:23 +0300 |
Here is introduced ERRP_FUNCTION_BEGIN macro, to be used at start of
any function with errp parameter.
It has three goals:
1. Fix issue with error_fatal & error_append_hint: user can't see these
hints, because exit() happens in error_setg earlier than hint is
appended. [Reported by Greg Kurz]
2. Fix issue with error_abort & error_propagate: when we wrap
error_abort by local_err+error_propagate, resulting coredump will
refer to error_propagate and not to the place where error happened.
(the macro itself don't fix the issue, but it allows to [3.] drop all
local_err+error_propagate pattern, which will definitely fix the issue)
[Reported by Kevin Wolf]
3. Drop local_err+error_propagate pattern, which is used to workaround
void functions with errp parameter, when caller wants to know resulting
status. (Note: actually these functions should be merely updated to
return int error code).
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
include/qapi/error.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/qapi/error.h b/include/qapi/error.h
index 3f95141a01..f6f4fa0fac 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -322,6 +322,43 @@ void error_set_internal(Error **errp,
ErrorClass err_class, const char *fmt, ...)
GCC_FMT_ATTR(6, 7);
+typedef struct ErrorPropagator {
+ Error *local_err;
+ Error **errp;
+} ErrorPropagator;
+
+static inline void error_propagator_cleanup(ErrorPropagator *prop)
+{
+ error_propagate(prop->errp, prop->local_err);
+}
+
+G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(ErrorPropagator, error_propagator_cleanup);
+
+/*
+ * ERRP_FUNCTION_BEGIN
+ *
+ * This macro MUST be the first line of EACH function with Error **errp
+ * parameter.
+ *
+ * If errp is NULL or points to error_fatal, it is rewritten to point to
+ * local Error object, which will be automatically propagated to original
+ * errp on function exit (see error_propagator_cleanup).
+ *
+ * After invocation of this macro it is always safe to dereference errp
+ * (as it's not NULL anymore) and to append hint (by error_append_hint)
+ * (as, if it was error_fatal, we swapped it by local_error to be
+ * propagated on cleanup).
+ *
+ * Note: we don't wrap error_abort case, as we want resulting coredump
+ * to point to the place where the error happened, not to error_propagate.
+ */
+#define ERRP_FUNCTION_BEGIN() \
+g_auto(ErrorPropagator) __auto_errp_prop = {.errp = errp}; \
+Error **__local_errp_unused __attribute__ ((unused)) = \
+ (errp = (errp == NULL || *errp == error_fatal ? \
+ &__auto_errp_prop.local_err : errp))
+
+
/*
* Special error destination to abort on error.
* See error_setg() and error_propagate() for details.
--
2.21.0
- [RFC v2 0/9] error: auto propagated local_err, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 5/9] net/net: fix local variable shadowing in net_client_init, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 7/9] Use auto-propagated errp, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 2/9] qapi/error: add (Error **errp) cleaning APIs, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 1/9] error: auto propagated local_err,
Vladimir Sementsov-Ogievskiy <=
- [RFC v2 3/9] errp: rename errp to errp_in where it is IN-argument, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 9/9] fix-compilation: includes, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 8/9] fix-compilation: empty goto, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 6/9] scripts: add coccinelle script to use auto propagated errp, Vladimir Sementsov-Ogievskiy, 2019/09/23
- [RFC v2 4/9] hw/core/loader-fit: fix freeing errp in fit_load_fdt, Vladimir Sementsov-Ogievskiy, 2019/09/23