From: Peter Krempa <pkrempa@redhat.com> Replace the internals of the macro by a function so that 'virTypedParameterToString' doesn't need to be exported as it also adds mappings for values which don't exist in the public API. This change also prevents a NULL to be passed to string formatters in case when the caller sends an unknown typed parameter type as we now also make sure that the type is in range. Fixes: 54dd75fd97339dd49a54554e9327e5680c72132b Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 + src/util/virtypedparam.c | 25 +++++++++++++++++++++++++ src/util/virtypedparam.h | 11 +++++------ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cf0e71cc6a..9f02f74847 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3652,6 +3652,7 @@ virTPMSwtpmSetupFeatureTypeFromString; # util/virtypedparam.h +virTypedParamDebugstr; virTypedParameterAssign; virTypedParameterToString; virTypedParameterTypeFromString; diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index 6cfdd3276d..77c9279eff 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -1109,3 +1109,28 @@ virTypedParamListAddDouble(virTypedParamList *list, virTypedParamSetNameVPrintf(list, par, namefmt, ap); va_end(ap); } + + +/** + * virTypedParamDebugstr: + * @param: typed parameter + * + * Format @param into a string used for debug prints in public API handlers. + * This must make sure to work on unknown typed parameter types. + * + * Returns the formatted string; caller must free it. + */ +char * +virTypedParamDebugstr(virTypedParameterPtr param) +{ + g_autofree char *value = virTypedParameterToString(param); + int type = param->type; + + if (type < 0 || type > VIR_TYPED_PARAM_LAST) + type = 0; + + return g_strdup_printf("params[\"%s\"]=(%s)%s", + param->field, + virTypedParameterTypeToString(type), + NULLSTR(value)); +} diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h index c1fc28c612..3d6f6b999c 100644 --- a/src/util/virtypedparam.h +++ b/src/util/virtypedparam.h @@ -140,18 +140,17 @@ virTypedParamsSerialize(virTypedParameterPtr params, VIR_ENUM_DECL(virTypedParameter); +char * +virTypedParamDebugstr(virTypedParameterPtr param); + #define VIR_TYPED_PARAMS_DEBUG(params, nparams) \ do { \ int _i; \ if (!params) \ break; \ for (_i = 0; _i < (nparams); _i++) { \ - char *_value = virTypedParameterToString((params) + _i); \ - VIR_DEBUG("params[\"%s\"]=(%s)%s", \ - (params)[_i].field, \ - virTypedParameterTypeToString((params)[_i].type), \ - NULLSTR(_value)); \ - VIR_FREE(_value); \ + g_autofree char *_debugstr = virTypedParamDebugstr((params) + _i); \ + VIR_DEBUG("%s", _debugstr); \ } \ } while (0) -- 2.54.0