[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/26] qapi: dealloc visitor, fix premature free and
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 06/26] qapi: dealloc visitor, fix premature free and iteration logic |
Date: |
Wed, 5 Oct 2011 10:21:51 -0300 |
From: Michael Roth <address@hidden>
Currently we do 3 things wrong:
1) The list iterator, in practice, is used in a manner where the pointer
we pass in is the same as the pointer we assign the output to from
visit_next_list(). This causes an infinite loop where we keep freeing
the same structures.
2) We attempt to free list->value rather than list. visit_type_<type>
handles this. We should only be concerned with the containing list.
3) We free prematurely: iterator function will continue accessing values
we've already freed.
This patch should fix all of these issues. QmpOutputVisitor also suffers
from 1).
Reviewed-by: Anthony Liguori <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
Signed-off-by: Luiz Capitulino <address@hidden>
---
qapi/qapi-dealloc-visitor.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
index f629061..6b586ad 100644
--- a/qapi/qapi-dealloc-visitor.c
+++ b/qapi/qapi-dealloc-visitor.c
@@ -26,6 +26,7 @@ struct QapiDeallocVisitor
{
Visitor visitor;
QTAILQ_HEAD(, StackEntry) stack;
+ bool is_list_head;
};
static QapiDeallocVisitor *to_qov(Visitor *v)
@@ -70,15 +71,24 @@ static void qapi_dealloc_end_struct(Visitor *v, Error
**errp)
static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp)
{
+ QapiDeallocVisitor *qov = to_qov(v);
+ qov->is_list_head = true;
}
-static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **list,
+static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp,
Error **errp)
{
- GenericList *retval = *list;
- g_free(retval->value);
- *list = retval->next;
- return retval;
+ GenericList *list = *listp;
+ QapiDeallocVisitor *qov = to_qov(v);
+
+ if (!qov->is_list_head) {
+ *listp = list->next;
+ g_free(list);
+ return *listp;
+ }
+
+ qov->is_list_head = false;
+ return list;
}
static void qapi_dealloc_end_list(Visitor *v, Error **errp)
--
1.7.7.rc0.72.g4b5ea
- [Qemu-devel] [PULL 00/26]: QMP queue, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 01/26] error: let error_is_type take a NULL error, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 02/26] qerror: add qerror_report_err(), Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 06/26] qapi: dealloc visitor, fix premature free and iteration logic,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 03/26] qapi: add code generation support for middle mode, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 08/26] qapi: add test cases for generated free functions, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 07/26] qapi: generate qapi_free_* functions for *List types, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 04/26] qapi: use middle mode in QMP server, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 05/26] qapi: fixup command generation for functions that return list types, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 11/26] qapi: Don't use c_var() on enum strings, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 12/26] qapi: Automatically generate a _MAX value for enums, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 09/26] qapi: dealloc visitor, support freeing of nested lists, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 13/26] qapi: convert query-name, Luiz Capitulino, 2011/10/05
- [Qemu-devel] [PATCH 10/26] qapi: modify visitor code generation for list iteration, Luiz Capitulino, 2011/10/05