36ac86c950
Update to rc4 of v2.9.0. Also includes a few other fixes, and a number of tweaks to the spec files. I'd be happy to answer any questions about all those spec file changes, I believe they were all in the direction of a more correct and maintainable spec file. Since this is still in rc phase, let's keep it in devel project. Final release should appear in time for Beta2 of SLE12SP3. Delta from previous: Added Alex's patch for keyboard empty event. OBS-URL: https://build.opensuse.org/request/show/487699 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=334
134 lines
4.1 KiB
Diff
134 lines
4.1 KiB
Diff
From 75fb607cbe540bcd522adf7ac69429d3faadb9ca Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Andreas=20F=C3=A4rber?= <afaerber@suse.de>
|
|
Date: Thu, 24 Sep 2015 19:21:11 +0200
|
|
Subject: [PATCH] string-input-visitor: Fix uint64 parsing
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
All integers would get parsed by strtoll(), not handling the case of
|
|
UINT64 properties with the most significient bit set.
|
|
|
|
Implement a .type_uint64 visitor callback, reusing the existing
|
|
parse_str() code through a new argument, using strtoull().
|
|
|
|
As this is a bug fix, it intentionally ignores checkpatch warnings to
|
|
prefer the use of qemu_strto[u]ll() over strto[u]ll().
|
|
|
|
Cc: qemu-stable@nongnu.org
|
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
---
|
|
qapi/string-input-visitor.c | 63 +++++++++++++++++++++++++++++++++++----------
|
|
1 file changed, 50 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
|
|
index c089491c24..fedbda7895 100644
|
|
--- a/qapi/string-input-visitor.c
|
|
+++ b/qapi/string-input-visitor.c
|
|
@@ -43,7 +43,8 @@ static void free_range(void *range, void *dummy)
|
|
g_free(range);
|
|
}
|
|
|
|
-static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|
+static int parse_str(StringInputVisitor *siv, const char *name, bool u64,
|
|
+ Error **errp)
|
|
{
|
|
char *str = (char *) siv->string;
|
|
long long start, end;
|
|
@@ -60,7 +61,11 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|
|
|
do {
|
|
errno = 0;
|
|
- start = strtoll(str, &endptr, 0);
|
|
+ if (u64) {
|
|
+ start = strtoull(str, &endptr, 0);
|
|
+ } else {
|
|
+ start = strtoll(str, &endptr, 0);
|
|
+ }
|
|
if (errno == 0 && endptr > str) {
|
|
if (*endptr == '\0') {
|
|
cur = g_malloc0(sizeof(*cur));
|
|
@@ -71,7 +76,11 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|
} else if (*endptr == '-') {
|
|
str = endptr + 1;
|
|
errno = 0;
|
|
- end = strtoll(str, &endptr, 0);
|
|
+ if (u64) {
|
|
+ end = strtoull(str, &endptr, 0);
|
|
+ } else {
|
|
+ end = strtoll(str, &endptr, 0);
|
|
+ }
|
|
if (errno == 0 && endptr > str && start <= end &&
|
|
(start > INT64_MAX - 65536 ||
|
|
end < start + 65536)) {
|
|
@@ -127,7 +136,7 @@ start_list(Visitor *v, const char *name, GenericList **list, size_t size,
|
|
assert(list);
|
|
siv->list = list;
|
|
|
|
- if (parse_str(siv, name, errp) < 0) {
|
|
+ if (parse_str(siv, name, false, errp) < 0) {
|
|
*list = NULL;
|
|
return;
|
|
}
|
|
@@ -215,7 +224,7 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
|
|
{
|
|
StringInputVisitor *siv = to_siv(v);
|
|
|
|
- if (parse_str(siv, name, errp) < 0) {
|
|
+ if (parse_str(siv, name, false, errp) < 0) {
|
|
return;
|
|
}
|
|
|
|
@@ -251,15 +260,43 @@ error:
|
|
static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
|
|
Error **errp)
|
|
{
|
|
- /* FIXME: parse_type_int64 mishandles values over INT64_MAX */
|
|
- int64_t i;
|
|
- Error *err = NULL;
|
|
- parse_type_int64(v, name, &i, &err);
|
|
- if (err) {
|
|
- error_propagate(errp, err);
|
|
- } else {
|
|
- *obj = i;
|
|
+ StringInputVisitor *siv = to_siv(v);
|
|
+
|
|
+ if (!siv->string) {
|
|
+ error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
|
|
+ "integer");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ parse_str(siv, name, true, errp);
|
|
+
|
|
+ if (!siv->ranges) {
|
|
+ goto error;
|
|
}
|
|
+
|
|
+ if (!siv->cur_range) {
|
|
+ Range *r;
|
|
+
|
|
+ siv->cur_range = g_list_first(siv->ranges);
|
|
+ if (!siv->cur_range) {
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ r = siv->cur_range->data;
|
|
+ if (!r) {
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ siv->cur = range_lob(r);
|
|
+ }
|
|
+
|
|
+ *obj = siv->cur;
|
|
+ siv->cur++;
|
|
+ return;
|
|
+
|
|
+error:
|
|
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name,
|
|
+ "a uint64 value or range");
|
|
}
|
|
|
|
static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
|