
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