[PATCH 4/4] virerror: Make virReportEnumRangeError() check for type mismatch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As can be seen from previous commits, it's fairly easy to pass a
different type to virReportEnumRangeError() than the actual
variable is of. So far, we have a sizeof() hack to check if some
nonsensical types are not passed, e.g. it catches cases where a
function name is passed instead of an enum. Extend the hack to
check whether proper enum was passed.

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
---
 src/util/virerror.h | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/util/virerror.h b/src/util/virerror.h
index ee85247433..d4b2679a09 100644
--- a/src/util/virerror.h
+++ b/src/util/virerror.h
@@ -161,16 +161,18 @@ void virReportSystemErrorFull(int domcode,
 #define virReportRestrictedError(...) \
     virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_OPERATION_DENIED, \
                          __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
-/* The sizeof(...) comparison here is a hack to catch typos
- * in the name of the enum by triggering a compile error, as well
- * as detecting if you passed a typename that refers to a function
- * or struct type, instead of an enum. It should get optimized away
- * since sizeof() is known at compile time  */
+/* The ternary operator here is a hack to catch typos in the name of
+ * the enum and mismatching enum by triggering a compile error, as
+ * well as detecting if you passed a typename that refers to a
+ * function or struct type, instead of an enum. It should get
+ * optimized away since the value is constant and thus is known at
+ * compile time.  */
 #define virReportEnumRangeError(typname, value) \
     virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INTERNAL_ERROR, \
                          __FILE__, __FUNCTION__, __LINE__, \
                          "Unexpected enum value %d for %s", \
-                         value, sizeof((typname)1) != 0 ? #typname : #typname);
+                         value, \
+                         (__typeof__(value))1 == (typname)1 && sizeof((typname)1) != 0 ? #typname : #typname)
 
 #define virReportError(code, ...) \
     virReportErrorHelper(VIR_FROM_THIS, code, __FILE__, \
-- 
2.41.0




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux