On 04/14/2015 12:05 PM, Peter Krempa wrote: > Among all the monitor APIs some where checking if mon is NULL and some > were not. Since it's possible to have mon equal to NULL in case a second > call is attempted once entered the monitor. This requires that every > single API checks for the monitor. > > This patch adds a macro that helps checking the state of the monitor and > either refactors existing checking code to use the macro or adds it in > case it was missing. > --- > src/qemu/qemu_monitor.c | 918 +++++++++--------------------------------------- > src/qemu/qemu_monitor.h | 18 +- > 2 files changed, 174 insertions(+), 762 deletions(-) > > diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c > index d5bdfb8..e5630f1 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c > @@ -98,6 +98,32 @@ struct _qemuMonitor { > int logfd; > }; > > +/** > + * QEMU_CHECK_MONITOR_FULL: > + * @MON: monitor pointer variable to check, evaluated multiple times, no parentheses > + * @FORCE_JSON: force JSON monitor, true or false > + * @EXIT: statement that is used to exit the function > + * > + * This macro checks that the monitor is valid for given operation and exits > + * the function if not. The macro also adds a debug statement regarding the > + * monitor. > + */ > +#define QEMU_CHECK_MONITOR_FULL(MON, FORCE_JSON, EXIT) \ > + if (!MON) { \ > + virReportError(VIR_ERR_INVALID_ARG, "%s", \ > + _("Monitor must not be NULL")); \ > + EXIT; \ > + } \ > + VIR_DEBUG("Mon:%p vm:%p json:%d fd:%d", MON, MON->vm, MON->json, MON->fd); \ > + if (FORCE_JSON && !MON->json) { \ > + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", \ > + _("JSON monitor is required")); \ > + EXIT; \ > + } > + > +#define QEMU_CHECK_MONITOR(MON) QEMU_CHECK_MONITOR_FULL(MON, false, return -1) > +#define QEMU_CHECK_MONITOR_JSON(MON) QEMU_CHECK_MONITOR_FULL(MON, true, return -1) > + ... > @@ -1876,6 +1840,8 @@ qemuMonitorGetAllBlockStatsInfo(qemuMonitorPtr mon, > if (!(*ret_stats = virHashCreate(10, virHashValueFree))) > goto error; > > + QEMU_CHECK_MONITOR(mon); > + Leaks *ret_stats on failure Looks like you'll need to use the _FULL like other places > if (mon->json) { > ret = qemuMonitorJSONGetAllBlockStatsInfo(mon, *ret_stats, > backingChain); ... John -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list