From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069154382438.44757889909044; Tue, 14 Feb 2017 02:45:54 -0800 (PST) Received: from localhost ([::1]:33795 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdacK-0007I0-JP for importer@patchew.org; Tue, 14 Feb 2017 05:45:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38728) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qd-GY for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJL-0003L7-Co for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36694) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJL-0003KV-3z for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:15 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D3F128047B for ; Tue, 14 Feb 2017 10:26:14 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQDoL003915 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:14 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 7FA2111384AC; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:48 +0100 Message-Id: <1487067971-10443-2-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 14 Feb 2017 10:26:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 01/24] tests/test-qemu-opts: Cover qemu_opts_parse() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The new tests demonstrate a few bugs, all clearly marked. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-qemu-opts.c | 294 +++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 292 insertions(+), 2 deletions(-) diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index a505a3e..f4426bb 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -8,6 +8,7 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/cutils.h" #include "qapi/error.h" #include "qapi/qmp/qstring.h" #include "qemu/config-file.h" @@ -29,6 +30,9 @@ static QemuOptsList opts_list_01 =3D { },{ .name =3D "number1", .type =3D QEMU_OPT_NUMBER, + },{ + .name =3D "number2", + .type =3D QEMU_OPT_NUMBER, }, { /* end of list */ } }, @@ -42,14 +46,23 @@ static QemuOptsList opts_list_02 =3D { .name =3D "str1", .type =3D QEMU_OPT_STRING, },{ + .name =3D "str2", + .type =3D QEMU_OPT_STRING, + },{ .name =3D "bool1", .type =3D QEMU_OPT_BOOL, },{ - .name =3D "str2", - .type =3D QEMU_OPT_STRING, + .name =3D "bool2", + .type =3D QEMU_OPT_BOOL, },{ .name =3D "size1", .type =3D QEMU_OPT_SIZE, + },{ + .name =3D "size2", + .type =3D QEMU_OPT_SIZE, + },{ + .name =3D "size3", + .type =3D QEMU_OPT_SIZE, }, { /* end of list */ } }, @@ -57,6 +70,7 @@ static QemuOptsList opts_list_02 =3D { =20 static QemuOptsList opts_list_03 =3D { .name =3D "opts_list_03", + .implied_opt_name =3D "implied", .head =3D QTAILQ_HEAD_INITIALIZER(opts_list_03.head), .desc =3D { /* no elements =3D> accept any params */ @@ -421,6 +435,278 @@ static void test_qemu_opts_set(void) g_assert(opts =3D=3D NULL); } =20 +static int opts_count_iter(void *opaque, const char *name, const char *val= ue, + Error **errp) +{ + (*(size_t *)opaque)++; + return 0; +} + +static size_t opts_count(QemuOpts *opts) +{ + size_t n =3D 0; + + qemu_opt_foreach(opts, opts_count_iter, &n, NULL); + return n; +} + +static void test_opts_parse(void) +{ + Error *err =3D NULL; + QemuOpts *opts; + char long_key[129]; + char *params; + + /* Nothing */ + opts =3D qemu_opts_parse(&opts_list_03, "", false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 0); + + /* Empty key */ + opts =3D qemu_opts_parse(&opts_list_03, "=3Dval", false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpstr(qemu_opt_get(opts, ""), =3D=3D, "val"); + + /* Long key */ + memset(long_key, 'a', 127); + long_key[127] =3D 'z'; + long_key[128] =3D 0; + params =3D g_strdup_printf("%s=3Dv", long_key); + opts =3D qemu_opts_parse(&opts_list_03, params + 1, NULL, &error_abort= ); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpstr(qemu_opt_get(opts, long_key + 1), =3D=3D, "v"); + + /* Overlong key gets truncated */ + opts =3D qemu_opts_parse(&opts_list_03, params, NULL, &error_abort); + g_assert(opts_count(opts) =3D=3D 1); + long_key[127] =3D 0; + g_assert_cmpstr(qemu_opt_get(opts, long_key), =3D=3D, "v"); + g_free(params); + + /* Multiple keys, last one wins */ + opts =3D qemu_opts_parse(&opts_list_03, "a=3D1,b=3D2,,x,a=3D3", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 3); + g_assert_cmpstr(qemu_opt_get(opts, "a"), =3D=3D, "3"); + g_assert_cmpstr(qemu_opt_get(opts, "b"), =3D=3D, "2,x"); + + /* Except when it doesn't */ + opts =3D qemu_opts_parse(&opts_list_03, "id=3Dfoo,id=3Dbar", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 0); + g_assert_cmpstr(qemu_opts_id(opts), =3D=3D, "foo"); + + /* Implied value */ + opts =3D qemu_opts_parse(&opts_list_03, "an,noaus,noaus=3D", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 3); + g_assert_cmpstr(qemu_opt_get(opts, "an"), =3D=3D, "on"); + g_assert_cmpstr(qemu_opt_get(opts, "aus"), =3D=3D, "off"); + g_assert_cmpstr(qemu_opt_get(opts, "noaus"), =3D=3D, ""); + + /* Implied key */ + opts =3D qemu_opts_parse(&opts_list_03, "an,noaus,noaus=3D", true, + &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 3); + g_assert_cmpstr(qemu_opt_get(opts, "implied"), =3D=3D, "an"); + g_assert_cmpstr(qemu_opt_get(opts, "aus"), =3D=3D, "off"); + g_assert_cmpstr(qemu_opt_get(opts, "noaus"), =3D=3D, ""); + + /* Trailing comma is ignored */ + opts =3D qemu_opts_parse(&opts_list_03, "x=3Dy,", false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpstr(qemu_opt_get(opts, "x"), =3D=3D, "y"); + + /* Except when it isn't */ + opts =3D qemu_opts_parse(&opts_list_03, ",", false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpstr(qemu_opt_get(opts, ""), =3D=3D, "on"); + + /* Duplicate ID */ + opts =3D qemu_opts_parse(&opts_list_03, "x=3Dy,id=3Dfoo", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + /* TODO Cover .merge_lists =3D true */ + + /* Buggy ID recognition */ + opts =3D qemu_opts_parse(&opts_list_03, "x=3D,,id=3Dbar", false, &erro= r_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpstr(qemu_opts_id(opts), =3D=3D, "bar"); /* BUG */ + g_assert_cmpstr(qemu_opt_get(opts, "x"), =3D=3D, ",id=3Dbar"); + + /* Anti-social ID */ + opts =3D qemu_opts_parse(&opts_list_01, "id=3D666", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + + /* Unknown key */ + opts =3D qemu_opts_parse(&opts_list_01, "nonexistent=3D", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + + qemu_opts_reset(&opts_list_01); + qemu_opts_reset(&opts_list_03); +} + +static void test_opts_parse_bool(void) +{ + Error *err =3D NULL; + QemuOpts *opts; + + opts =3D qemu_opts_parse(&opts_list_02, "bool1=3Don,bool2=3Doff", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert(qemu_opt_get_bool(opts, "bool1", false)); + g_assert(!qemu_opt_get_bool(opts, "bool2", true)); + + opts =3D qemu_opts_parse(&opts_list_02, "bool1=3Doffer", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + + qemu_opts_reset(&opts_list_02); +} + +static void test_opts_parse_number(void) +{ + Error *err =3D NULL; + QemuOpts *opts; + + /* Lower limit zero */ + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D0", false, &error_a= bort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, 0); + + /* Upper limit 2^64-1 */ + opts =3D qemu_opts_parse(&opts_list_01, + "number1=3D18446744073709551615,number2=3D-1", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, UINT= 64_MAX); + g_assert_cmpuint(qemu_opt_get_number(opts, "number2", 0), =3D=3D, UINT= 64_MAX); + + /* Above upper limit */ + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D1844674407370955161= 6", + false, &error_abort); + /* BUG: should reject */ + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, UINT= 64_MAX); + + /* Below lower limit */ + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D-184467440737095516= 16", + false, &error_abort); + /* BUG: should reject */ + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, UINT= 64_MAX); + + /* Hex and octal */ + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D0x2a,number2=3D052", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, 42); + g_assert_cmpuint(qemu_opt_get_number(opts, "number2", 0), =3D=3D, 42); + + /* Trailing crap */ + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D3.14", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + opts =3D qemu_opts_parse(&opts_list_01, "number1=3D08", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + + qemu_opts_reset(&opts_list_01); +} + +static void test_opts_parse_size(void) +{ + Error *err =3D NULL; + QemuOpts *opts; + + /* Lower limit zero */ + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D0", false, &error_abo= rt); + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 0); + + /* Note: precision is 53 bits since we're parsing with strtod() */ + + /* Around limit of precision: 2^53-1, 2^53, 2^54 */ + opts =3D qemu_opts_parse(&opts_list_02, + "size1=3D9007199254740991," + "size2=3D9007199254740992," + "size3=3D9007199254740993", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 3); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), + =3D=3D, 0x1fffffffffffff); + g_assert_cmpuint(qemu_opt_get_size(opts, "size2", 1), + =3D=3D, 0x20000000000000); + g_assert_cmpuint(qemu_opt_get_size(opts, "size3", 1), + =3D=3D, 0x20000000000000); + + /* Close to signed upper limit 0x7ffffffffffffc00 (53 msbs set) */ + opts =3D qemu_opts_parse(&opts_list_02, + "size1=3D9223372036854774784," /* 7ffffffffffff= c00 */ + "size2=3D9223372036854775295", /* 7ffffffffffff= dff */ + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), + =3D=3D, 0x7ffffffffffffc00); + g_assert_cmpuint(qemu_opt_get_size(opts, "size2", 1), + =3D=3D, 0x7ffffffffffffc00); + + /* Close to actual upper limit 0xfffffffffffff800 (53 msbs set) */ + opts =3D qemu_opts_parse(&opts_list_02, + "size1=3D18446744073709549568," /* ffffffffffff= f800 */ + "size2=3D18446744073709550591", /* ffffffffffff= fbff */ + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), + =3D=3D, 0xfffffffffffff800); + g_assert_cmpuint(qemu_opt_get_size(opts, "size2", 1), + =3D=3D, 0xfffffffffffff800); + + /* Above upper limit */ + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D-1", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + opts =3D qemu_opts_parse(&opts_list_02, + "size1=3D18446744073709550592", /* ffffffffffff= fc00 */ + false, &error_abort); + /* BUG: should reject */ + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 0); + + /* Suffixes */ + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D8b,size2=3D1.5k,size3= =3D2M", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 3); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 0), =3D=3D, 8); + g_assert_cmpuint(qemu_opt_get_size(opts, "size2", 0), =3D=3D, 1536); + g_assert_cmpuint(qemu_opt_get_size(opts, "size3", 0), =3D=3D, 2 * M_BY= TE); + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D0.1G,size2=3D16777215= T", + false, &error_abort); + g_assert_cmpuint(opts_count(opts), =3D=3D, 2); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 0), =3D=3D, G_BYTE /= 10); + g_assert_cmpuint(qemu_opt_get_size(opts, "size2", 0), + =3D=3D, 16777215 * T_BYTE); + + /* Beyond limit with suffix */ + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16777216T", + false, &error_abort); + /* BUG: should reject */ + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 0); + + /* Trailing crap */ + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16E", false, &err); + error_free_or_abort(&err); + g_assert(!opts); + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16Gi", false, &error_= abort); + /* BUG: should reject */ + g_assert_cmpuint(opts_count(opts), =3D=3D, 1); + g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 16 * G_B= YTE); + + qemu_opts_reset(&opts_list_02); +} + int main(int argc, char *argv[]) { register_opts(); @@ -435,6 +721,10 @@ int main(int argc, char *argv[]) g_test_add_func("/qemu-opts/opt_unset", test_qemu_opt_unset); g_test_add_func("/qemu-opts/opts_reset", test_qemu_opts_reset); g_test_add_func("/qemu-opts/opts_set", test_qemu_opts_set); + g_test_add_func("/qemu-opts/opts_parse/general", test_opts_parse); + g_test_add_func("/qemu-opts/opts_parse/bool", test_opts_parse_bool); + g_test_add_func("/qemu-opts/opts_parse/number", test_opts_parse_number= ); + g_test_add_func("/qemu-opts/opts_parse/size", test_opts_parse_size); g_test_run(); return 0; } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068404341692.9758081906491; Tue, 14 Feb 2017 02:33:24 -0800 (PST) Received: from localhost ([::1]:33726 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaQB-00037A-BE for importer@patchew.org; Tue, 14 Feb 2017 05:33:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38732) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qg-HV for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJL-0003L0-C0 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58741) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJL-0003KR-2z for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:15 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AB9328F29A for ; Tue, 14 Feb 2017 10:26:14 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQDPT003916 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:14 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 824E811384AE; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:49 +0100 Message-Id: <1487067971-10443-3-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 14 Feb 2017 10:26:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 02/24] QemuOpts: Assert value string isn't null X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Plenty of code relies on QemuOpt member @str not being null, including qemu_opts_print(), qemu_opts_to_qdict(), and callbacks passed to qemu_opt_foreach(). Begs the question whether it can be null. Only opt_set() creates QemuOpt. It sets member @str to its argument @value. Passing null for @value would plant a time bomb. Callers: * opts_do_parse() can't pass null. * qemu_opt_set() passes its argument @value. Callers: - qemu_opts_from_qdict_1() can't pass null - qemu_opts_set() passes its argument @value, but none of its callers pass null. - Many more outside qemu-option.c, but they shouldn't pass null, either. Assert member @str isn't null, so that misuse is caught right away. Simplify parse_option_bool(), parse_option_number() and parse_option_size() accordingly. Best viewed with whitespace changes ignored. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- util/qemu-option.c | 89 ++++++++++++++++++++++++--------------------------= ---- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index 3467dc2..2b4e0c9 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -128,17 +128,13 @@ int get_param_value(char *buf, int buf_size, static void parse_option_bool(const char *name, const char *value, bool *r= et, Error **errp) { - if (value !=3D NULL) { - if (!strcmp(value, "on")) { - *ret =3D 1; - } else if (!strcmp(value, "off")) { - *ret =3D 0; - } else { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, - name, "'on' or 'off'"); - } - } else { + if (!strcmp(value, "on")) { *ret =3D 1; + } else if (!strcmp(value, "off")) { + *ret =3D 0; + } else { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + name, "'on' or 'off'"); } } =20 @@ -148,16 +144,12 @@ static void parse_option_number(const char *name, con= st char *value, char *postfix; uint64_t number; =20 - if (value !=3D NULL) { - number =3D strtoull(value, &postfix, 0); - if (*postfix !=3D '\0') { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a number= "); - return; - } - *ret =3D number; - } else { + number =3D strtoull(value, &postfix, 0); + if (*postfix !=3D '\0') { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a number"); + return; } + *ret =3D number; } =20 static const QemuOptDesc *find_desc_by_name(const QemuOptDesc *desc, @@ -180,39 +172,35 @@ void parse_option_size(const char *name, const char *= value, char *postfix; double sizef; =20 - if (value !=3D NULL) { - sizef =3D strtod(value, &postfix); - if (sizef < 0 || sizef > UINT64_MAX) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, - "a non-negative number below 2^64"); - return; - } - switch (*postfix) { - case 'T': - sizef *=3D 1024; - /* fall through */ - case 'G': - sizef *=3D 1024; - /* fall through */ - case 'M': - sizef *=3D 1024; - /* fall through */ - case 'K': - case 'k': - sizef *=3D 1024; - /* fall through */ - case 'b': - case '\0': - *ret =3D (uint64_t) sizef; - break; - default: - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a size"); - error_append_hint(errp, "You may use k, M, G or T suffixes for= " - "kilobytes, megabytes, gigabytes and terabytes.\n"); - return; - } - } else { + sizef =3D strtod(value, &postfix); + if (sizef < 0 || sizef > UINT64_MAX) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, + "a non-negative number below 2^64"); + return; + } + switch (*postfix) { + case 'T': + sizef *=3D 1024; + /* fall through */ + case 'G': + sizef *=3D 1024; + /* fall through */ + case 'M': + sizef *=3D 1024; + /* fall through */ + case 'K': + case 'k': + sizef *=3D 1024; + /* fall through */ + case 'b': + case '\0': + *ret =3D (uint64_t) sizef; + break; + default: error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a size"); + error_append_hint(errp, "You may use k, M, G or T suffixes for " + "kilobytes, megabytes, gigabytes and terabytes.\= n"); + return; } } =20 @@ -547,6 +535,7 @@ static void opt_set(QemuOpts *opts, const char *name, c= onst char *value, } opt->desc =3D desc; opt->str =3D g_strdup(value); + assert(opt->str); qemu_opt_parse(opt, &local_err); if (local_err) { error_propagate(errp, local_err); --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068392979675.2550330558389; Tue, 14 Feb 2017 02:33:12 -0800 (PST) Received: from localhost ([::1]:33725 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaQ3-000317-Kh for importer@patchew.org; Tue, 14 Feb 2017 05:33:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38734) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qh-Hd for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJL-0003Ko-BE for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54692) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJL-0003KH-35 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:15 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6AE14C04B948 for ; Tue, 14 Feb 2017 10:26:14 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3557EACB84 for ; Tue, 14 Feb 2017 10:26:14 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8532311384AF; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:50 +0100 Message-Id: <1487067971-10443-4-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 14 Feb 2017 10:26:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 03/24] tests/test-cutils: Add missing qemu_strtol()... endptr checks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tests/test-cutils.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 20b0f59..71681dc 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -262,6 +262,7 @@ static void test_qemu_strtol_empty(void) err =3D qemu_strtol(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtol_whitespace(void) @@ -275,6 +276,7 @@ static void test_qemu_strtol_whitespace(void) err =3D qemu_strtol(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtol_invalid(void) @@ -288,6 +290,7 @@ static void test_qemu_strtol_invalid(void) err =3D qemu_strtol(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtol_trailing(void) @@ -548,6 +551,7 @@ static void test_qemu_strtoul_empty(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoul_whitespace(void) @@ -561,6 +565,7 @@ static void test_qemu_strtoul_whitespace(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoul_invalid(void) @@ -574,6 +579,7 @@ static void test_qemu_strtoul_invalid(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoul_trailing(void) @@ -829,6 +835,7 @@ static void test_qemu_strtoll_empty(void) err =3D qemu_strtoll(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoll_whitespace(void) @@ -842,6 +849,7 @@ static void test_qemu_strtoll_whitespace(void) err =3D qemu_strtoll(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoll_invalid(void) @@ -855,6 +863,7 @@ static void test_qemu_strtoll_invalid(void) err =3D qemu_strtoll(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoll_trailing(void) @@ -1113,6 +1122,7 @@ static void test_qemu_strtoull_empty(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoull_whitespace(void) @@ -1126,6 +1136,7 @@ static void test_qemu_strtoull_whitespace(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoull_invalid(void) @@ -1139,6 +1150,7 @@ static void test_qemu_strtoull_invalid(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); } =20 static void test_qemu_strtoull_trailing(void) --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069178203763.9708243935765; Tue, 14 Feb 2017 02:46:18 -0800 (PST) Received: from localhost ([::1]:33797 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaci-0007b9-Om for importer@patchew.org; Tue, 14 Feb 2017 05:46:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38738) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qj-Iv for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJL-0003Kt-BD for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36692) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJL-0003KS-33 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:15 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC07F85540 for ; Tue, 14 Feb 2017 10:26:14 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQDii001965 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:14 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 87E6111384B0; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:51 +0100 Message-Id: <1487067971-10443-5-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 14 Feb 2017 10:26:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 04/24] tests/test-cutils: Clean up qemu_strtoul() result checks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use unsigned comparisons to check the result of qemu_strtoul() and strtoull(). Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 60 ++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 71681dc..ef76792 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -523,7 +523,7 @@ static void test_qemu_strtoul_correct(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 12345); + g_assert_cmpuint(res, =3D=3D, 12345); g_assert(endptr =3D=3D str + 5); } =20 @@ -593,7 +593,7 @@ static void test_qemu_strtoul_trailing(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + 3); } =20 @@ -608,7 +608,7 @@ static void test_qemu_strtoul_octal(void) err =3D qemu_strtoul(str, &endptr, 8, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0123); + g_assert_cmpuint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); =20 res =3D 999; @@ -616,7 +616,7 @@ static void test_qemu_strtoul_octal(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0123); + g_assert_cmpuint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -631,7 +631,7 @@ static void test_qemu_strtoul_decimal(void) err =3D qemu_strtoul(str, &endptr, 10, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); =20 str =3D "123"; @@ -640,7 +640,7 @@ static void test_qemu_strtoul_decimal(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -655,7 +655,7 @@ static void test_qemu_strtoul_hex(void) err =3D qemu_strtoul(str, &endptr, 16, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x123); + g_assert_cmpuint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); =20 str =3D "0x123"; @@ -664,7 +664,7 @@ static void test_qemu_strtoul_hex(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x123); + g_assert_cmpuint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -679,7 +679,7 @@ static void test_qemu_strtoul_max(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, ULONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); g_free(str); } @@ -695,7 +695,7 @@ static void test_qemu_strtoul_overflow(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert_cmpint(res, =3D=3D, ULONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -710,7 +710,7 @@ static void test_qemu_strtoul_underflow(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert_cmpint(res, =3D=3D, -1ul); + g_assert_cmpuint(res, =3D=3D, -1ul); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -725,7 +725,7 @@ static void test_qemu_strtoul_negative(void) err =3D qemu_strtoul(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, -321ul); + g_assert_cmpuint(res, =3D=3D, -321ul); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -738,7 +738,7 @@ static void test_qemu_strtoul_full_correct(void) err =3D qemu_strtoul(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); } =20 static void test_qemu_strtoul_full_null(void) @@ -769,7 +769,7 @@ static void test_qemu_strtoul_full_negative(void) =20 err =3D qemu_strtoul(str, NULL, 0, &res); g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, -321ul); + g_assert_cmpuint(res, =3D=3D, -321ul); } =20 static void test_qemu_strtoul_full_trailing(void) @@ -792,7 +792,7 @@ static void test_qemu_strtoul_full_max(void) err =3D qemu_strtoul(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, ULONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULONG_MAX); g_free(str); } =20 @@ -1094,7 +1094,7 @@ static void test_qemu_strtoull_correct(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 12345); + g_assert_cmpuint(res, =3D=3D, 12345); g_assert(endptr =3D=3D str + 5); } =20 @@ -1164,7 +1164,7 @@ static void test_qemu_strtoull_trailing(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + 3); } =20 @@ -1179,7 +1179,7 @@ static void test_qemu_strtoull_octal(void) err =3D qemu_strtoull(str, &endptr, 8, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0123); + g_assert_cmpuint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); =20 endptr =3D &f; @@ -1187,7 +1187,7 @@ static void test_qemu_strtoull_octal(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0123); + g_assert_cmpuint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1202,7 +1202,7 @@ static void test_qemu_strtoull_decimal(void) err =3D qemu_strtoull(str, &endptr, 10, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); =20 str =3D "123"; @@ -1211,7 +1211,7 @@ static void test_qemu_strtoull_decimal(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 123); + g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1226,7 +1226,7 @@ static void test_qemu_strtoull_hex(void) err =3D qemu_strtoull(str, &endptr, 16, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x123); + g_assert_cmpuint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); =20 str =3D "0x123"; @@ -1235,7 +1235,7 @@ static void test_qemu_strtoull_hex(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x123); + g_assert_cmpuint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1250,7 +1250,7 @@ static void test_qemu_strtoull_max(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, ULLONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); g_free(str); } @@ -1266,7 +1266,7 @@ static void test_qemu_strtoull_overflow(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert_cmpint(res, =3D=3D, ULLONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1281,7 +1281,7 @@ static void test_qemu_strtoull_underflow(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert_cmpint(res, =3D=3D, -1); + g_assert_cmpuint(res, =3D=3D, (uint64_t)-1); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1296,7 +1296,7 @@ static void test_qemu_strtoull_negative(void) err =3D qemu_strtoull(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, -321); + g_assert_cmpuint(res, =3D=3D, (uint64_t)-321); g_assert(endptr =3D=3D str + strlen(str)); } =20 @@ -1309,7 +1309,7 @@ static void test_qemu_strtoull_full_correct(void) err =3D qemu_strtoull(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 18446744073709551614LLU); + g_assert_cmpuint(res, =3D=3D, 18446744073709551614LLU); } =20 static void test_qemu_strtoull_full_null(void) @@ -1342,7 +1342,7 @@ static void test_qemu_strtoull_full_negative(void) err =3D qemu_strtoull(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 18446744073709551295LLU); + g_assert_cmpuint(res, =3D=3D, 18446744073709551295LLU); } =20 static void test_qemu_strtoull_full_trailing(void) @@ -1365,7 +1365,7 @@ static void test_qemu_strtoull_full_max(void) err =3D qemu_strtoull(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, ULLONG_MAX); + g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); g_free(str); } =20 --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068668542819.4235479340045; Tue, 14 Feb 2017 02:37:48 -0800 (PST) Received: from localhost ([::1]:33751 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaUU-00083i-7G for importer@patchew.org; Tue, 14 Feb 2017 05:37:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38737) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qi-IR for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003Ly-Aj for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51848) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003L5-0G for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CB933A768D for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C0A8FACB84 for ; Tue, 14 Feb 2017 10:26:15 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8A99211384B1; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:52 +0100 Message-Id: <1487067971-10443-6-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 05/24] util/cutils: Rewrite documentation of qemu_strtol() & friends X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Fixes the following documentation bugs: * Fails to document that null @nptr is safe. * Fails to document that we return -EINVAL when no conversion could be performed (commit 47d4be1). * Confuses long long with int64_t, and unsigned long long with uint64_t. * Claims the unsigned conversions can underflow. They can't. While there, mark problematic assumptions that int64_t is long long, and uint64_t is unsigned long long with FIXME comments. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- util/cutils.c | 80 +++++++++++++++++++++++++++++++++----------------------= ---- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/util/cutils.c b/util/cutils.c index 4fefcf3..1ae2a08 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -265,9 +265,6 @@ int64_t qemu_strtosz(const char *nptr, char **end) static int check_strtox_error(const char *p, char *endptr, const char **ne= xt, int err) { - /* If no conversion was performed, prefer BSD behavior over glibc - * behavior. - */ if (err =3D=3D 0 && endptr =3D=3D p) { err =3D EINVAL; } @@ -281,30 +278,28 @@ static int check_strtox_error(const char *p, char *en= dptr, const char **next, } =20 /** - * QEMU wrappers for strtol(), strtoll(), strtoul(), strotull() C function= s. + * Convert string @nptr to a long integer, and store it in @result. * - * Convert ASCII string @nptr to a long integer value - * from the given @base. Parameters @nptr, @endptr, @base - * follows same semantics as strtol() C function. + * This is a wrapper around strtol() that is harder to misuse. + * Semantics of @nptr, @endptr, @base match strtol() with differences + * noted below. * - * Unlike from strtol() function, if @endptr is not NULL, this - * function will return -EINVAL whenever it cannot fully convert - * the string in @nptr with given @base to a long. This function returns - * the result of the conversion only through the @result parameter. + * @nptr may be null, and no conversion is performed then. * - * If NULL is passed in @endptr, then the whole string in @ntpr - * is a number otherwise it returns -EINVAL. + * If no conversion is performed, store @nptr in *@endptr and return + * -EINVAL. * - * RETURN VALUE - * Unlike from strtol() function, this wrapper returns either - * -EINVAL or the errno set by strtol() function (e.g -ERANGE). - * If the conversion overflows, -ERANGE is returned, and @result - * is set to the max value of the desired type - * (e.g. LONG_MAX, LLONG_MAX, ULONG_MAX, ULLONG_MAX). If the case - * of underflow, -ERANGE is returned, and @result is set to the min - * value of the desired type. For strtol(), strtoll(), @result is set to - * LONG_MIN, LLONG_MIN, respectively, and for strtoul(), strtoull() it - * is set to 0. + * If @endptr is null, and the string isn't fully converted, return + * -EINVAL. This is the case when the pointer that would be stored in + * a non-null @endptr points to a character other than '\0'. + * + * If the conversion overflows @result, store LONG_MAX in @result, + * and return -ERANGE. + * + * If the conversion underflows @result, store LONG_MIN in @result, + * and return -ERANGE. + * + * Else store the converted value in @result, and return zero. */ int qemu_strtol(const char *nptr, const char **endptr, int base, long *result) @@ -325,17 +320,29 @@ int qemu_strtol(const char *nptr, const char **endptr= , int base, } =20 /** - * Converts ASCII string to an unsigned long integer. + * Convert string @nptr to an unsigned long, and store it in @result. * - * If string contains a negative number, value will be converted to - * the unsigned representation of the signed value, unless the original - * (nonnegated) value would overflow, in this case, it will set @result - * to ULONG_MAX, and return ERANGE. + * This is a wrapper around strtoul() that is harder to misuse. + * Semantics of @nptr, @endptr, @base match strtoul() with differences + * noted below. * - * The same behavior holds, for qemu_strtoull() but sets @result to - * ULLONG_MAX instead of ULONG_MAX. + * @nptr may be null, and no conversion is performed then. * - * See qemu_strtol() documentation for more info. + * If no conversion is performed, store @nptr in *@endptr and return + * -EINVAL. + * + * If @endptr is null, and the string isn't fully converted, return + * -EINVAL. This is the case when the pointer that would be stored in + * a non-null @endptr points to a character other than '\0'. + * + * If the conversion overflows @result, store ULONG_MAX in @result, + * and return -ERANGE. + * + * Else store the converted value in @result, and return zero. + * + * Note that a number with a leading minus sign gets converted without + * the minus sign, checked for overflow (see above), then negated (in + * @result's type). This is exactly how strtoul() works. */ int qemu_strtoul(const char *nptr, const char **endptr, int base, unsigned long *result) @@ -360,9 +367,10 @@ int qemu_strtoul(const char *nptr, const char **endptr= , int base, } =20 /** - * Converts ASCII string to a long long integer. + * Convert string @nptr to an int64_t. * - * See qemu_strtol() documentation for more info. + * Works like qemu_strtol(), except it stores INT64_MAX on overflow, + * and INT_MIN on underflow. */ int qemu_strtoll(const char *nptr, const char **endptr, int base, int64_t *result) @@ -376,6 +384,7 @@ int qemu_strtoll(const char *nptr, const char **endptr,= int base, err =3D -EINVAL; } else { errno =3D 0; + /* FIXME This assumes int64_t is long long */ *result =3D strtoll(nptr, &p, base); err =3D check_strtox_error(nptr, p, endptr, errno); } @@ -383,9 +392,9 @@ int qemu_strtoll(const char *nptr, const char **endptr,= int base, } =20 /** - * Converts ASCII string to an unsigned long long integer. + * Convert string @nptr to an uint64_t. * - * See qemu_strtol() documentation for more info. + * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow. */ int qemu_strtoull(const char *nptr, const char **endptr, int base, uint64_t *result) @@ -399,6 +408,7 @@ int qemu_strtoull(const char *nptr, const char **endptr= , int base, err =3D -EINVAL; } else { errno =3D 0; + /* FIXME This assumes uint64_t is unsigned long long */ *result =3D strtoull(nptr, &p, base); /* Windows returns 1 for negative out-of-range values. */ if (errno =3D=3D ERANGE) { --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068676747957.1122535960404; Tue, 14 Feb 2017 02:37:56 -0800 (PST) Received: from localhost ([::1]:33752 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaUc-00088a-Ss for importer@patchew.org; Tue, 14 Feb 2017 05:37:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJU-0005vB-U8 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003Mw-Os for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58588) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LY-DH for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8A01461D2D for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQEJv023199 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:15 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8E26411384B2; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:53 +0100 Message-Id: <1487067971-10443-7-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 06/24] util/cutils: Rename qemu_strtoll(), qemu_strtoull() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The name qemu_strtoll() suggests conversion to long long, but it actually converts to int64_t. Rename to qemu_strtoi64(). The name qemu_strtoull() suggests conversion to unsigned long long, but it actually converts to uint64_t. Rename to qemu_strtou64(). Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- include/qemu/cutils.h | 6 +- qobject/qdict.c | 2 +- qtest.c | 34 ++--- tests/test-cutils.c | 366 +++++++++++++++++++++++++++-------------------= ---- util/cutils.c | 4 +- util/log.c | 4 +- 6 files changed, 224 insertions(+), 192 deletions(-) diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index 8033929..f922223 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -130,9 +130,9 @@ int qemu_strtol(const char *nptr, const char **endptr, = int base, long *result); int qemu_strtoul(const char *nptr, const char **endptr, int base, unsigned long *result); -int qemu_strtoll(const char *nptr, const char **endptr, int base, - int64_t *result); -int qemu_strtoull(const char *nptr, const char **endptr, int base, +int qemu_strtoi64(const char *nptr, const char **endptr, int base, + int64_t *result); +int qemu_strtou64(const char *nptr, const char **endptr, int base, uint64_t *result); =20 int parse_uint(const char *s, unsigned long long *value, char **endptr, diff --git a/qobject/qdict.c b/qobject/qdict.c index 197b0fb..4be7d3e 100644 --- a/qobject/qdict.c +++ b/qobject/qdict.c @@ -767,7 +767,7 @@ static int qdict_is_list(QDict *maybe_list, Error **err= p) for (ent =3D qdict_first(maybe_list); ent !=3D NULL; ent =3D qdict_next(maybe_list, ent)) { =20 - if (qemu_strtoll(ent->key, NULL, 10, &val) =3D=3D 0) { + if (qemu_strtoi64(ent->key, NULL, 10, &val) =3D=3D 0) { if (is_list =3D=3D -1) { is_list =3D 1; } else if (!is_list) { diff --git a/qtest.c b/qtest.c index 1446719..a685827 100644 --- a/qtest.c +++ b/qtest.c @@ -373,8 +373,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) uint64_t value; =20 g_assert(words[1] && words[2]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &value) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &value) =3D=3D 0); =20 if (words[0][5] =3D=3D 'b') { uint8_t data =3D value; @@ -402,7 +402,7 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) uint64_t value =3D UINT64_C(-1); =20 g_assert(words[1]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); =20 if (words[0][4] =3D=3D 'b') { uint8_t data; @@ -428,8 +428,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) char *enc; =20 g_assert(words[1] && words[2]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &len) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &len) =3D=3D 0); /* We'd send garbage to libqtest if len is 0 */ g_assert(len); =20 @@ -452,8 +452,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) gchar *b64_data; =20 g_assert(words[1] && words[2]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &len) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &len) =3D=3D 0); =20 data =3D g_malloc(len); cpu_physical_memory_read(addr, data, len); @@ -469,8 +469,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) size_t data_len; =20 g_assert(words[1] && words[2] && words[3]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &len) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &len) =3D=3D 0); =20 data_len =3D strlen(words[3]); if (data_len < 3) { @@ -498,8 +498,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) unsigned long pattern; =20 g_assert(words[1] && words[2] && words[3]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &len) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &len) =3D=3D 0); g_assert(qemu_strtoul(words[3], NULL, 0, &pattern) =3D=3D 0); =20 if (len) { @@ -518,8 +518,8 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) gsize out_len; =20 g_assert(words[1] && words[2] && words[3]); - g_assert(qemu_strtoull(words[1], NULL, 0, &addr) =3D=3D 0); - g_assert(qemu_strtoull(words[2], NULL, 0, &len) =3D=3D 0); + g_assert(qemu_strtou64(words[1], NULL, 0, &addr) =3D=3D 0); + g_assert(qemu_strtou64(words[2], NULL, 0, &len) =3D=3D 0); =20 data_len =3D strlen(words[3]); if (data_len < 3) { @@ -552,9 +552,9 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) unsigned long nargs, nret; =20 g_assert(qemu_strtoul(words[2], NULL, 0, &nargs) =3D=3D 0); - g_assert(qemu_strtoull(words[3], NULL, 0, &args) =3D=3D 0); + g_assert(qemu_strtou64(words[3], NULL, 0, &args) =3D=3D 0); g_assert(qemu_strtoul(words[4], NULL, 0, &nret) =3D=3D 0); - g_assert(qemu_strtoull(words[5], NULL, 0, &ret) =3D=3D 0); + g_assert(qemu_strtou64(words[5], NULL, 0, &ret) =3D=3D 0); res =3D qtest_rtas_call(words[1], nargs, args, nret, ret); =20 qtest_send_prefix(chr); @@ -564,7 +564,7 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) int64_t ns; =20 if (words[1]) { - g_assert(qemu_strtoll(words[1], NULL, 0, &ns) =3D=3D 0); + g_assert(qemu_strtoi64(words[1], NULL, 0, &ns) =3D=3D 0); } else { ns =3D qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL); } @@ -576,7 +576,7 @@ static void qtest_process_command(CharBackend *chr, gch= ar **words) int64_t ns; =20 g_assert(words[1]); - g_assert(qemu_strtoll(words[1], NULL, 0, &ns) =3D=3D 0); + g_assert(qemu_strtoi64(words[1], NULL, 0, &ns) =3D=3D 0); qtest_clock_warp(ns); qtest_send_prefix(chr); qtest_sendf(chr, "OK %"PRIi64"\n", diff --git a/tests/test-cutils.c b/tests/test-cutils.c index ef76792..47cc8a4 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -796,7 +796,7 @@ static void test_qemu_strtoul_full_max(void) g_free(str); } =20 -static void test_qemu_strtoll_correct(void) +static void test_qemu_strtoi64_correct(void) { const char *str =3D "12345 foo"; char f =3D 'X'; @@ -804,27 +804,27 @@ static void test_qemu_strtoll_correct(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 12345); g_assert(endptr =3D=3D str + 5); } =20 -static void test_qemu_strtoll_null(void) +static void test_qemu_strtoi64_null(void) { char f =3D 'X'; const char *endptr =3D &f; int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(NULL, &endptr, 0, &res); + err =3D qemu_strtoi64(NULL, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D NULL); } =20 -static void test_qemu_strtoll_empty(void) +static void test_qemu_strtoi64_empty(void) { const char *str =3D ""; char f =3D 'X'; @@ -832,13 +832,13 @@ static void test_qemu_strtoll_empty(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoll_whitespace(void) +static void test_qemu_strtoi64_whitespace(void) { const char *str =3D " \t "; char f =3D 'X'; @@ -846,13 +846,13 @@ static void test_qemu_strtoll_whitespace(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoll_invalid(void) +static void test_qemu_strtoi64_invalid(void) { const char *str =3D " xxxx \t abc"; char f =3D 'X'; @@ -860,13 +860,13 @@ static void test_qemu_strtoll_invalid(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoll_trailing(void) +static void test_qemu_strtoi64_trailing(void) { const char *str =3D "123xxx"; char f =3D 'X'; @@ -874,14 +874,14 @@ static void test_qemu_strtoll_trailing(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + 3); } =20 -static void test_qemu_strtoll_octal(void) +static void test_qemu_strtoi64_octal(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -889,7 +889,7 @@ static void test_qemu_strtoll_octal(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 8, &res); + err =3D qemu_strtoi64(str, &endptr, 8, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0123); @@ -897,14 +897,14 @@ static void test_qemu_strtoll_octal(void) =20 endptr =3D &f; res =3D 999; - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_decimal(void) +static void test_qemu_strtoi64_decimal(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -912,7 +912,7 @@ static void test_qemu_strtoll_decimal(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 10, &res); + err =3D qemu_strtoi64(str, &endptr, 10, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 123); @@ -921,14 +921,14 @@ static void test_qemu_strtoll_decimal(void) str =3D "123"; endptr =3D &f; res =3D 999; - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_hex(void) +static void test_qemu_strtoi64_hex(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -936,7 +936,7 @@ static void test_qemu_strtoll_hex(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 16, &res); + err =3D qemu_strtoi64(str, &endptr, 16, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x123); @@ -945,14 +945,14 @@ static void test_qemu_strtoll_hex(void) str =3D "0x123"; endptr =3D &f; res =3D 999; - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_max(void) +static void test_qemu_strtoi64_max(void) { char *str =3D g_strdup_printf("%lld", LLONG_MAX); char f =3D 'X'; @@ -960,7 +960,7 @@ static void test_qemu_strtoll_max(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, LLONG_MAX); @@ -968,7 +968,7 @@ static void test_qemu_strtoll_max(void) g_free(str); } =20 -static void test_qemu_strtoll_overflow(void) +static void test_qemu_strtoi64_overflow(void) { const char *str =3D "99999999999999999999999999999999999999999999"; char f =3D 'X'; @@ -976,14 +976,14 @@ static void test_qemu_strtoll_overflow(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert_cmpint(res, =3D=3D, LLONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_underflow(void) +static void test_qemu_strtoi64_underflow(void) { const char *str =3D "-99999999999999999999999999999999999999999999"; char f =3D 'X'; @@ -991,14 +991,14 @@ static void test_qemu_strtoll_underflow(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert_cmpint(res, =3D=3D, LLONG_MIN); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_negative(void) +static void test_qemu_strtoi64_negative(void) { const char *str =3D " \t -321"; char f =3D 'X'; @@ -1006,84 +1006,84 @@ static void test_qemu_strtoll_negative(void) int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, &endptr, 0, &res); + err =3D qemu_strtoi64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, -321); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoll_full_correct(void) +static void test_qemu_strtoi64_full_correct(void) { const char *str =3D "123"; int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, NULL, 0, &res); + err =3D qemu_strtoi64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 123); } =20 -static void test_qemu_strtoll_full_null(void) +static void test_qemu_strtoi64_full_null(void) { int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(NULL, NULL, 0, &res); + err =3D qemu_strtoi64(NULL, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoll_full_empty(void) +static void test_qemu_strtoi64_full_empty(void) { const char *str =3D ""; int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, NULL, 0, &res); + err =3D qemu_strtoi64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoll_full_negative(void) +static void test_qemu_strtoi64_full_negative(void) { const char *str =3D " \t -321"; int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, NULL, 0, &res); + err =3D qemu_strtoi64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, -321); } =20 -static void test_qemu_strtoll_full_trailing(void) +static void test_qemu_strtoi64_full_trailing(void) { const char *str =3D "123xxx"; int64_t res =3D 999; int err; =20 - err =3D qemu_strtoll(str, NULL, 0, &res); + err =3D qemu_strtoi64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoll_full_max(void) +static void test_qemu_strtoi64_full_max(void) { =20 char *str =3D g_strdup_printf("%lld", LLONG_MAX); int64_t res; int err; =20 - err =3D qemu_strtoll(str, NULL, 0, &res); + err =3D qemu_strtoi64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, LLONG_MAX); g_free(str); } =20 -static void test_qemu_strtoull_correct(void) +static void test_qemu_strtou64_correct(void) { const char *str =3D "12345 foo"; char f =3D 'X'; @@ -1091,27 +1091,27 @@ static void test_qemu_strtoull_correct(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 12345); g_assert(endptr =3D=3D str + 5); } =20 -static void test_qemu_strtoull_null(void) +static void test_qemu_strtou64_null(void) { char f =3D 'X'; const char *endptr =3D &f; uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(NULL, &endptr, 0, &res); + err =3D qemu_strtou64(NULL, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D NULL); } =20 -static void test_qemu_strtoull_empty(void) +static void test_qemu_strtou64_empty(void) { const char *str =3D ""; char f =3D 'X'; @@ -1119,13 +1119,13 @@ static void test_qemu_strtoull_empty(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoull_whitespace(void) +static void test_qemu_strtou64_whitespace(void) { const char *str =3D " \t "; char f =3D 'X'; @@ -1133,13 +1133,13 @@ static void test_qemu_strtoull_whitespace(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoull_invalid(void) +static void test_qemu_strtou64_invalid(void) { const char *str =3D " xxxx \t abc"; char f =3D 'X'; @@ -1147,13 +1147,13 @@ static void test_qemu_strtoull_invalid(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 -static void test_qemu_strtoull_trailing(void) +static void test_qemu_strtou64_trailing(void) { const char *str =3D "123xxx"; char f =3D 'X'; @@ -1161,14 +1161,14 @@ static void test_qemu_strtoull_trailing(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + 3); } =20 -static void test_qemu_strtoull_octal(void) +static void test_qemu_strtou64_octal(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -1176,7 +1176,7 @@ static void test_qemu_strtoull_octal(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 8, &res); + err =3D qemu_strtou64(str, &endptr, 8, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 0123); @@ -1184,14 +1184,14 @@ static void test_qemu_strtoull_octal(void) =20 endptr =3D &f; res =3D 999; - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 0123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_decimal(void) +static void test_qemu_strtou64_decimal(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -1199,7 +1199,7 @@ static void test_qemu_strtoull_decimal(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 10, &res); + err =3D qemu_strtou64(str, &endptr, 10, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 123); @@ -1208,14 +1208,14 @@ static void test_qemu_strtoull_decimal(void) str =3D "123"; endptr =3D &f; res =3D 999; - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_hex(void) +static void test_qemu_strtou64_hex(void) { const char *str =3D "0123"; char f =3D 'X'; @@ -1223,7 +1223,7 @@ static void test_qemu_strtoull_hex(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 16, &res); + err =3D qemu_strtou64(str, &endptr, 16, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 0x123); @@ -1232,14 +1232,14 @@ static void test_qemu_strtoull_hex(void) str =3D "0x123"; endptr =3D &f; res =3D 999; - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 0x123); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_max(void) +static void test_qemu_strtou64_max(void) { char *str =3D g_strdup_printf("%llu", ULLONG_MAX); char f =3D 'X'; @@ -1247,7 +1247,7 @@ static void test_qemu_strtoull_max(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); @@ -1255,7 +1255,7 @@ static void test_qemu_strtoull_max(void) g_free(str); } =20 -static void test_qemu_strtoull_overflow(void) +static void test_qemu_strtou64_overflow(void) { const char *str =3D "99999999999999999999999999999999999999999999"; char f =3D 'X'; @@ -1263,14 +1263,14 @@ static void test_qemu_strtoull_overflow(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_underflow(void) +static void test_qemu_strtou64_underflow(void) { const char *str =3D "-99999999999999999999999999999999999999999999"; char f =3D 'X'; @@ -1278,14 +1278,14 @@ static void test_qemu_strtoull_underflow(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert_cmpuint(res, =3D=3D, (uint64_t)-1); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_negative(void) +static void test_qemu_strtou64_negative(void) { const char *str =3D " \t -321"; char f =3D 'X'; @@ -1293,76 +1293,76 @@ static void test_qemu_strtoull_negative(void) uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, &endptr, 0, &res); + err =3D qemu_strtou64(str, &endptr, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, (uint64_t)-321); g_assert(endptr =3D=3D str + strlen(str)); } =20 -static void test_qemu_strtoull_full_correct(void) +static void test_qemu_strtou64_full_correct(void) { const char *str =3D "18446744073709551614"; uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, NULL, 0, &res); + err =3D qemu_strtou64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 18446744073709551614LLU); } =20 -static void test_qemu_strtoull_full_null(void) +static void test_qemu_strtou64_full_null(void) { uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(NULL, NULL, 0, &res); + err =3D qemu_strtou64(NULL, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoull_full_empty(void) +static void test_qemu_strtou64_full_empty(void) { const char *str =3D ""; uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, NULL, 0, &res); + err =3D qemu_strtou64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoull_full_negative(void) +static void test_qemu_strtou64_full_negative(void) { const char *str =3D " \t -321"; uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, NULL, 0, &res); + err =3D qemu_strtou64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, 18446744073709551295LLU); } =20 -static void test_qemu_strtoull_full_trailing(void) +static void test_qemu_strtou64_full_trailing(void) { const char *str =3D "18446744073709551614xxxxxx"; uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, NULL, 0, &res); + err =3D qemu_strtou64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 -static void test_qemu_strtoull_full_max(void) +static void test_qemu_strtou64_full_max(void) { char *str =3D g_strdup_printf("%lld", ULLONG_MAX); uint64_t res =3D 999; int err; =20 - err =3D qemu_strtoull(str, NULL, 0, &res); + err =3D qemu_strtou64(str, NULL, 0, &res); =20 g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpuint(res, =3D=3D, ULLONG_MAX); @@ -1471,21 +1471,32 @@ int main(int argc, char **argv) test_parse_uint_full_correct); =20 /* qemu_strtol() tests */ - g_test_add_func("/cutils/qemu_strtol/correct", test_qemu_strtol_correc= t); - g_test_add_func("/cutils/qemu_strtol/null", test_qemu_strtol_null); - g_test_add_func("/cutils/qemu_strtol/empty", test_qemu_strtol_empty); + g_test_add_func("/cutils/qemu_strtol/correct", + test_qemu_strtol_correct); + g_test_add_func("/cutils/qemu_strtol/null", + test_qemu_strtol_null); + g_test_add_func("/cutils/qemu_strtol/empty", + test_qemu_strtol_empty); g_test_add_func("/cutils/qemu_strtol/whitespace", test_qemu_strtol_whitespace); - g_test_add_func("/cutils/qemu_strtol/invalid", test_qemu_strtol_invali= d); - g_test_add_func("/cutils/qemu_strtol/trailing", test_qemu_strtol_trail= ing); - g_test_add_func("/cutils/qemu_strtol/octal", test_qemu_strtol_octal); - g_test_add_func("/cutils/qemu_strtol/decimal", test_qemu_strtol_decima= l); - g_test_add_func("/cutils/qemu_strtol/hex", test_qemu_strtol_hex); - g_test_add_func("/cutils/qemu_strtol/max", test_qemu_strtol_max); - g_test_add_func("/cutils/qemu_strtol/overflow", test_qemu_strtol_overf= low); + g_test_add_func("/cutils/qemu_strtol/invalid", + test_qemu_strtol_invalid); + g_test_add_func("/cutils/qemu_strtol/trailing", + test_qemu_strtol_trailing); + g_test_add_func("/cutils/qemu_strtol/octal", + test_qemu_strtol_octal); + g_test_add_func("/cutils/qemu_strtol/decimal", + test_qemu_strtol_decimal); + g_test_add_func("/cutils/qemu_strtol/hex", + test_qemu_strtol_hex); + g_test_add_func("/cutils/qemu_strtol/max", + test_qemu_strtol_max); + g_test_add_func("/cutils/qemu_strtol/overflow", + test_qemu_strtol_overflow); g_test_add_func("/cutils/qemu_strtol/underflow", test_qemu_strtol_underflow); - g_test_add_func("/cutils/qemu_strtol/negative", test_qemu_strtol_negat= ive); + g_test_add_func("/cutils/qemu_strtol/negative", + test_qemu_strtol_negative); g_test_add_func("/cutils/qemu_strtol_full/correct", test_qemu_strtol_full_correct); g_test_add_func("/cutils/qemu_strtol_full/null", @@ -1500,18 +1511,26 @@ int main(int argc, char **argv) test_qemu_strtol_full_max); =20 /* qemu_strtoul() tests */ - g_test_add_func("/cutils/qemu_strtoul/correct", test_qemu_strtoul_corr= ect); - g_test_add_func("/cutils/qemu_strtoul/null", test_qemu_strtoul_null); - g_test_add_func("/cutils/qemu_strtoul/empty", test_qemu_strtoul_empty); + g_test_add_func("/cutils/qemu_strtoul/correct", + test_qemu_strtoul_correct); + g_test_add_func("/cutils/qemu_strtoul/null", + test_qemu_strtoul_null); + g_test_add_func("/cutils/qemu_strtoul/empty", + test_qemu_strtoul_empty); g_test_add_func("/cutils/qemu_strtoul/whitespace", test_qemu_strtoul_whitespace); - g_test_add_func("/cutils/qemu_strtoul/invalid", test_qemu_strtoul_inva= lid); + g_test_add_func("/cutils/qemu_strtoul/invalid", + test_qemu_strtoul_invalid); g_test_add_func("/cutils/qemu_strtoul/trailing", test_qemu_strtoul_trailing); - g_test_add_func("/cutils/qemu_strtoul/octal", test_qemu_strtoul_octal); - g_test_add_func("/cutils/qemu_strtoul/decimal", test_qemu_strtoul_deci= mal); - g_test_add_func("/cutils/qemu_strtoul/hex", test_qemu_strtoul_hex); - g_test_add_func("/cutils/qemu_strtoul/max", test_qemu_strtoul_max); + g_test_add_func("/cutils/qemu_strtoul/octal", + test_qemu_strtoul_octal); + g_test_add_func("/cutils/qemu_strtoul/decimal", + test_qemu_strtoul_decimal); + g_test_add_func("/cutils/qemu_strtoul/hex", + test_qemu_strtoul_hex); + g_test_add_func("/cutils/qemu_strtoul/max", + test_qemu_strtoul_max); g_test_add_func("/cutils/qemu_strtoul/overflow", test_qemu_strtoul_overflow); g_test_add_func("/cutils/qemu_strtoul/underflow", @@ -1531,73 +1550,86 @@ int main(int argc, char **argv) g_test_add_func("/cutils/qemu_strtoul_full/max", test_qemu_strtoul_full_max); =20 - /* qemu_strtoll() tests */ - g_test_add_func("/cutils/qemu_strtoll/correct", test_qemu_strtoll_corr= ect); - g_test_add_func("/cutils/qemu_strtoll/null", test_qemu_strtoll_null); - g_test_add_func("/cutils/qemu_strtoll/empty", test_qemu_strtoll_empty); - g_test_add_func("/cutils/qemu_strtoll/whitespace", - test_qemu_strtoll_whitespace); - g_test_add_func("/cutils/qemu_strtoll/invalid", test_qemu_strtoll_inva= lid); - g_test_add_func("/cutils/qemu_strtoll/trailing", - test_qemu_strtoll_trailing); - g_test_add_func("/cutils/qemu_strtoll/octal", test_qemu_strtoll_octal); - g_test_add_func("/cutils/qemu_strtoll/decimal", test_qemu_strtoll_deci= mal); - g_test_add_func("/cutils/qemu_strtoll/hex", test_qemu_strtoll_hex); - g_test_add_func("/cutils/qemu_strtoll/max", test_qemu_strtoll_max); - g_test_add_func("/cutils/qemu_strtoll/overflow", - test_qemu_strtoll_overflow); - g_test_add_func("/cutils/qemu_strtoll/underflow", - test_qemu_strtoll_underflow); - g_test_add_func("/cutils/qemu_strtoll/negative", - test_qemu_strtoll_negative); - g_test_add_func("/cutils/qemu_strtoll_full/correct", - test_qemu_strtoll_full_correct); - g_test_add_func("/cutils/qemu_strtoll_full/null", - test_qemu_strtoll_full_null); - g_test_add_func("/cutils/qemu_strtoll_full/empty", - test_qemu_strtoll_full_empty); - g_test_add_func("/cutils/qemu_strtoll_full/negative", - test_qemu_strtoll_full_negative); - g_test_add_func("/cutils/qemu_strtoll_full/trailing", - test_qemu_strtoll_full_trailing); - g_test_add_func("/cutils/qemu_strtoll_full/max", - test_qemu_strtoll_full_max); + /* qemu_strtoi64() tests */ + g_test_add_func("/cutils/qemu_strtoi64/correct", + test_qemu_strtoi64_correct); + g_test_add_func("/cutils/qemu_strtoi64/null", + test_qemu_strtoi64_null); + g_test_add_func("/cutils/qemu_strtoi64/empty", + test_qemu_strtoi64_empty); + g_test_add_func("/cutils/qemu_strtoi64/whitespace", + test_qemu_strtoi64_whitespace); + g_test_add_func("/cutils/qemu_strtoi64/invalid" + , + test_qemu_strtoi64_invalid); + g_test_add_func("/cutils/qemu_strtoi64/trailing", + test_qemu_strtoi64_trailing); + g_test_add_func("/cutils/qemu_strtoi64/octal", + test_qemu_strtoi64_octal); + g_test_add_func("/cutils/qemu_strtoi64/decimal", + test_qemu_strtoi64_decimal); + g_test_add_func("/cutils/qemu_strtoi64/hex", + test_qemu_strtoi64_hex); + g_test_add_func("/cutils/qemu_strtoi64/max", + test_qemu_strtoi64_max); + g_test_add_func("/cutils/qemu_strtoi64/overflow", + test_qemu_strtoi64_overflow); + g_test_add_func("/cutils/qemu_strtoi64/underflow", + test_qemu_strtoi64_underflow); + g_test_add_func("/cutils/qemu_strtoi64/negative", + test_qemu_strtoi64_negative); + g_test_add_func("/cutils/qemu_strtoi64_full/correct", + test_qemu_strtoi64_full_correct); + g_test_add_func("/cutils/qemu_strtoi64_full/null", + test_qemu_strtoi64_full_null); + g_test_add_func("/cutils/qemu_strtoi64_full/empty", + test_qemu_strtoi64_full_empty); + g_test_add_func("/cutils/qemu_strtoi64_full/negative", + test_qemu_strtoi64_full_negative); + g_test_add_func("/cutils/qemu_strtoi64_full/trailing", + test_qemu_strtoi64_full_trailing); + g_test_add_func("/cutils/qemu_strtoi64_full/max", + test_qemu_strtoi64_full_max); =20 - /* qemu_strtoull() tests */ - g_test_add_func("/cutils/qemu_strtoull/correct", - test_qemu_strtoull_correct); - g_test_add_func("/cutils/qemu_strtoull/null", - test_qemu_strtoull_null); - g_test_add_func("/cutils/qemu_strtoull/empty", test_qemu_strtoull_empt= y); - g_test_add_func("/cutils/qemu_strtoull/whitespace", - test_qemu_strtoull_whitespace); - g_test_add_func("/cutils/qemu_strtoull/invalid", - test_qemu_strtoull_invalid); - g_test_add_func("/cutils/qemu_strtoull/trailing", - test_qemu_strtoull_trailing); - g_test_add_func("/cutils/qemu_strtoull/octal", test_qemu_strtoull_octa= l); - g_test_add_func("/cutils/qemu_strtoull/decimal", - test_qemu_strtoull_decimal); - g_test_add_func("/cutils/qemu_strtoull/hex", test_qemu_strtoull_hex); - g_test_add_func("/cutils/qemu_strtoull/max", test_qemu_strtoull_max); - g_test_add_func("/cutils/qemu_strtoull/overflow", - test_qemu_strtoull_overflow); - g_test_add_func("/cutils/qemu_strtoull/underflow", - test_qemu_strtoull_underflow); - g_test_add_func("/cutils/qemu_strtoull/negative", - test_qemu_strtoull_negative); - g_test_add_func("/cutils/qemu_strtoull_full/correct", - test_qemu_strtoull_full_correct); - g_test_add_func("/cutils/qemu_strtoull_full/null", - test_qemu_strtoull_full_null); - g_test_add_func("/cutils/qemu_strtoull_full/empty", - test_qemu_strtoull_full_empty); - g_test_add_func("/cutils/qemu_strtoull_full/negative", - test_qemu_strtoull_full_negative); - g_test_add_func("/cutils/qemu_strtoull_full/trailing", - test_qemu_strtoull_full_trailing); - g_test_add_func("/cutils/qemu_strtoull_full/max", - test_qemu_strtoull_full_max); + /* qemu_strtou64() tests */ + g_test_add_func("/cutils/qemu_strtou64/correct", + test_qemu_strtou64_correct); + g_test_add_func("/cutils/qemu_strtou64/null", + test_qemu_strtou64_null); + g_test_add_func("/cutils/qemu_strtou64/empty", + test_qemu_strtou64_empty); + g_test_add_func("/cutils/qemu_strtou64/whitespace", + test_qemu_strtou64_whitespace); + g_test_add_func("/cutils/qemu_strtou64/invalid", + test_qemu_strtou64_invalid); + g_test_add_func("/cutils/qemu_strtou64/trailing", + test_qemu_strtou64_trailing); + g_test_add_func("/cutils/qemu_strtou64/octal", + test_qemu_strtou64_octal); + g_test_add_func("/cutils/qemu_strtou64/decimal", + test_qemu_strtou64_decimal); + g_test_add_func("/cutils/qemu_strtou64/hex", + test_qemu_strtou64_hex); + g_test_add_func("/cutils/qemu_strtou64/max", + test_qemu_strtou64_max); + g_test_add_func("/cutils/qemu_strtou64/overflow", + test_qemu_strtou64_overflow); + g_test_add_func("/cutils/qemu_strtou64/underflow", + test_qemu_strtou64_underflow); + g_test_add_func("/cutils/qemu_strtou64/negative", + test_qemu_strtou64_negative); + g_test_add_func("/cutils/qemu_strtou64_full/correct", + test_qemu_strtou64_full_correct); + g_test_add_func("/cutils/qemu_strtou64_full/null", + test_qemu_strtou64_full_null); + g_test_add_func("/cutils/qemu_strtou64_full/empty", + test_qemu_strtou64_full_empty); + g_test_add_func("/cutils/qemu_strtou64_full/negative", + test_qemu_strtou64_full_negative); + g_test_add_func("/cutils/qemu_strtou64_full/trailing", + test_qemu_strtou64_full_trailing); + g_test_add_func("/cutils/qemu_strtou64_full/max", + test_qemu_strtou64_full_max); =20 g_test_add_func("/cutils/strtosz/simple", test_qemu_strtosz_simple); diff --git a/util/cutils.c b/util/cutils.c index 1ae2a08..0dc9b28 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -372,7 +372,7 @@ int qemu_strtoul(const char *nptr, const char **endptr,= int base, * Works like qemu_strtol(), except it stores INT64_MAX on overflow, * and INT_MIN on underflow. */ -int qemu_strtoll(const char *nptr, const char **endptr, int base, +int qemu_strtoi64(const char *nptr, const char **endptr, int base, int64_t *result) { char *p; @@ -396,7 +396,7 @@ int qemu_strtoll(const char *nptr, const char **endptr,= int base, * * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow. */ -int qemu_strtoull(const char *nptr, const char **endptr, int base, +int qemu_strtou64(const char *nptr, const char **endptr, int base, uint64_t *result) { char *p; diff --git a/util/log.c b/util/log.c index e077340..96f30dd 100644 --- a/util/log.c +++ b/util/log.c @@ -183,13 +183,13 @@ void qemu_set_dfilter_ranges(const char *filter_spec,= Error **errp) goto out; } =20 - if (qemu_strtoull(r, &e, 0, &r1val) + if (qemu_strtou64(r, &e, 0, &r1val) || e !=3D range_op) { error_setg(errp, "Invalid number to the left of %.*s", (int)(r2 - range_op), range_op); goto out; } - if (qemu_strtoull(r2, NULL, 0, &r2val)) { + if (qemu_strtou64(r2, NULL, 0, &r2val)) { error_setg(errp, "Invalid number to the right of %.*s", (int)(r2 - range_op), range_op); goto out; --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069424828139.20415643181002; Tue, 14 Feb 2017 02:50:24 -0800 (PST) Received: from localhost ([::1]:33817 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdagh-00036k-KD for importer@patchew.org; Tue, 14 Feb 2017 05:50:23 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJQ-0005qt-IG for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003MW-GW for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58586) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LG-5e for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C31061D2B for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQEOD003172 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:15 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9116B11384B3; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:54 +0100 Message-Id: <1487067971-10443-8-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 07/24] util/cutils: Clean up variable names around qemu_strtol() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Name same things the same, different things differently. * qemu_strtol()'s parameter @nptr is called @p in check_strtox_error(). Rename the latter. * qemu_strtol()'s parameter @endptr is called @next in check_strtox_error(). Rename the latter. * qemu_strtol()'s variable @p is called @endptr in check_strtox_error(). Rename both to @ep. * qemu_strtol()'s variable @err is *negative* errno, check_strtox_error()'s parameter @err is *positive*. Rename the latter to @eno. Same for qemu_strtoul(), qemu_strtoi64(), qemu_strtou64(), of course. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- util/cutils.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/util/cutils.c b/util/cutils.c index 0dc9b28..7d165bc 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -260,21 +260,21 @@ int64_t qemu_strtosz(const char *nptr, char **end) } =20 /** - * Helper function for qemu_strto*l() functions. + * Helper function for error checking after strtol() and the like */ -static int check_strtox_error(const char *p, char *endptr, const char **ne= xt, - int err) +static int check_strtox_error(const char *nptr, char *ep, + const char **endptr, int eno) { - if (err =3D=3D 0 && endptr =3D=3D p) { - err =3D EINVAL; + if (eno =3D=3D 0 && ep =3D=3D nptr) { + eno =3D EINVAL; } - if (!next && *endptr) { + if (!endptr && *ep) { return -EINVAL; } - if (next) { - *next =3D endptr; + if (endptr) { + *endptr =3D ep; } - return -err; + return -eno; } =20 /** @@ -304,7 +304,7 @@ static int check_strtox_error(const char *p, char *endp= tr, const char **next, int qemu_strtol(const char *nptr, const char **endptr, int base, long *result) { - char *p; + char *ep; int err =3D 0; if (!nptr) { if (endptr) { @@ -313,8 +313,8 @@ int qemu_strtol(const char *nptr, const char **endptr, = int base, err =3D -EINVAL; } else { errno =3D 0; - *result =3D strtol(nptr, &p, base); - err =3D check_strtox_error(nptr, p, endptr, errno); + *result =3D strtol(nptr, &ep, base); + err =3D check_strtox_error(nptr, ep, endptr, errno); } return err; } @@ -347,7 +347,7 @@ int qemu_strtol(const char *nptr, const char **endptr, = int base, int qemu_strtoul(const char *nptr, const char **endptr, int base, unsigned long *result) { - char *p; + char *ep; int err =3D 0; if (!nptr) { if (endptr) { @@ -356,12 +356,12 @@ int qemu_strtoul(const char *nptr, const char **endpt= r, int base, err =3D -EINVAL; } else { errno =3D 0; - *result =3D strtoul(nptr, &p, base); + *result =3D strtoul(nptr, &ep, base); /* Windows returns 1 for negative out-of-range values. */ if (errno =3D=3D ERANGE) { *result =3D -1; } - err =3D check_strtox_error(nptr, p, endptr, errno); + err =3D check_strtox_error(nptr, ep, endptr, errno); } return err; } @@ -375,7 +375,7 @@ int qemu_strtoul(const char *nptr, const char **endptr,= int base, int qemu_strtoi64(const char *nptr, const char **endptr, int base, int64_t *result) { - char *p; + char *ep; int err =3D 0; if (!nptr) { if (endptr) { @@ -385,8 +385,8 @@ int qemu_strtoi64(const char *nptr, const char **endptr= , int base, } else { errno =3D 0; /* FIXME This assumes int64_t is long long */ - *result =3D strtoll(nptr, &p, base); - err =3D check_strtox_error(nptr, p, endptr, errno); + *result =3D strtoll(nptr, &ep, base); + err =3D check_strtox_error(nptr, ep, endptr, errno); } return err; } @@ -399,7 +399,7 @@ int qemu_strtoi64(const char *nptr, const char **endptr= , int base, int qemu_strtou64(const char *nptr, const char **endptr, int base, uint64_t *result) { - char *p; + char *ep; int err =3D 0; if (!nptr) { if (endptr) { @@ -409,12 +409,12 @@ int qemu_strtou64(const char *nptr, const char **endp= tr, int base, } else { errno =3D 0; /* FIXME This assumes uint64_t is unsigned long long */ - *result =3D strtoull(nptr, &p, base); + *result =3D strtoull(nptr, &ep, base); /* Windows returns 1 for negative out-of-range values. */ if (errno =3D=3D ERANGE) { *result =3D -1; } - err =3D check_strtox_error(nptr, p, endptr, errno); + err =3D check_strtox_error(nptr, ep, endptr, errno); } return err; } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069161362173.57898754252676; Tue, 14 Feb 2017 02:46:01 -0800 (PST) Received: from localhost ([::1]:33796 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdacS-0007OO-0a for importer@patchew.org; Tue, 14 Feb 2017 05:46:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38769) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJP-0005qn-Ay for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003MM-FE for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53132) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LP-5j for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 597FA3D956 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQEMB024036 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:15 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9412811384B4; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:55 +0100 Message-Id: <1487067971-10443-9-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 08/24] util/cutils: Clean up control flow around qemu_strtol() a bit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reorder check_strtox_error() to make it obvious that we always store through a non-null @endptr. Transform if (some error) { error case ... err =3D value for error case; } else { normal case ... err =3D value for normal case; } return err; to if (some error) { error case ... return value for error case; } normal case ... return value for normal case; Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- util/cutils.c | 89 ++++++++++++++++++++++++++++++-------------------------= ---- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/util/cutils.c b/util/cutils.c index 7d165bc..7442d46 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -265,15 +265,20 @@ int64_t qemu_strtosz(const char *nptr, char **end) static int check_strtox_error(const char *nptr, char *ep, const char **endptr, int eno) { - if (eno =3D=3D 0 && ep =3D=3D nptr) { - eno =3D EINVAL; - } - if (!endptr && *ep) { - return -EINVAL; - } if (endptr) { *endptr =3D ep; } + + /* Turn "no conversion" into an error */ + if (eno =3D=3D 0 && ep =3D=3D nptr) { + return -EINVAL; + } + + /* Fail when we're expected to consume the string, but didn't */ + if (!endptr && *ep) { + return -EINVAL; + } + return -eno; } =20 @@ -305,18 +310,17 @@ int qemu_strtol(const char *nptr, const char **endptr= , int base, long *result) { char *ep; - int err =3D 0; + if (!nptr) { if (endptr) { *endptr =3D nptr; } - err =3D -EINVAL; - } else { - errno =3D 0; - *result =3D strtol(nptr, &ep, base); - err =3D check_strtox_error(nptr, ep, endptr, errno); + return -EINVAL; } - return err; + + errno =3D 0; + *result =3D strtol(nptr, &ep, base); + return check_strtox_error(nptr, ep, endptr, errno); } =20 /** @@ -348,22 +352,21 @@ int qemu_strtoul(const char *nptr, const char **endpt= r, int base, unsigned long *result) { char *ep; - int err =3D 0; + if (!nptr) { if (endptr) { *endptr =3D nptr; } - err =3D -EINVAL; - } else { - errno =3D 0; - *result =3D strtoul(nptr, &ep, base); - /* Windows returns 1 for negative out-of-range values. */ - if (errno =3D=3D ERANGE) { - *result =3D -1; - } - err =3D check_strtox_error(nptr, ep, endptr, errno); + return -EINVAL; } - return err; + + errno =3D 0; + *result =3D strtoul(nptr, &ep, base); + /* Windows returns 1 for negative out-of-range values. */ + if (errno =3D=3D ERANGE) { + *result =3D -1; + } + return check_strtox_error(nptr, ep, endptr, errno); } =20 /** @@ -376,19 +379,18 @@ int qemu_strtoi64(const char *nptr, const char **endp= tr, int base, int64_t *result) { char *ep; - int err =3D 0; + if (!nptr) { if (endptr) { *endptr =3D nptr; } - err =3D -EINVAL; - } else { - errno =3D 0; - /* FIXME This assumes int64_t is long long */ - *result =3D strtoll(nptr, &ep, base); - err =3D check_strtox_error(nptr, ep, endptr, errno); + return -EINVAL; } - return err; + + errno =3D 0; + /* FIXME This assumes int64_t is long long */ + *result =3D strtoll(nptr, &ep, base); + return check_strtox_error(nptr, ep, endptr, errno); } =20 /** @@ -400,23 +402,22 @@ int qemu_strtou64(const char *nptr, const char **endp= tr, int base, uint64_t *result) { char *ep; - int err =3D 0; + if (!nptr) { if (endptr) { *endptr =3D nptr; } - err =3D -EINVAL; - } else { - errno =3D 0; - /* FIXME This assumes uint64_t is unsigned long long */ - *result =3D strtoull(nptr, &ep, base); - /* Windows returns 1 for negative out-of-range values. */ - if (errno =3D=3D ERANGE) { - *result =3D -1; - } - err =3D check_strtox_error(nptr, ep, endptr, errno); + return -EINVAL; } - return err; + + errno =3D 0; + /* FIXME This assumes uint64_t is unsigned long long */ + *result =3D strtoull(nptr, &ep, base); + /* Windows returns 1 for negative out-of-range values. */ + if (errno =3D=3D ERANGE) { + *result =3D -1; + } + return check_strtox_error(nptr, ep, endptr, errno); } =20 /** --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068657804807.9228277943254; Tue, 14 Feb 2017 02:37:37 -0800 (PST) Received: from localhost ([::1]:33750 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaUK-0007oP-8F for importer@patchew.org; Tue, 14 Feb 2017 05:37:36 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38741) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qk-If for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003MA-Bh for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51852) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LM-5H for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 553D63A7698 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFo0023203 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 96F8211384B5; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:56 +0100 Message-Id: <1487067971-10443-10-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 09/24] QemuOpts: Fix to reject numbers that overflow uint64_t X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" parse_option_number() fails to check for overflow after strtoull(). Has always been broken. Fix that. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-qemu-opts.c | 14 ++++++-------- util/qemu-option.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index f4426bb..6a9d3c5 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -585,17 +585,15 @@ static void test_opts_parse_number(void) =20 /* Above upper limit */ opts =3D qemu_opts_parse(&opts_list_01, "number1=3D1844674407370955161= 6", - false, &error_abort); - /* BUG: should reject */ - g_assert_cmpuint(opts_count(opts), =3D=3D, 1); - g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, UINT= 64_MAX); + false, &err); + error_free_or_abort(&err); + g_assert(!opts); =20 /* Below lower limit */ opts =3D qemu_opts_parse(&opts_list_01, "number1=3D-184467440737095516= 16", - false, &error_abort); - /* BUG: should reject */ - g_assert_cmpuint(opts_count(opts), =3D=3D, 1); - g_assert_cmpuint(qemu_opt_get_number(opts, "number1", 1), =3D=3D, UINT= 64_MAX); + false, &err); + error_free_or_abort(&err); + g_assert(!opts); =20 /* Hex and octal */ opts =3D qemu_opts_parse(&opts_list_01, "number1=3D0x2a,number2=3D052", diff --git a/util/qemu-option.c b/util/qemu-option.c index 2b4e0c9..5d82327 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -141,11 +141,16 @@ static void parse_option_bool(const char *name, const= char *value, bool *ret, static void parse_option_number(const char *name, const char *value, uint64_t *ret, Error **errp) { - char *postfix; uint64_t number; + int err; =20 - number =3D strtoull(value, &postfix, 0); - if (*postfix !=3D '\0') { + err =3D qemu_strtou64(value, NULL, 0, &number); + if (err =3D=3D -ERANGE) { + error_setg(errp, "Value '%s' is too large for parameter '%s'", + value, name); + return; + } + if (err) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a number"); return; } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068908419809.7380284732513; Tue, 14 Feb 2017 02:41:48 -0800 (PST) Received: from localhost ([::1]:33773 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaYN-000335-40 for importer@patchew.org; Tue, 14 Feb 2017 05:41:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38790) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJP-0005qo-O5 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003MT-Gd for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36700) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LU-6A for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5D7FA85540 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFES003176 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 99CD511384B6; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:57 +0100 Message-Id: <1487067971-10443-11-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 10/24] tests/test-cutils: Add missing qemu_strtosz()... endptr checks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tests/test-cutils.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 47cc8a4..2dc6832 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1393,60 +1393,75 @@ static void test_qemu_strtosz_units(void) const char *t =3D "1T"; const char *p =3D "1P"; const char *e =3D "1E"; + char *endptr =3D NULL; int64_t res; =20 /* default is M */ - res =3D qemu_strtosz(none, NULL); + res =3D qemu_strtosz(none, &endptr); g_assert_cmpint(res, =3D=3D, M_BYTE); + g_assert(endptr =3D=3D none + 1); =20 - res =3D qemu_strtosz(b, NULL); + res =3D qemu_strtosz(b, &endptr); g_assert_cmpint(res, =3D=3D, 1); + g_assert(endptr =3D=3D b + 2); =20 - res =3D qemu_strtosz(k, NULL); + res =3D qemu_strtosz(k, &endptr); g_assert_cmpint(res, =3D=3D, K_BYTE); + g_assert(endptr =3D=3D k + 2); =20 - res =3D qemu_strtosz(m, NULL); + res =3D qemu_strtosz(m, &endptr); g_assert_cmpint(res, =3D=3D, M_BYTE); + g_assert(endptr =3D=3D m + 2); =20 - res =3D qemu_strtosz(g, NULL); + res =3D qemu_strtosz(g, &endptr); g_assert_cmpint(res, =3D=3D, G_BYTE); + g_assert(endptr =3D=3D g + 2); =20 - res =3D qemu_strtosz(t, NULL); + res =3D qemu_strtosz(t, &endptr); g_assert_cmpint(res, =3D=3D, T_BYTE); + g_assert(endptr =3D=3D t + 2); =20 - res =3D qemu_strtosz(p, NULL); + res =3D qemu_strtosz(p, &endptr); g_assert_cmpint(res, =3D=3D, P_BYTE); + g_assert(endptr =3D=3D p + 2); =20 - res =3D qemu_strtosz(e, NULL); + res =3D qemu_strtosz(e, &endptr); g_assert_cmpint(res, =3D=3D, E_BYTE); + g_assert(endptr =3D=3D e + 2); } =20 static void test_qemu_strtosz_float(void) { const char *str =3D "12.345M"; + char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz(str, NULL); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 12.345 * M_BYTE); + g_assert(endptr =3D=3D str + 7); } =20 static void test_qemu_strtosz_erange(void) { const char *str =3D "10E"; + char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz(str, NULL); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); + g_assert(endptr =3D=3D str + 3); } =20 static void test_qemu_strtosz_suffix_unit(void) { const char *str =3D "12345"; + char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz_suffix_unit(str, NULL, + res =3D qemu_strtosz_suffix_unit(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_KB, 1000); g_assert_cmpint(res, =3D=3D, 12345000); + g_assert(endptr =3D=3D str + 5); } =20 int main(int argc, char **argv) --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068107388553.5991017626651; Tue, 14 Feb 2017 02:28:27 -0800 (PST) Received: from localhost ([::1]:33699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaLR-0007fE-PJ for importer@patchew.org; Tue, 14 Feb 2017 05:28:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38729) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qe-Gd for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003MF-Bg for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54066) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LI-5c for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 52D5E7E9E3 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFWC001973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9CB3411384B7; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:58 +0100 Message-Id: <1487067971-10443-12-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 11/24] tests/test-cutils: Cover qemu_strtosz() invalid input X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 2dc6832..3dcd4c1 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1441,6 +1441,28 @@ static void test_qemu_strtosz_float(void) g_assert(endptr =3D=3D str + 7); } =20 +static void test_qemu_strtosz_invalid(void) +{ + const char *str; + char *endptr =3D NULL; + int64_t res; + + str =3D ""; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); + + str =3D " \t "; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); + + str =3D "crap"; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, -EINVAL); + g_assert(endptr =3D=3D str); +} + static void test_qemu_strtosz_erange(void) { const char *str =3D "10E"; @@ -1652,6 +1674,8 @@ int main(int argc, char **argv) test_qemu_strtosz_units); g_test_add_func("/cutils/strtosz/float", test_qemu_strtosz_float); + g_test_add_func("/cutils/strtosz/invalid", + test_qemu_strtosz_invalid); g_test_add_func("/cutils/strtosz/erange", test_qemu_strtosz_erange); g_test_add_func("/cutils/strtosz/suffix-unit", --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068125715248.28034156056526; Tue, 14 Feb 2017 02:28:45 -0800 (PST) Received: from localhost ([::1]:33702 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaLi-0007rg-D8 for importer@patchew.org; Tue, 14 Feb 2017 05:28:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38726) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJO-0005qc-FN for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003M4-AT for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53130) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LO-5U for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5935C3D955 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFtg023206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9F9F911384B8; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:25:59 +0100 Message-Id: <1487067971-10443-13-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 12/24] tests/test-cutils: Cover qemu_strtosz() with trailing crap X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 3dcd4c1..ec65d27 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1463,6 +1463,23 @@ static void test_qemu_strtosz_invalid(void) g_assert(endptr =3D=3D str); } =20 +static void test_qemu_strtosz_trailing(void) +{ + const char *str; + char *endptr =3D NULL; + int64_t res; + + str =3D "123xxx"; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, 123 * M_BYTE); + g_assert(endptr =3D=3D str + 3); + + str =3D "1kiB"; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, 1024); + g_assert(endptr =3D=3D str + 2); +} + static void test_qemu_strtosz_erange(void) { const char *str =3D "10E"; @@ -1676,6 +1693,8 @@ int main(int argc, char **argv) test_qemu_strtosz_float); g_test_add_func("/cutils/strtosz/invalid", test_qemu_strtosz_invalid); + g_test_add_func("/cutils/strtosz/trailing", + test_qemu_strtosz_trailing); g_test_add_func("/cutils/strtosz/erange", test_qemu_strtosz_erange); g_test_add_func("/cutils/strtosz/suffix-unit", --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069430308321.2035587893006; Tue, 14 Feb 2017 02:50:30 -0800 (PST) Received: from localhost ([::1]:33819 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdagm-0003A1-1M for importer@patchew.org; Tue, 14 Feb 2017 05:50:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38813) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJQ-0005qr-2x for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003Me-It for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54702) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003LW-8x for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 70D97C04B950 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFuc001976 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A28FE11384B9; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:00 +0100 Message-Id: <1487067971-10443-14-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 13/24] tests/test-cutils: Cover qemu_strtosz() around range limits X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index ec65d27..af52ac5 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1371,16 +1371,52 @@ static void test_qemu_strtou64_full_max(void) =20 static void test_qemu_strtosz_simple(void) { - const char *str =3D "12345M"; + const char *str; char *endptr =3D NULL; int64_t res; =20 + str =3D "0"; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, 0); + g_assert(endptr =3D=3D str + 1); + + str =3D "12345M"; res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); g_assert(endptr =3D=3D str + 6); =20 res =3D qemu_strtosz(str, NULL); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); + + /* Note: precision is 53 bits since we're parsing with strtod() */ + + str =3D "9007199254740991"; /* 2^53-1 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, 0x1fffffffffffff); + g_assert(endptr =3D=3D str + 16); + + str =3D "9007199254740992"; /* 2^53 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, 0x20000000000000); + g_assert(endptr =3D=3D str + 16); + + str =3D "9007199254740993"; /* 2^53+1 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, 0x20000000000000); /* rounded to 53 bits = */ + g_assert(endptr =3D=3D str + 16); + + str =3D "9223372036854774784"; /* 0x7ffffffffffffc00 (53 msbs set) */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); + g_assert(endptr =3D=3D str + 19); + + str =3D "9223372036854775295"; /* 0x7ffffffffffffdff */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); /* rounded to 53 bit= s */ + g_assert(endptr =3D=3D str + 19); + + /* 0x7ffffffffffffe00..0x7fffffffffffffff get rounded to + * 0x8000000000000000, thus -ERANGE; see test_qemu_strtosz_erange() */ } =20 static void test_qemu_strtosz_units(void) @@ -1482,10 +1518,31 @@ static void test_qemu_strtosz_trailing(void) =20 static void test_qemu_strtosz_erange(void) { - const char *str =3D "10E"; + const char *str; char *endptr =3D NULL; int64_t res; =20 + str =3D "-1"; + res =3D qemu_strtosz(str, &endptr); + g_assert_cmpint(res, =3D=3D, -ERANGE); + g_assert(endptr =3D=3D str + 2); + + str =3D "9223372036854775296"; /* 0x7ffffffffffffe00 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, -ERANGE); + g_assert(endptr =3D=3D str + 19); + + str =3D "9223372036854775807"; /* 2^63-1 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, -ERANGE); + g_assert(endptr =3D=3D str + 19); + + str =3D "9223372036854775808"; /* 2^63 */ + res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + g_assert_cmpint(res, =3D=3D, -ERANGE); + g_assert(endptr =3D=3D str + 19); + + str =3D "10E"; res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 3); --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068650106993.8584746052796; Tue, 14 Feb 2017 02:37:30 -0800 (PST) Received: from localhost ([::1]:33749 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaUB-0007Sz-Ai for importer@patchew.org; Tue, 14 Feb 2017 05:37:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJP-0005qq-Va for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJM-0003Mn-Mu for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39916) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJM-0003La-EK for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:16 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 981AAC0567B2 for ; Tue, 14 Feb 2017 10:26:16 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQFop001978 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:16 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A568311384BA; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:01 +0100 Message-Id: <1487067971-10443-15-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 14 Feb 2017 10:26:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 14/24] util/cutils: New qemu_strtosz_metric() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" To parse numbers with metric suffixes, we use qemu_strtosz_suffix_unit(nptr, &eptr, QEMU_STRTOSZ_DEFSUFFIX_B, 1000) Capture this in a new function for legibility: qemu_strtosz_metric(nptr, &eptr) Replace test_qemu_strtosz_suffix_unit() by test_qemu_strtosz_metric(). Rename qemu_strtosz_suffix_unit() to do_strtosz() and give it internal linkage. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- include/qemu/cutils.h | 4 ++-- target/i386/cpu.c | 3 +-- tests/test-cutils.c | 13 ++++++------- util/cutils.c | 11 ++++++++--- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index f922223..81613d0 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -156,8 +156,8 @@ int parse_uint_full(const char *s, unsigned long long *= value, int base); int64_t qemu_strtosz(const char *nptr, char **end); int64_t qemu_strtosz_suffix(const char *nptr, char **end, const char default_suffix); -int64_t qemu_strtosz_suffix_unit(const char *nptr, char **end, - const char default_suffix, int64_t unit); +int64_t qemu_strtosz_metric(const char *nptr, char **end); + #define K_BYTE (1ULL << 10) #define M_BYTE (1ULL << 20) #define G_BYTE (1ULL << 30) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index eb49980..3a8d72d 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2036,8 +2036,7 @@ static void x86_cpu_parse_featurestr(const char *type= name, char *features, int64_t tsc_freq; char *err; =20 - tsc_freq =3D qemu_strtosz_suffix_unit(val, &err, - QEMU_STRTOSZ_DEFSUFFIX_B, 1000); + tsc_freq =3D qemu_strtosz_metric(val, &err); if (tsc_freq < 0 || *err) { error_setg(errp, "bad numerical value %s", val); return; diff --git a/tests/test-cutils.c b/tests/test-cutils.c index af52ac5..383f812 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1548,16 +1548,15 @@ static void test_qemu_strtosz_erange(void) g_assert(endptr =3D=3D str + 3); } =20 -static void test_qemu_strtosz_suffix_unit(void) +static void test_qemu_strtosz_metric(void) { - const char *str =3D "12345"; + const char *str =3D "12345k"; char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz_suffix_unit(str, &endptr, - QEMU_STRTOSZ_DEFSUFFIX_KB, 1000); + res =3D qemu_strtosz_metric(str, &endptr); g_assert_cmpint(res, =3D=3D, 12345000); - g_assert(endptr =3D=3D str + 5); + g_assert(endptr =3D=3D str + 6); } =20 int main(int argc, char **argv) @@ -1754,8 +1753,8 @@ int main(int argc, char **argv) test_qemu_strtosz_trailing); g_test_add_func("/cutils/strtosz/erange", test_qemu_strtosz_erange); - g_test_add_func("/cutils/strtosz/suffix-unit", - test_qemu_strtosz_suffix_unit); + g_test_add_func("/cutils/strtosz/metric", + test_qemu_strtosz_metric); =20 return g_test_run(); } diff --git a/util/cutils.c b/util/cutils.c index 7442d46..8a506e7 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -205,8 +205,8 @@ static int64_t suffix_mul(char suffix, int64_t unit) * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on * other error. */ -int64_t qemu_strtosz_suffix_unit(const char *nptr, char **end, - const char default_suffix, int64_t unit) +static int64_t do_strtosz(const char *nptr, char **end, + const char default_suffix, int64_t unit) { int64_t retval =3D -EINVAL; char *endptr; @@ -251,7 +251,7 @@ fail: int64_t qemu_strtosz_suffix(const char *nptr, char **end, const char default_suffix) { - return qemu_strtosz_suffix_unit(nptr, end, default_suffix, 1024); + return do_strtosz(nptr, end, default_suffix, 1024); } =20 int64_t qemu_strtosz(const char *nptr, char **end) @@ -259,6 +259,11 @@ int64_t qemu_strtosz(const char *nptr, char **end) return qemu_strtosz_suffix(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB); } =20 +int64_t qemu_strtosz_metric(const char *nptr, char **end) +{ + return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_B, 1000); +} + /** * Helper function for error checking after strtol() and the like */ --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068920805634.7756584174579; Tue, 14 Feb 2017 02:42:00 -0800 (PST) Received: from localhost ([::1]:33774 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaYZ-0003EY-GV for importer@patchew.org; Tue, 14 Feb 2017 05:41:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38850) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJR-0005r9-3P for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJN-0003OC-W0 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51864) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NF-Nf for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:17 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E2BDD19D241 for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGC0023214 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A845D11384BC; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:02 +0100 Message-Id: <1487067971-10443-16-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 14 Feb 2017 10:26:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 15/24] util/cutils: Rename qemu_strtosz() to qemu_strtosz_mebi() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" With qemu_strtosz(), no suffix means mebibytes. It's used rarely. I'm going to add a similar function where no suffix means bytes. Rename qemu_strtosz() to qemu_strtosz_mebi() to make the name qemu_strtosz() available for the new function. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- hmp.c | 2 +- hw/misc/ivshmem.c | 2 +- include/qemu/cutils.h | 2 +- monitor.c | 2 +- tests/test-cutils.c | 38 +++++++++++++++++++------------------- util/cutils.c | 2 +- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/hmp.c b/hmp.c index 2bc4f06..6d0d05b 100644 --- a/hmp.c +++ b/hmp.c @@ -1379,7 +1379,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) break; case MIGRATION_PARAMETER_MAX_BANDWIDTH: p.has_max_bandwidth =3D true; - valuebw =3D qemu_strtosz(valuestr, &endp); + valuebw =3D qemu_strtosz_mebi(valuestr, &endp); if (valuebw < 0 || (size_t)valuebw !=3D valuebw || *endp !=3D '\0') { error_setg(&err, "Invalid size %s", valuestr); diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index bf57e63..382dd8b 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1268,7 +1268,7 @@ static void ivshmem_realize(PCIDevice *dev, Error **e= rrp) s->legacy_size =3D 4 << 20; /* 4 MB default */ } else { char *end; - int64_t size =3D qemu_strtosz(s->sizearg, &end); + int64_t size =3D qemu_strtosz_mebi(s->sizearg, &end); if (size < 0 || (size_t)size !=3D size || *end !=3D '\0' || !is_power_of_2(size)) { error_setg(errp, "Invalid size %s", s->sizearg); diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index 81613d0..5f4e138 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -153,9 +153,9 @@ int parse_uint_full(const char *s, unsigned long long *= value, int base); #define QEMU_STRTOSZ_DEFSUFFIX_MB 'M' #define QEMU_STRTOSZ_DEFSUFFIX_KB 'K' #define QEMU_STRTOSZ_DEFSUFFIX_B 'B' -int64_t qemu_strtosz(const char *nptr, char **end); int64_t qemu_strtosz_suffix(const char *nptr, char **end, const char default_suffix); +int64_t qemu_strtosz_mebi(const char *nptr, char **end); int64_t qemu_strtosz_metric(const char *nptr, char **end); =20 #define K_BYTE (1ULL << 10) diff --git a/monitor.c b/monitor.c index 3cd72a9..1f8c031 100644 --- a/monitor.c +++ b/monitor.c @@ -2785,7 +2785,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, break; } } - val =3D qemu_strtosz(p, &end); + val =3D qemu_strtosz_mebi(p, &end); if (val < 0) { monitor_printf(mon, "invalid size\n"); goto fail; diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 383f812..86d36b7 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1376,16 +1376,16 @@ static void test_qemu_strtosz_simple(void) int64_t res; =20 str =3D "0"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, 0); g_assert(endptr =3D=3D str + 1); =20 str =3D "12345M"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); g_assert(endptr =3D=3D str + 6); =20 - res =3D qemu_strtosz(str, NULL); + res =3D qemu_strtosz_mebi(str, NULL); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); =20 /* Note: precision is 53 bits since we're parsing with strtod() */ @@ -1433,35 +1433,35 @@ static void test_qemu_strtosz_units(void) int64_t res; =20 /* default is M */ - res =3D qemu_strtosz(none, &endptr); + res =3D qemu_strtosz_mebi(none, &endptr); g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D none + 1); =20 - res =3D qemu_strtosz(b, &endptr); + res =3D qemu_strtosz_mebi(b, &endptr); g_assert_cmpint(res, =3D=3D, 1); g_assert(endptr =3D=3D b + 2); =20 - res =3D qemu_strtosz(k, &endptr); + res =3D qemu_strtosz_mebi(k, &endptr); g_assert_cmpint(res, =3D=3D, K_BYTE); g_assert(endptr =3D=3D k + 2); =20 - res =3D qemu_strtosz(m, &endptr); + res =3D qemu_strtosz_mebi(m, &endptr); g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D m + 2); =20 - res =3D qemu_strtosz(g, &endptr); + res =3D qemu_strtosz_mebi(g, &endptr); g_assert_cmpint(res, =3D=3D, G_BYTE); g_assert(endptr =3D=3D g + 2); =20 - res =3D qemu_strtosz(t, &endptr); + res =3D qemu_strtosz_mebi(t, &endptr); g_assert_cmpint(res, =3D=3D, T_BYTE); g_assert(endptr =3D=3D t + 2); =20 - res =3D qemu_strtosz(p, &endptr); + res =3D qemu_strtosz_mebi(p, &endptr); g_assert_cmpint(res, =3D=3D, P_BYTE); g_assert(endptr =3D=3D p + 2); =20 - res =3D qemu_strtosz(e, &endptr); + res =3D qemu_strtosz_mebi(e, &endptr); g_assert_cmpint(res, =3D=3D, E_BYTE); g_assert(endptr =3D=3D e + 2); } @@ -1472,7 +1472,7 @@ static void test_qemu_strtosz_float(void) char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, 12.345 * M_BYTE); g_assert(endptr =3D=3D str + 7); } @@ -1484,17 +1484,17 @@ static void test_qemu_strtosz_invalid(void) int64_t res; =20 str =3D ""; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D " \t "; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D "crap"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } @@ -1506,12 +1506,12 @@ static void test_qemu_strtosz_trailing(void) int64_t res; =20 str =3D "123xxx"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, 123 * M_BYTE); g_assert(endptr =3D=3D str + 3); =20 str =3D "1kiB"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, 1024); g_assert(endptr =3D=3D str + 2); } @@ -1523,7 +1523,7 @@ static void test_qemu_strtosz_erange(void) int64_t res; =20 str =3D "-1"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 2); =20 @@ -1543,7 +1543,7 @@ static void test_qemu_strtosz_erange(void) g_assert(endptr =3D=3D str + 19); =20 str =3D "10E"; - res =3D qemu_strtosz(str, &endptr); + res =3D qemu_strtosz_mebi(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 3); } diff --git a/util/cutils.c b/util/cutils.c index 8a506e7..0315d5d 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -254,7 +254,7 @@ int64_t qemu_strtosz_suffix(const char *nptr, char **en= d, return do_strtosz(nptr, end, default_suffix, 1024); } =20 -int64_t qemu_strtosz(const char *nptr, char **end) +int64_t qemu_strtosz_mebi(const char *nptr, char **end) { return qemu_strtosz_suffix(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB); } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069646255367.54108420194154; Tue, 14 Feb 2017 02:54:06 -0800 (PST) Received: from localhost ([::1]:33850 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdakG-0006eK-Ib for importer@patchew.org; Tue, 14 Feb 2017 05:54:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38984) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJV-0005vz-RW for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJO-0003OI-1J for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39926) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NI-O4 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:17 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E5DF4C0567B2 for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGkK001993 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id AB25211384BD; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:03 +0100 Message-Id: <1487067971-10443-17-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 14 Feb 2017 10:26:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 16/24] util/cutils: New qemu_strtosz() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Most callers of qemu_strtosz_suffix() pass QEMU_STRTOSZ_DEFSUFFIX_B. Capture the pattern in new qemu_strtosz(). Inline qemu_strtosz_suffix() into its only remaining caller. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- include/qemu/cutils.h | 17 +---------------- qapi/opts-visitor.c | 3 +-- qemu-img.c | 18 ++++++++---------- qemu-io-cmds.c | 2 +- tests/test-cutils.c | 16 ++++++++-------- util/cutils.c | 15 +++++++++++---- 6 files changed, 30 insertions(+), 41 deletions(-) diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index 5f4e138..4184851 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -139,22 +139,7 @@ int parse_uint(const char *s, unsigned long long *valu= e, char **endptr, int base); int parse_uint_full(const char *s, unsigned long long *value, int base); =20 -/* - * qemu_strtosz() suffixes used to specify the default treatment of an - * argument passed to qemu_strtosz() without an explicit suffix. - * These should be defined using upper case characters in the range - * A-Z, as qemu_strtosz() will use qemu_toupper() on the given argument - * prior to comparison. - */ -#define QEMU_STRTOSZ_DEFSUFFIX_EB 'E' -#define QEMU_STRTOSZ_DEFSUFFIX_PB 'P' -#define QEMU_STRTOSZ_DEFSUFFIX_TB 'T' -#define QEMU_STRTOSZ_DEFSUFFIX_GB 'G' -#define QEMU_STRTOSZ_DEFSUFFIX_MB 'M' -#define QEMU_STRTOSZ_DEFSUFFIX_KB 'K' -#define QEMU_STRTOSZ_DEFSUFFIX_B 'B' -int64_t qemu_strtosz_suffix(const char *nptr, char **end, - const char default_suffix); +int64_t qemu_strtosz(const char *nptr, char **end); int64_t qemu_strtosz_mebi(const char *nptr, char **end); int64_t qemu_strtosz_metric(const char *nptr, char **end); =20 diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 1048bbc..360d337 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -489,8 +489,7 @@ opts_type_size(Visitor *v, const char *name, uint64_t *= obj, Error **errp) return; } =20 - val =3D qemu_strtosz_suffix(opt->str ? opt->str : "", &endptr, - QEMU_STRTOSZ_DEFSUFFIX_B); + val =3D qemu_strtosz(opt->str ? opt->str : "", &endptr); if (val < 0 || *endptr) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, "a size value representible as a non-negative int64"); diff --git a/qemu-img.c b/qemu-img.c index 74e3362..4407244 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -462,8 +462,7 @@ static int img_create(int argc, char **argv) if (optind < argc) { int64_t sval; char *end; - sval =3D qemu_strtosz_suffix(argv[optind++], &end, - QEMU_STRTOSZ_DEFSUFFIX_B); + sval =3D qemu_strtosz(argv[optind++], &end); if (sval < 0 || *end) { if (sval =3D=3D -ERANGE) { error_report("Image size must be less than 8 EiB!"); @@ -1863,7 +1862,7 @@ static int img_convert(int argc, char **argv) { int64_t sval; char *end; - sval =3D qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUF= FIX_B); + sval =3D qemu_strtosz(optarg, &end); if (sval < 0 || *end) { error_report("Invalid minimum zero buffer size for sparse = output specified"); ret =3D -1; @@ -3651,8 +3650,7 @@ static int img_bench(int argc, char **argv) { char *end; errno =3D 0; - offset =3D qemu_strtosz_suffix(optarg, &end, - QEMU_STRTOSZ_DEFSUFFIX_B); + offset =3D qemu_strtosz(optarg, &end); if (offset < 0|| *end) { error_report("Invalid offset specified"); return 1; @@ -3668,7 +3666,7 @@ static int img_bench(int argc, char **argv) int64_t sval; char *end; =20 - sval =3D qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUF= FIX_B); + sval =3D qemu_strtosz(optarg, &end); if (sval < 0 || sval > INT_MAX || *end) { error_report("Invalid buffer size specified"); return 1; @@ -3682,7 +3680,7 @@ static int img_bench(int argc, char **argv) int64_t sval; char *end; =20 - sval =3D qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUF= FIX_B); + sval =3D qemu_strtosz(optarg, &end); if (sval < 0 || sval > INT_MAX || *end) { error_report("Invalid step size specified"); return 1; @@ -3845,7 +3843,7 @@ static int img_dd_bs(const char *arg, char *end; int64_t res; =20 - res =3D qemu_strtosz_suffix(arg, &end, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(arg, &end); =20 if (res <=3D 0 || res > INT_MAX || *end) { error_report("invalid number: '%s'", arg); @@ -3862,7 +3860,7 @@ static int img_dd_count(const char *arg, { char *end; =20 - dd->count =3D qemu_strtosz_suffix(arg, &end, QEMU_STRTOSZ_DEFSUFFIX_B); + dd->count =3D qemu_strtosz(arg, &end); =20 if (dd->count < 0 || *end) { error_report("invalid number: '%s'", arg); @@ -3896,7 +3894,7 @@ static int img_dd_skip(const char *arg, { char *end; =20 - in->offset =3D qemu_strtosz_suffix(arg, &end, QEMU_STRTOSZ_DEFSUFFIX_B= ); + in->offset =3D qemu_strtosz(arg, &end); =20 if (in->offset < 0 || *end) { error_report("invalid number: '%s'", arg); diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index 95bcde1..6b7a89c 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -140,7 +140,7 @@ static int64_t cvtnum(const char *s) char *end; int64_t ret; =20 - ret =3D qemu_strtosz_suffix(s, &end, QEMU_STRTOSZ_DEFSUFFIX_B); + ret =3D qemu_strtosz(s, &end); if (*end !=3D '\0') { /* Detritus at the end of the string */ return -EINVAL; diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 86d36b7..e28151b 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1391,27 +1391,27 @@ static void test_qemu_strtosz_simple(void) /* Note: precision is 53 bits since we're parsing with strtod() */ =20 str =3D "9007199254740991"; /* 2^53-1 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0x1fffffffffffff); g_assert(endptr =3D=3D str + 16); =20 str =3D "9007199254740992"; /* 2^53 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0x20000000000000); g_assert(endptr =3D=3D str + 16); =20 str =3D "9007199254740993"; /* 2^53+1 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0x20000000000000); /* rounded to 53 bits = */ g_assert(endptr =3D=3D str + 16); =20 str =3D "9223372036854774784"; /* 0x7ffffffffffffc00 (53 msbs set) */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775295"; /* 0x7ffffffffffffdff */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); /* rounded to 53 bit= s */ g_assert(endptr =3D=3D str + 19); =20 @@ -1528,17 +1528,17 @@ static void test_qemu_strtosz_erange(void) g_assert(endptr =3D=3D str + 2); =20 str =3D "9223372036854775296"; /* 0x7ffffffffffffe00 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775807"; /* 2^63-1 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775808"; /* 2^63 */ - res =3D qemu_strtosz_suffix(str, &endptr, QEMU_STRTOSZ_DEFSUFFIX_B); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 diff --git a/util/cutils.c b/util/cutils.c index 0315d5d..ef658bb 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -178,6 +178,14 @@ int fcntl_setfl(int fd, int flag) } #endif =20 +#define QEMU_STRTOSZ_DEFSUFFIX_EB 'E' +#define QEMU_STRTOSZ_DEFSUFFIX_PB 'P' +#define QEMU_STRTOSZ_DEFSUFFIX_TB 'T' +#define QEMU_STRTOSZ_DEFSUFFIX_GB 'G' +#define QEMU_STRTOSZ_DEFSUFFIX_MB 'M' +#define QEMU_STRTOSZ_DEFSUFFIX_KB 'K' +#define QEMU_STRTOSZ_DEFSUFFIX_B 'B' + static int64_t suffix_mul(char suffix, int64_t unit) { switch (qemu_toupper(suffix)) { @@ -248,15 +256,14 @@ fail: return retval; } =20 -int64_t qemu_strtosz_suffix(const char *nptr, char **end, - const char default_suffix) +int64_t qemu_strtosz(const char *nptr, char **end) { - return do_strtosz(nptr, end, default_suffix, 1024); + return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_B, 1024); } =20 int64_t qemu_strtosz_mebi(const char *nptr, char **end) { - return qemu_strtosz_suffix(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB); + return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB, 1024); } =20 int64_t qemu_strtosz_metric(const char *nptr, char **end) --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068901037753.5918897798273; Tue, 14 Feb 2017 02:41:41 -0800 (PST) Received: from localhost ([::1]:33772 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaYF-0002x2-I1 for importer@patchew.org; Tue, 14 Feb 2017 05:41:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38823) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJQ-0005qs-9L for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJN-0003Nu-R3 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40884) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NB-Ky for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:17 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D33EE4E028 for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A0FB4ACB84 for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id AE27311384BE; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:04 +0100 Message-Id: <1487067971-10443-18-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 14 Feb 2017 10:26:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 17/24] util/cutils: Drop QEMU_STRTOSZ_DEFSUFFIX_* macros X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Writing QEMU_STRTOSZ_DEFSUFFIX_* instead of '*' gains nothing. Get rid of these eyesores. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- util/cutils.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/util/cutils.c b/util/cutils.c index ef658bb..4a290ea 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -178,30 +178,22 @@ int fcntl_setfl(int fd, int flag) } #endif =20 -#define QEMU_STRTOSZ_DEFSUFFIX_EB 'E' -#define QEMU_STRTOSZ_DEFSUFFIX_PB 'P' -#define QEMU_STRTOSZ_DEFSUFFIX_TB 'T' -#define QEMU_STRTOSZ_DEFSUFFIX_GB 'G' -#define QEMU_STRTOSZ_DEFSUFFIX_MB 'M' -#define QEMU_STRTOSZ_DEFSUFFIX_KB 'K' -#define QEMU_STRTOSZ_DEFSUFFIX_B 'B' - static int64_t suffix_mul(char suffix, int64_t unit) { switch (qemu_toupper(suffix)) { - case QEMU_STRTOSZ_DEFSUFFIX_B: + case 'B': return 1; - case QEMU_STRTOSZ_DEFSUFFIX_KB: + case 'K': return unit; - case QEMU_STRTOSZ_DEFSUFFIX_MB: + case 'M': return unit * unit; - case QEMU_STRTOSZ_DEFSUFFIX_GB: + case 'G': return unit * unit * unit; - case QEMU_STRTOSZ_DEFSUFFIX_TB: + case 'T': return unit * unit * unit * unit; - case QEMU_STRTOSZ_DEFSUFFIX_PB: + case 'P': return unit * unit * unit * unit * unit; - case QEMU_STRTOSZ_DEFSUFFIX_EB: + case 'E': return unit * unit * unit * unit * unit * unit; } return -1; @@ -258,17 +250,17 @@ fail: =20 int64_t qemu_strtosz(const char *nptr, char **end) { - return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_B, 1024); + return do_strtosz(nptr, end, 'B', 1024); } =20 int64_t qemu_strtosz_mebi(const char *nptr, char **end) { - return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB, 1024); + return do_strtosz(nptr, end, 'M', 1024); } =20 int64_t qemu_strtosz_metric(const char *nptr, char **end) { - return do_strtosz(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_B, 1000); + return do_strtosz(nptr, end, 'B', 1000); } =20 /** --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068114243753.1318958903357; Tue, 14 Feb 2017 02:28:34 -0800 (PST) Received: from localhost ([::1]:33701 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaLX-0007ki-QI for importer@patchew.org; Tue, 14 Feb 2017 05:28:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38841) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJQ-0005r3-Qz for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJO-0003OZ-68 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35426) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NN-Rw for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0CC437FB67 for ; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A245CACB8C for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B0F7011384BF; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:05 +0100 Message-Id: <1487067971-10443-19-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 18/24] tests/test-cutils: Use qemu_strtosz() more often X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use qemu_strtosz() instead of qemu_strtosz_mebi() where it doesn't really make a difference. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index e28151b..ebef377 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1376,16 +1376,16 @@ static void test_qemu_strtosz_simple(void) int64_t res; =20 str =3D "0"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 0); g_assert(endptr =3D=3D str + 1); =20 str =3D "12345M"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); g_assert(endptr =3D=3D str + 6); =20 - res =3D qemu_strtosz_mebi(str, NULL); + res =3D qemu_strtosz(str, NULL); g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); =20 /* Note: precision is 53 bits since we're parsing with strtod() */ @@ -1437,31 +1437,31 @@ static void test_qemu_strtosz_units(void) g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D none + 1); =20 - res =3D qemu_strtosz_mebi(b, &endptr); + res =3D qemu_strtosz(b, &endptr); g_assert_cmpint(res, =3D=3D, 1); g_assert(endptr =3D=3D b + 2); =20 - res =3D qemu_strtosz_mebi(k, &endptr); + res =3D qemu_strtosz(k, &endptr); g_assert_cmpint(res, =3D=3D, K_BYTE); g_assert(endptr =3D=3D k + 2); =20 - res =3D qemu_strtosz_mebi(m, &endptr); + res =3D qemu_strtosz(m, &endptr); g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D m + 2); =20 - res =3D qemu_strtosz_mebi(g, &endptr); + res =3D qemu_strtosz(g, &endptr); g_assert_cmpint(res, =3D=3D, G_BYTE); g_assert(endptr =3D=3D g + 2); =20 - res =3D qemu_strtosz_mebi(t, &endptr); + res =3D qemu_strtosz(t, &endptr); g_assert_cmpint(res, =3D=3D, T_BYTE); g_assert(endptr =3D=3D t + 2); =20 - res =3D qemu_strtosz_mebi(p, &endptr); + res =3D qemu_strtosz(p, &endptr); g_assert_cmpint(res, =3D=3D, P_BYTE); g_assert(endptr =3D=3D p + 2); =20 - res =3D qemu_strtosz_mebi(e, &endptr); + res =3D qemu_strtosz(e, &endptr); g_assert_cmpint(res, =3D=3D, E_BYTE); g_assert(endptr =3D=3D e + 2); } @@ -1472,7 +1472,7 @@ static void test_qemu_strtosz_float(void) char *endptr =3D NULL; int64_t res; =20 - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 12.345 * M_BYTE); g_assert(endptr =3D=3D str + 7); } @@ -1484,17 +1484,17 @@ static void test_qemu_strtosz_invalid(void) int64_t res; =20 str =3D ""; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D " \t "; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D "crap"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } @@ -1511,7 +1511,7 @@ static void test_qemu_strtosz_trailing(void) g_assert(endptr =3D=3D str + 3); =20 str =3D "1kiB"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 1024); g_assert(endptr =3D=3D str + 2); } @@ -1523,7 +1523,7 @@ static void test_qemu_strtosz_erange(void) int64_t res; =20 str =3D "-1"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 2); =20 @@ -1543,7 +1543,7 @@ static void test_qemu_strtosz_erange(void) g_assert(endptr =3D=3D str + 19); =20 str =3D "10E"; - res =3D qemu_strtosz_mebi(str, &endptr); + res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 3); } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068386160915.7213695711383; Tue, 14 Feb 2017 02:33:06 -0800 (PST) Received: from localhost ([::1]:33724 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaPw-0002vu-Rk for importer@patchew.org; Tue, 14 Feb 2017 05:33:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJP-0005qp-R8 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJN-0003O3-TV for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51862) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003ND-N1 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:17 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DDACA19CBD8 for ; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGwJ003252 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B3EC311384C0; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:06 +0100 Message-Id: <1487067971-10443-20-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 14 Feb 2017 10:26:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 19/24] tests/test-cutils: Drop suffix from test_qemu_strtosz_simple() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Leave testing unit suffixes to test_qemu_strtosz_units(). Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-cutils.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test-cutils.c b/tests/test-cutils.c index ebef377..585912b 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1380,13 +1380,13 @@ static void test_qemu_strtosz_simple(void) g_assert_cmpint(res, =3D=3D, 0); g_assert(endptr =3D=3D str + 1); =20 - str =3D "12345M"; + str =3D "12345"; res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); - g_assert(endptr =3D=3D str + 6); + g_assert_cmpint(res, =3D=3D, 12345); + g_assert(endptr =3D=3D str + 5); =20 res =3D qemu_strtosz(str, NULL); - g_assert_cmpint(res, =3D=3D, 12345 * M_BYTE); + g_assert_cmpint(res, =3D=3D, 12345); =20 /* Note: precision is 53 bits since we're parsing with strtod() */ =20 --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068404249997.0721752039353; Tue, 14 Feb 2017 02:33:24 -0800 (PST) Received: from localhost ([::1]:33727 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaQD-0003A5-Uy for importer@patchew.org; Tue, 14 Feb 2017 05:33:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38972) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJV-0005vS-5D for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJT-0003SR-PX for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36712) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NO-Sb; Tue, 14 Feb 2017 05:26:18 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0E73785540; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A3F95ACB8E; Tue, 14 Feb 2017 10:26:17 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B71FF11384C1; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:07 +0100 Message-Id: <1487067971-10443-21-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 20/24] qemu-img: Wrap cvtnum() around qemu_strtosz() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-block@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Cc: Kevin Wolf Cc: Max Reitz Cc: qemu-block@nongnu.org Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- qemu-img.c | 58 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 4407244..2a47966 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -368,6 +368,19 @@ static int add_old_style_options(const char *fmt, Qemu= Opts *opts, return 0; } =20 +static int64_t cvtnum(const char *s) +{ + char *end; + int64_t ret; + + ret =3D qemu_strtosz(s, &end); + if (*end !=3D '\0') { + /* Detritus at the end of the string */ + return -EINVAL; + } + return ret; +} + static int img_create(int argc, char **argv) { int c; @@ -461,9 +474,9 @@ static int img_create(int argc, char **argv) /* Get image size, if specified */ if (optind < argc) { int64_t sval; - char *end; - sval =3D qemu_strtosz(argv[optind++], &end); - if (sval < 0 || *end) { + + sval =3D cvtnum(argv[optind++]); + if (sval < 0) { if (sval =3D=3D -ERANGE) { error_report("Image size must be less than 8 EiB!"); } else { @@ -1861,9 +1874,9 @@ static int img_convert(int argc, char **argv) case 'S': { int64_t sval; - char *end; - sval =3D qemu_strtosz(optarg, &end); - if (sval < 0 || *end) { + + sval =3D cvtnum(optarg); + if (sval < 0) { error_report("Invalid minimum zero buffer size for sparse = output specified"); ret =3D -1; goto fail_getopt; @@ -3648,10 +3661,8 @@ static int img_bench(int argc, char **argv) break; case 'o': { - char *end; - errno =3D 0; - offset =3D qemu_strtosz(optarg, &end); - if (offset < 0|| *end) { + offset =3D cvtnum(optarg); + if (offset < 0) { error_report("Invalid offset specified"); return 1; } @@ -3664,10 +3675,9 @@ static int img_bench(int argc, char **argv) case 's': { int64_t sval; - char *end; =20 - sval =3D qemu_strtosz(optarg, &end); - if (sval < 0 || sval > INT_MAX || *end) { + sval =3D cvtnum(optarg); + if (sval < 0 || sval > INT_MAX) { error_report("Invalid buffer size specified"); return 1; } @@ -3678,10 +3688,9 @@ static int img_bench(int argc, char **argv) case 'S': { int64_t sval; - char *end; =20 - sval =3D qemu_strtosz(optarg, &end); - if (sval < 0 || sval > INT_MAX || *end) { + sval =3D cvtnum(optarg); + if (sval < 0 || sval > INT_MAX) { error_report("Invalid step size specified"); return 1; } @@ -3840,12 +3849,11 @@ static int img_dd_bs(const char *arg, struct DdIo *in, struct DdIo *out, struct DdInfo *dd) { - char *end; int64_t res; =20 - res =3D qemu_strtosz(arg, &end); + res =3D cvtnum(arg); =20 - if (res <=3D 0 || res > INT_MAX || *end) { + if (res <=3D 0 || res > INT_MAX) { error_report("invalid number: '%s'", arg); return 1; } @@ -3858,11 +3866,9 @@ static int img_dd_count(const char *arg, struct DdIo *in, struct DdIo *out, struct DdInfo *dd) { - char *end; + dd->count =3D cvtnum(arg); =20 - dd->count =3D qemu_strtosz(arg, &end); - - if (dd->count < 0 || *end) { + if (dd->count < 0) { error_report("invalid number: '%s'", arg); return 1; } @@ -3892,11 +3898,9 @@ static int img_dd_skip(const char *arg, struct DdIo *in, struct DdIo *out, struct DdInfo *dd) { - char *end; + in->offset =3D cvtnum(arg); =20 - in->offset =3D qemu_strtosz(arg, &end); - - if (in->offset < 0 || *end) { + if (in->offset < 0) { error_report("invalid number: '%s'", arg); return 1; } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487068941991429.93016402361366; Tue, 14 Feb 2017 02:42:21 -0800 (PST) Received: from localhost ([::1]:33776 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaYu-0003iF-Kt for importer@patchew.org; Tue, 14 Feb 2017 05:42:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39020) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJX-0005y2-Pf for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJU-0003Sm-IF for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:27 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40890) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NW-VA; Tue, 14 Feb 2017 05:26:18 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CB7F4DD49; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGBQ024050 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BA1BD11384C3; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:08 +0100 Message-Id: <1487067971-10443-22-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 21/24] util/cutils: Let qemu_strtosz*() optionally reject trailing crap X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Max Reitz , "Dr . David Alan Gilbert" , "open list:Block layer core" , Eduardo Habkost Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Change the qemu_strtosz() & friends to return -EINVAL when @endptr is null and the conversion doesn't consume the string completely. Matches how qemu_strtol() & friends work. Only test_qemu_strtosz_simple() passes a null @endptr. No functional change there, because its conversion consumes the string. Simplify callers that use @endptr only to fail when it doesn't point to '\0' to pass a null @endptr instead. Cc: Dr. David Alan Gilbert Cc: Eduardo Habkost (maintainer:X86) Cc: Kevin Wolf (supporter:Block layer core) Cc: Max Reitz (supporter:Block layer core) Cc: qemu-block@nongnu.org (open list:Block layer core) Signed-off-by: Markus Armbruster Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Eric Blake --- hmp.c | 6 ++---- hw/misc/ivshmem.c | 6 ++---- qapi/opts-visitor.c | 5 ++--- qemu-img.c | 7 +------ qemu-io-cmds.c | 7 +------ target/i386/cpu.c | 5 ++--- tests/test-cutils.c | 6 ++++++ util/cutils.c | 14 +++++++++----- 8 files changed, 25 insertions(+), 31 deletions(-) diff --git a/hmp.c b/hmp.c index 6d0d05b..0eb5b6d 100644 --- a/hmp.c +++ b/hmp.c @@ -1340,7 +1340,6 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) const char *valuestr =3D qdict_get_str(qdict, "value"); int64_t valuebw =3D 0; long valueint =3D 0; - char *endp; Error *err =3D NULL; bool use_int_value =3D false; int i; @@ -1379,9 +1378,8 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) break; case MIGRATION_PARAMETER_MAX_BANDWIDTH: p.has_max_bandwidth =3D true; - valuebw =3D qemu_strtosz_mebi(valuestr, &endp); - if (valuebw < 0 || (size_t)valuebw !=3D valuebw - || *endp !=3D '\0') { + valuebw =3D qemu_strtosz_mebi(valuestr, NULL); + if (valuebw < 0 || (size_t)valuebw !=3D valuebw) { error_setg(&err, "Invalid size %s", valuestr); goto cleanup; } diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 382dd8b..f00cd75 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1267,10 +1267,8 @@ static void ivshmem_realize(PCIDevice *dev, Error **= errp) if (s->sizearg =3D=3D NULL) { s->legacy_size =3D 4 << 20; /* 4 MB default */ } else { - char *end; - int64_t size =3D qemu_strtosz_mebi(s->sizearg, &end); - if (size < 0 || (size_t)size !=3D size || *end !=3D '\0' - || !is_power_of_2(size)) { + int64_t size =3D qemu_strtosz_mebi(s->sizearg, NULL); + if (size < 0 || (size_t)size !=3D size || !is_power_of_2(size)) { error_setg(errp, "Invalid size %s", s->sizearg); return; } diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 360d337..911a0ee 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -482,15 +482,14 @@ opts_type_size(Visitor *v, const char *name, uint64_t= *obj, Error **errp) OptsVisitor *ov =3D to_ov(v); const QemuOpt *opt; int64_t val; - char *endptr; =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { return; } =20 - val =3D qemu_strtosz(opt->str ? opt->str : "", &endptr); - if (val < 0 || *endptr) { + val =3D qemu_strtosz(opt->str ? opt->str : "", NULL); + if (val < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, "a size value representible as a non-negative int64"); return; diff --git a/qemu-img.c b/qemu-img.c index 2a47966..adcb511 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -370,14 +370,9 @@ static int add_old_style_options(const char *fmt, Qemu= Opts *opts, =20 static int64_t cvtnum(const char *s) { - char *end; int64_t ret; =20 - ret =3D qemu_strtosz(s, &end); - if (*end !=3D '\0') { - /* Detritus at the end of the string */ - return -EINVAL; - } + ret =3D qemu_strtosz(s, NULL); return ret; } =20 diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index 6b7a89c..417a4e0 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -137,14 +137,9 @@ static char **breakline(char *input, int *count) =20 static int64_t cvtnum(const char *s) { - char *end; int64_t ret; =20 - ret =3D qemu_strtosz(s, &end); - if (*end !=3D '\0') { - /* Detritus at the end of the string */ - return -EINVAL; - } + ret =3D qemu_strtosz(s, NULL); return ret; } =20 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 3a8d72d..5cb0b4b 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2034,10 +2034,9 @@ static void x86_cpu_parse_featurestr(const char *typ= ename, char *features, /* Special case: */ if (!strcmp(name, "tsc-freq")) { int64_t tsc_freq; - char *err; =20 - tsc_freq =3D qemu_strtosz_metric(val, &err); - if (tsc_freq < 0 || *err) { + tsc_freq =3D qemu_strtosz_metric(val, NULL); + if (tsc_freq < 0) { error_setg(errp, "bad numerical value %s", val); return; } diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 585912b..07095e3 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1510,10 +1510,16 @@ static void test_qemu_strtosz_trailing(void) g_assert_cmpint(res, =3D=3D, 123 * M_BYTE); g_assert(endptr =3D=3D str + 3); =20 + res =3D qemu_strtosz(str, NULL); + g_assert_cmpint(res, =3D=3D, -EINVAL); + str =3D "1kiB"; res =3D qemu_strtosz(str, &endptr); g_assert_cmpint(res, =3D=3D, 1024); g_assert(endptr =3D=3D str + 2); + + res =3D qemu_strtosz(str, NULL); + g_assert_cmpint(res, =3D=3D, -EINVAL); } =20 static void test_qemu_strtosz_erange(void) diff --git a/util/cutils.c b/util/cutils.c index 4a290ea..5c1bfe5 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -208,7 +208,7 @@ static int64_t suffix_mul(char suffix, int64_t unit) static int64_t do_strtosz(const char *nptr, char **end, const char default_suffix, int64_t unit) { - int64_t retval =3D -EINVAL; + int64_t retval; char *endptr; unsigned char c; int mul_required =3D 0; @@ -217,7 +217,8 @@ static int64_t do_strtosz(const char *nptr, char **end, errno =3D 0; val =3D strtod(nptr, &endptr); if (isnan(val) || endptr =3D=3D nptr || errno !=3D 0) { - goto fail; + retval =3D -EINVAL; + goto out; } fraction =3D modf(val, &integral); if (fraction !=3D 0) { @@ -232,17 +233,20 @@ static int64_t do_strtosz(const char *nptr, char **en= d, assert(mul >=3D 0); } if (mul =3D=3D 1 && mul_required) { - goto fail; + retval =3D -EINVAL; + goto out; } if ((val * mul >=3D INT64_MAX) || val < 0) { retval =3D -ERANGE; - goto fail; + goto out; } retval =3D val * mul; =20 -fail: +out: if (end) { *end =3D endptr; + } else if (*endptr) { + retval =3D -EINVAL; } =20 return retval; --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069802075519.7166475087917; Tue, 14 Feb 2017 02:56:42 -0800 (PST) Received: from localhost ([::1]:33873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdamm-0008R1-Qh for importer@patchew.org; Tue, 14 Feb 2017 05:56:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJa-00061E-60 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJX-0003UZ-Um for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51868) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJO-0003Ny-G8; Tue, 14 Feb 2017 05:26:18 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9E99C19D395; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGsT024052 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BD2CB11384C5; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:09 +0100 Message-Id: <1487067971-10443-23-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 22/24] util/cutils: Return qemu_strtosz*() error and value separately X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Max Reitz , "Dr . David Alan Gilbert" , "open list:Block layer core" , Eduardo Habkost Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This makes qemu_strtosz(), qemu_strtosz_mebi() and qemu_strtosz_metric() similar to qemu_strtoi64(), except negative values are rejected. Cc: Dr. David Alan Gilbert Cc: Eduardo Habkost (maintainer:X86) Cc: Kevin Wolf (supporter:Block layer core) Cc: Max Reitz (supporter:Block layer core) Cc: qemu-block@nongnu.org (open list:Block layer core) Signed-off-by: Markus Armbruster Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Eric Blake --- hmp.c | 6 +-- hw/misc/ivshmem.c | 7 ++- include/qemu/cutils.h | 6 +-- monitor.c | 5 ++- qapi/opts-visitor.c | 5 ++- qemu-img.c | 10 +++-- qemu-io-cmds.c | 10 +++-- target/i386/cpu.c | 5 ++- tests/test-cutils.c | 120 ++++++++++++++++++++++++++++++----------------= ---- util/cutils.c | 22 ++++----- 10 files changed, 119 insertions(+), 77 deletions(-) diff --git a/hmp.c b/hmp.c index 0eb5b6d..9846fa4 100644 --- a/hmp.c +++ b/hmp.c @@ -1342,7 +1342,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) long valueint =3D 0; Error *err =3D NULL; bool use_int_value =3D false; - int i; + int i, ret; =20 for (i =3D 0; i < MIGRATION_PARAMETER__MAX; i++) { if (strcmp(param, MigrationParameter_lookup[i]) =3D=3D 0) { @@ -1378,8 +1378,8 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) break; case MIGRATION_PARAMETER_MAX_BANDWIDTH: p.has_max_bandwidth =3D true; - valuebw =3D qemu_strtosz_mebi(valuestr, NULL); - if (valuebw < 0 || (size_t)valuebw !=3D valuebw) { + ret =3D qemu_strtosz_mebi(valuestr, NULL, &valuebw); + if (ret < 0 || (size_t)valuebw !=3D valuebw) { error_setg(&err, "Invalid size %s", valuestr); goto cleanup; } diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index f00cd75..3dc04f4 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1267,8 +1267,11 @@ static void ivshmem_realize(PCIDevice *dev, Error **= errp) if (s->sizearg =3D=3D NULL) { s->legacy_size =3D 4 << 20; /* 4 MB default */ } else { - int64_t size =3D qemu_strtosz_mebi(s->sizearg, NULL); - if (size < 0 || (size_t)size !=3D size || !is_power_of_2(size)) { + int ret; + int64_t size; + + ret =3D qemu_strtosz_mebi(s->sizearg, NULL, &size); + if (ret < 0 || (size_t)size !=3D size || !is_power_of_2(size)) { error_setg(errp, "Invalid size %s", s->sizearg); return; } diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index 4184851..c91649b 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -139,9 +139,9 @@ int parse_uint(const char *s, unsigned long long *value= , char **endptr, int base); int parse_uint_full(const char *s, unsigned long long *value, int base); =20 -int64_t qemu_strtosz(const char *nptr, char **end); -int64_t qemu_strtosz_mebi(const char *nptr, char **end); -int64_t qemu_strtosz_metric(const char *nptr, char **end); +int qemu_strtosz(const char *nptr, char **end, int64_t *result); +int qemu_strtosz_mebi(const char *nptr, char **end, int64_t *result); +int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result); =20 #define K_BYTE (1ULL << 10) #define M_BYTE (1ULL << 20) diff --git a/monitor.c b/monitor.c index 1f8c031..85b1b61 100644 --- a/monitor.c +++ b/monitor.c @@ -2773,6 +2773,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, break; case 'o': { + int ret; int64_t val; char *end; =20 @@ -2785,8 +2786,8 @@ static QDict *monitor_parse_arguments(Monitor *mon, break; } } - val =3D qemu_strtosz_mebi(p, &end); - if (val < 0) { + ret =3D qemu_strtosz_mebi(p, &end, &val); + if (ret < 0) { monitor_printf(mon, "invalid size\n"); goto fail; } diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 911a0ee..aac2e09 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -482,14 +482,15 @@ opts_type_size(Visitor *v, const char *name, uint64_t= *obj, Error **errp) OptsVisitor *ov =3D to_ov(v); const QemuOpt *opt; int64_t val; + int err; =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { return; } =20 - val =3D qemu_strtosz(opt->str ? opt->str : "", NULL); - if (val < 0) { + err =3D qemu_strtosz(opt->str ? opt->str : "", NULL, &val); + if (err < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, "a size value representible as a non-negative int64"); return; diff --git a/qemu-img.c b/qemu-img.c index adcb511..89ced5a 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -370,10 +370,14 @@ static int add_old_style_options(const char *fmt, Qem= uOpts *opts, =20 static int64_t cvtnum(const char *s) { - int64_t ret; + int err; + int64_t value; =20 - ret =3D qemu_strtosz(s, NULL); - return ret; + err =3D qemu_strtosz(s, NULL, &value); + if (err < 0) { + return err; + } + return value; } =20 static int img_create(int argc, char **argv) diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index 417a4e0..d9f3e93 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -137,10 +137,14 @@ static char **breakline(char *input, int *count) =20 static int64_t cvtnum(const char *s) { - int64_t ret; + int err; + int64_t value; =20 - ret =3D qemu_strtosz(s, NULL); - return ret; + err =3D qemu_strtosz(s, NULL, &value); + if (err < 0) { + return err; + } + return value; } =20 static void print_cvtnum_err(int64_t rc, const char *arg) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 5cb0b4b..5f85410 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2033,10 +2033,11 @@ static void x86_cpu_parse_featurestr(const char *ty= pename, char *features, =20 /* Special case: */ if (!strcmp(name, "tsc-freq")) { + int ret; int64_t tsc_freq; =20 - tsc_freq =3D qemu_strtosz_metric(val, NULL); - if (tsc_freq < 0) { + ret =3D qemu_strtosz_metric(val, NULL, &tsc_freq); + if (ret < 0) { error_setg(errp, "bad numerical value %s", val); return; } diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 07095e3..9c2eed3 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1373,45 +1373,54 @@ static void test_qemu_strtosz_simple(void) { const char *str; char *endptr =3D NULL; - int64_t res; + int err; + int64_t res =3D 0xbaadf00d; =20 str =3D "0"; - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0); g_assert(endptr =3D=3D str + 1); =20 str =3D "12345"; - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 12345); g_assert(endptr =3D=3D str + 5); =20 - res =3D qemu_strtosz(str, NULL); + err =3D qemu_strtosz(str, NULL, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 12345); =20 /* Note: precision is 53 bits since we're parsing with strtod() */ =20 str =3D "9007199254740991"; /* 2^53-1 */ - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x1fffffffffffff); g_assert(endptr =3D=3D str + 16); =20 str =3D "9007199254740992"; /* 2^53 */ - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x20000000000000); g_assert(endptr =3D=3D str + 16); =20 str =3D "9007199254740993"; /* 2^53+1 */ - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x20000000000000); /* rounded to 53 bits = */ g_assert(endptr =3D=3D str + 16); =20 str =3D "9223372036854774784"; /* 0x7ffffffffffffc00 (53 msbs set) */ - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775295"; /* 0x7ffffffffffffdff */ - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); /* rounded to 53 bit= s */ g_assert(endptr =3D=3D str + 19); =20 @@ -1429,39 +1438,48 @@ static void test_qemu_strtosz_units(void) const char *t =3D "1T"; const char *p =3D "1P"; const char *e =3D "1E"; + int err; char *endptr =3D NULL; - int64_t res; + int64_t res =3D 0xbaadf00d; =20 /* default is M */ - res =3D qemu_strtosz_mebi(none, &endptr); + err =3D qemu_strtosz_mebi(none, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D none + 1); =20 - res =3D qemu_strtosz(b, &endptr); + err =3D qemu_strtosz(b, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 1); g_assert(endptr =3D=3D b + 2); =20 - res =3D qemu_strtosz(k, &endptr); + err =3D qemu_strtosz(k, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, K_BYTE); g_assert(endptr =3D=3D k + 2); =20 - res =3D qemu_strtosz(m, &endptr); + err =3D qemu_strtosz(m, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, M_BYTE); g_assert(endptr =3D=3D m + 2); =20 - res =3D qemu_strtosz(g, &endptr); + err =3D qemu_strtosz(g, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, G_BYTE); g_assert(endptr =3D=3D g + 2); =20 - res =3D qemu_strtosz(t, &endptr); + err =3D qemu_strtosz(t, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, T_BYTE); g_assert(endptr =3D=3D t + 2); =20 - res =3D qemu_strtosz(p, &endptr); + err =3D qemu_strtosz(p, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, P_BYTE); g_assert(endptr =3D=3D p + 2); =20 - res =3D qemu_strtosz(e, &endptr); + err =3D qemu_strtosz(e, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, E_BYTE); g_assert(endptr =3D=3D e + 2); } @@ -1469,10 +1487,12 @@ static void test_qemu_strtosz_units(void) static void test_qemu_strtosz_float(void) { const char *str =3D "12.345M"; + int err; char *endptr =3D NULL; - int64_t res; + int64_t res =3D 0xbaadf00d; =20 - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 12.345 * M_BYTE); g_assert(endptr =3D=3D str + 7); } @@ -1481,21 +1501,22 @@ static void test_qemu_strtosz_invalid(void) { const char *str; char *endptr =3D NULL; - int64_t res; + int err; + int64_t res =3D 0xbaadf00d; =20 str =3D ""; - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -EINVAL); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D " \t "; - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -EINVAL); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); =20 str =3D "crap"; - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -EINVAL); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -EINVAL); g_assert(endptr =3D=3D str); } =20 @@ -1503,64 +1524,69 @@ static void test_qemu_strtosz_trailing(void) { const char *str; char *endptr =3D NULL; - int64_t res; + int err; + int64_t res =3D 0xbaadf00d; =20 str =3D "123xxx"; - res =3D qemu_strtosz_mebi(str, &endptr); + err =3D qemu_strtosz_mebi(str, &endptr, &res); g_assert_cmpint(res, =3D=3D, 123 * M_BYTE); g_assert(endptr =3D=3D str + 3); =20 - res =3D qemu_strtosz(str, NULL); - g_assert_cmpint(res, =3D=3D, -EINVAL); + err =3D qemu_strtosz(str, NULL, &res); + g_assert_cmpint(err, =3D=3D, -EINVAL); =20 str =3D "1kiB"; - res =3D qemu_strtosz(str, &endptr); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 1024); g_assert(endptr =3D=3D str + 2); =20 - res =3D qemu_strtosz(str, NULL); - g_assert_cmpint(res, =3D=3D, -EINVAL); + err =3D qemu_strtosz(str, NULL, &res); + g_assert_cmpint(err, =3D=3D, -EINVAL); } =20 static void test_qemu_strtosz_erange(void) { const char *str; char *endptr =3D NULL; - int64_t res; + int err; + int64_t res =3D 0xbaadf00d; =20 str =3D "-1"; - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -ERANGE); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 2); =20 str =3D "9223372036854775296"; /* 0x7ffffffffffffe00 */ - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -ERANGE); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775807"; /* 2^63-1 */ - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -ERANGE); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 str =3D "9223372036854775808"; /* 2^63 */ - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -ERANGE); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 19); =20 str =3D "10E"; - res =3D qemu_strtosz(str, &endptr); - g_assert_cmpint(res, =3D=3D, -ERANGE); + err =3D qemu_strtosz(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 3); } =20 static void test_qemu_strtosz_metric(void) { const char *str =3D "12345k"; + int err; char *endptr =3D NULL; - int64_t res; + int64_t res =3D 0xbaadf00d; =20 - res =3D qemu_strtosz_metric(str, &endptr); + err =3D qemu_strtosz_metric(str, &endptr, &res); + g_assert_cmpint(err, =3D=3D, 0); g_assert_cmpint(res, =3D=3D, 12345000); g_assert(endptr =3D=3D str + 6); } diff --git a/util/cutils.c b/util/cutils.c index 5c1bfe5..08effe6 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -205,10 +205,11 @@ static int64_t suffix_mul(char suffix, int64_t unit) * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on * other error. */ -static int64_t do_strtosz(const char *nptr, char **end, - const char default_suffix, int64_t unit) +static int do_strtosz(const char *nptr, char **end, + const char default_suffix, int64_t unit, + int64_t *result) { - int64_t retval; + int retval; char *endptr; unsigned char c; int mul_required =3D 0; @@ -240,7 +241,8 @@ static int64_t do_strtosz(const char *nptr, char **end, retval =3D -ERANGE; goto out; } - retval =3D val * mul; + *result =3D val * mul; + retval =3D 0; =20 out: if (end) { @@ -252,19 +254,19 @@ out: return retval; } =20 -int64_t qemu_strtosz(const char *nptr, char **end) +int qemu_strtosz(const char *nptr, char **end, int64_t *result) { - return do_strtosz(nptr, end, 'B', 1024); + return do_strtosz(nptr, end, 'B', 1024, result); } =20 -int64_t qemu_strtosz_mebi(const char *nptr, char **end) +int qemu_strtosz_mebi(const char *nptr, char **end, int64_t *result) { - return do_strtosz(nptr, end, 'M', 1024); + return do_strtosz(nptr, end, 'M', 1024, result); } =20 -int64_t qemu_strtosz_metric(const char *nptr, char **end) +int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result) { - return do_strtosz(nptr, end, 'B', 1000); + return do_strtosz(nptr, end, 'B', 1000, result); } =20 /** --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069203210771.8061298286821; Tue, 14 Feb 2017 02:46:43 -0800 (PST) Received: from localhost ([::1]:33798 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdad7-0007ty-Kx for importer@patchew.org; Tue, 14 Feb 2017 05:46:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39021) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJX-0005y3-Pg for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJV-0003T6-5M for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:27 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39930) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NY-W5; Tue, 14 Feb 2017 05:26:18 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 300BBC0567B3; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGhe001998 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C0CBB11384C7; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:10 +0100 Message-Id: <1487067971-10443-24-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 23/24] util/cutils: Change qemu_strtosz*() from int64_t to uint64_t X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Max Reitz , "Dr . David Alan Gilbert" , "open list:Block layer core" , Eduardo Habkost Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This will permit its use in parse_option_size(). Cc: Dr. David Alan Gilbert Cc: Eduardo Habkost (maintainer:X86) Cc: Kevin Wolf (supporter:Block layer core) Cc: Max Reitz (supporter:Block layer core) Cc: qemu-block@nongnu.org (open list:Block layer core) Signed-off-by: Markus Armbruster Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Eric Blake --- hmp.c | 5 +++-- hw/misc/ivshmem.c | 2 +- include/qemu/cutils.h | 6 +++--- monitor.c | 4 ++-- qapi/opts-visitor.c | 6 ++---- qemu-img.c | 5 ++++- qemu-io-cmds.c | 5 ++++- target/i386/cpu.c | 4 ++-- tests/test-cutils.c | 40 ++++++++++++++++++++-------------------- util/cutils.c | 14 +++++++++----- 10 files changed, 50 insertions(+), 41 deletions(-) diff --git a/hmp.c b/hmp.c index 9846fa4..5b9e461 100644 --- a/hmp.c +++ b/hmp.c @@ -1338,7 +1338,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) { const char *param =3D qdict_get_str(qdict, "parameter"); const char *valuestr =3D qdict_get_str(qdict, "value"); - int64_t valuebw =3D 0; + uint64_t valuebw =3D 0; long valueint =3D 0; Error *err =3D NULL; bool use_int_value =3D false; @@ -1379,7 +1379,8 @@ void hmp_migrate_set_parameter(Monitor *mon, const QD= ict *qdict) case MIGRATION_PARAMETER_MAX_BANDWIDTH: p.has_max_bandwidth =3D true; ret =3D qemu_strtosz_mebi(valuestr, NULL, &valuebw); - if (ret < 0 || (size_t)valuebw !=3D valuebw) { + if (ret < 0 || valuebw > INT64_MAX + || (size_t)valuebw !=3D valuebw) { error_setg(&err, "Invalid size %s", valuestr); goto cleanup; } diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 3dc04f4..ba0cc22 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1268,7 +1268,7 @@ static void ivshmem_realize(PCIDevice *dev, Error **e= rrp) s->legacy_size =3D 4 << 20; /* 4 MB default */ } else { int ret; - int64_t size; + uint64_t size; =20 ret =3D qemu_strtosz_mebi(s->sizearg, NULL, &size); if (ret < 0 || (size_t)size !=3D size || !is_power_of_2(size)) { diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index c91649b..476d274 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -139,9 +139,9 @@ int parse_uint(const char *s, unsigned long long *value= , char **endptr, int base); int parse_uint_full(const char *s, unsigned long long *value, int base); =20 -int qemu_strtosz(const char *nptr, char **end, int64_t *result); -int qemu_strtosz_mebi(const char *nptr, char **end, int64_t *result); -int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result); +int qemu_strtosz(const char *nptr, char **end, uint64_t *result); +int qemu_strtosz_mebi(const char *nptr, char **end, uint64_t *result); +int qemu_strtosz_metric(const char *nptr, char **end, uint64_t *result); =20 #define K_BYTE (1ULL << 10) #define M_BYTE (1ULL << 20) diff --git a/monitor.c b/monitor.c index 85b1b61..1008ced 100644 --- a/monitor.c +++ b/monitor.c @@ -2774,7 +2774,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, case 'o': { int ret; - int64_t val; + uint64_t val; char *end; =20 while (qemu_isspace(*p)) { @@ -2787,7 +2787,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, } } ret =3D qemu_strtosz_mebi(p, &end, &val); - if (ret < 0) { + if (ret < 0 || val > INT64_MAX) { monitor_printf(mon, "invalid size\n"); goto fail; } diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index aac2e09..a0a7c0e 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -481,7 +481,6 @@ opts_type_size(Visitor *v, const char *name, uint64_t *= obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); const QemuOpt *opt; - int64_t val; int err; =20 opt =3D lookup_scalar(ov, name, errp); @@ -489,14 +488,13 @@ opts_type_size(Visitor *v, const char *name, uint64_t= *obj, Error **errp) return; } =20 - err =3D qemu_strtosz(opt->str ? opt->str : "", NULL, &val); + err =3D qemu_strtosz(opt->str ? opt->str : "", NULL, obj); if (err < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, - "a size value representible as a non-negative int64"); + "a size value"); return; } =20 - *obj =3D val; processed(ov, name); } =20 diff --git a/qemu-img.c b/qemu-img.c index 89ced5a..b10ea66 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -371,12 +371,15 @@ static int add_old_style_options(const char *fmt, Qem= uOpts *opts, static int64_t cvtnum(const char *s) { int err; - int64_t value; + uint64_t value; =20 err =3D qemu_strtosz(s, NULL, &value); if (err < 0) { return err; } + if (value > INT64_MAX) { + return -ERANGE; + } return value; } =20 diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index d9f3e93..1b01160 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -138,12 +138,15 @@ static char **breakline(char *input, int *count) static int64_t cvtnum(const char *s) { int err; - int64_t value; + uint64_t value; =20 err =3D qemu_strtosz(s, NULL, &value); if (err < 0) { return err; } + if (value > INT64_MAX) { + return -ERANGE; + } return value; } =20 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 5f85410..e15f6bf 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2034,10 +2034,10 @@ static void x86_cpu_parse_featurestr(const char *ty= pename, char *features, /* Special case: */ if (!strcmp(name, "tsc-freq")) { int ret; - int64_t tsc_freq; + uint64_t tsc_freq; =20 ret =3D qemu_strtosz_metric(val, NULL, &tsc_freq); - if (ret < 0) { + if (ret < 0 || tsc_freq > INT64_MAX) { error_setg(errp, "bad numerical value %s", val); return; } diff --git a/tests/test-cutils.c b/tests/test-cutils.c index 9c2eed3..ebc1da2 100644 --- a/tests/test-cutils.c +++ b/tests/test-cutils.c @@ -1374,7 +1374,7 @@ static void test_qemu_strtosz_simple(void) const char *str; char *endptr =3D NULL; int err; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 str =3D "0"; err =3D qemu_strtosz(str, &endptr, &res); @@ -1412,17 +1412,17 @@ static void test_qemu_strtosz_simple(void) g_assert_cmpint(res, =3D=3D, 0x20000000000000); /* rounded to 53 bits = */ g_assert(endptr =3D=3D str + 16); =20 - str =3D "9223372036854774784"; /* 0x7ffffffffffffc00 (53 msbs set) */ + str =3D "18446744073709549568"; /* 0xfffffffffffff800 (53 msbs set) */ err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); - g_assert(endptr =3D=3D str + 19); + g_assert_cmpint(res, =3D=3D, 0xfffffffffffff800); + g_assert(endptr =3D=3D str + 20); =20 - str =3D "9223372036854775295"; /* 0x7ffffffffffffdff */ + str =3D "18446744073709550591"; /* 0xfffffffffffffbff */ err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, 0); - g_assert_cmpint(res, =3D=3D, 0x7ffffffffffffc00); /* rounded to 53 bit= s */ - g_assert(endptr =3D=3D str + 19); + g_assert_cmpint(res, =3D=3D, 0xfffffffffffff800); /* rounded to 53 bit= s */ + g_assert(endptr =3D=3D str + 20); =20 /* 0x7ffffffffffffe00..0x7fffffffffffffff get rounded to * 0x8000000000000000, thus -ERANGE; see test_qemu_strtosz_erange() */ @@ -1440,7 +1440,7 @@ static void test_qemu_strtosz_units(void) const char *e =3D "1E"; int err; char *endptr =3D NULL; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 /* default is M */ err =3D qemu_strtosz_mebi(none, &endptr, &res); @@ -1489,7 +1489,7 @@ static void test_qemu_strtosz_float(void) const char *str =3D "12.345M"; int err; char *endptr =3D NULL; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, 0); @@ -1502,7 +1502,7 @@ static void test_qemu_strtosz_invalid(void) const char *str; char *endptr =3D NULL; int err; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 str =3D ""; err =3D qemu_strtosz(str, &endptr, &res); @@ -1525,7 +1525,7 @@ static void test_qemu_strtosz_trailing(void) const char *str; char *endptr =3D NULL; int err; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 str =3D "123xxx"; err =3D qemu_strtosz_mebi(str, &endptr, &res); @@ -1550,29 +1550,29 @@ static void test_qemu_strtosz_erange(void) const char *str; char *endptr =3D NULL; int err; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 str =3D "-1"; err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 2); =20 - str =3D "9223372036854775296"; /* 0x7ffffffffffffe00 */ + str =3D "18446744073709550592"; /* 0xfffffffffffffc00 */ err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert(endptr =3D=3D str + 19); + g_assert(endptr =3D=3D str + 20); =20 - str =3D "9223372036854775807"; /* 2^63-1 */ + str =3D "18446744073709551615"; /* 2^64-1 */ err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert(endptr =3D=3D str + 19); + g_assert(endptr =3D=3D str + 20); =20 - str =3D "9223372036854775808"; /* 2^63 */ + str =3D "18446744073709551616"; /* 2^64 */ err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, -ERANGE); - g_assert(endptr =3D=3D str + 19); + g_assert(endptr =3D=3D str + 20); =20 - str =3D "10E"; + str =3D "20E"; err =3D qemu_strtosz(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, -ERANGE); g_assert(endptr =3D=3D str + 3); @@ -1583,7 +1583,7 @@ static void test_qemu_strtosz_metric(void) const char *str =3D "12345k"; int err; char *endptr =3D NULL; - int64_t res =3D 0xbaadf00d; + uint64_t res =3D 0xbaadf00d; =20 err =3D qemu_strtosz_metric(str, &endptr, &res); g_assert_cmpint(err, =3D=3D, 0); diff --git a/util/cutils.c b/util/cutils.c index 08effe6..888c0fd 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -207,7 +207,7 @@ static int64_t suffix_mul(char suffix, int64_t unit) */ static int do_strtosz(const char *nptr, char **end, const char default_suffix, int64_t unit, - int64_t *result) + uint64_t *result) { int retval; char *endptr; @@ -237,7 +237,11 @@ static int do_strtosz(const char *nptr, char **end, retval =3D -EINVAL; goto out; } - if ((val * mul >=3D INT64_MAX) || val < 0) { + /* + * Values >=3D 0xfffffffffffffc00 overflow uint64_t after their trip + * through double (53 bits of precision). + */ + if ((val * mul >=3D 0xfffffffffffffc00) || val < 0) { retval =3D -ERANGE; goto out; } @@ -254,17 +258,17 @@ out: return retval; } =20 -int qemu_strtosz(const char *nptr, char **end, int64_t *result) +int qemu_strtosz(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'B', 1024, result); } =20 -int qemu_strtosz_mebi(const char *nptr, char **end, int64_t *result) +int qemu_strtosz_mebi(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'M', 1024, result); } =20 -int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result) +int qemu_strtosz_metric(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'B', 1000, result); } --=20 2.7.4 From nobody Wed Apr 24 23:55:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487069638187992.3041590734922; Tue, 14 Feb 2017 02:53:58 -0800 (PST) Received: from localhost ([::1]:33849 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdak7-0006YK-PS for importer@patchew.org; Tue, 14 Feb 2017 05:53:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38838) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdaJQ-0005r2-Q5 for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdaJO-0003OS-4T for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58602) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdaJN-0003NT-Rz for qemu-devel@nongnu.org; Tue, 14 Feb 2017 05:26:18 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1AEBE61D30 for ; Tue, 14 Feb 2017 10:26:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-50.ams2.redhat.com [10.36.116.50]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1EAQGvV024054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 14 Feb 2017 05:26:17 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C471311384C8; Tue, 14 Feb 2017 11:26:11 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 11:26:11 +0100 Message-Id: <1487067971-10443-25-git-send-email-armbru@redhat.com> In-Reply-To: <1487067971-10443-1-git-send-email-armbru@redhat.com> References: <1487067971-10443-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 14 Feb 2017 10:26:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 24/24] QemuOpts: Fix checking of sizes for overflow and trailing crap X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" parse_option_size()'s checking for overflow and trailing crap is wrong. Has always been that way. qemu_strtosz() gets it right, so use that. This adds support for size suffixes 'P', 'E', and ignores case for all suffixes, not just 'k'. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-qemu-opts.c | 21 +++++++++------------ util/qemu-option.c | 41 +++++++++++++---------------------------- 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index 6a9d3c5..b9d5b7e 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -667,10 +667,9 @@ static void test_opts_parse_size(void) g_assert(!opts); opts =3D qemu_opts_parse(&opts_list_02, "size1=3D18446744073709550592", /* ffffffffffff= fc00 */ - false, &error_abort); - /* BUG: should reject */ - g_assert_cmpuint(opts_count(opts), =3D=3D, 1); - g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 0); + false, &err); + error_free_or_abort(&err); + g_assert(!opts); =20 /* Suffixes */ opts =3D qemu_opts_parse(&opts_list_02, "size1=3D8b,size2=3D1.5k,size3= =3D2M", @@ -688,19 +687,17 @@ static void test_opts_parse_size(void) =20 /* Beyond limit with suffix */ opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16777216T", - false, &error_abort); - /* BUG: should reject */ - g_assert_cmpuint(opts_count(opts), =3D=3D, 1); - g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 0); + false, &err); + error_free_or_abort(&err); + g_assert(!opts); =20 /* Trailing crap */ opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16E", false, &err); error_free_or_abort(&err); g_assert(!opts); - opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16Gi", false, &error_= abort); - /* BUG: should reject */ - g_assert_cmpuint(opts_count(opts), =3D=3D, 1); - g_assert_cmpuint(qemu_opt_get_size(opts, "size1", 1), =3D=3D, 16 * G_B= YTE); + opts =3D qemu_opts_parse(&opts_list_02, "size1=3D16Gi", false, &err); + error_free_or_abort(&err); + g_assert(!opts); =20 qemu_opts_reset(&opts_list_02); } diff --git a/util/qemu-option.c b/util/qemu-option.c index 5d82327..c11ce93 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -174,39 +174,24 @@ static const QemuOptDesc *find_desc_by_name(const Qem= uOptDesc *desc, void parse_option_size(const char *name, const char *value, uint64_t *ret, Error **errp) { - char *postfix; - double sizef; + uint64_t size; + int err; =20 - sizef =3D strtod(value, &postfix); - if (sizef < 0 || sizef > UINT64_MAX) { + err =3D qemu_strtosz(value, NULL, &size); + if (err =3D=3D -ERANGE) { + error_setg(errp, "Value '%s' is too large for parameter '%s'", + value, name); + return; + } + if (err) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a non-negative number below 2^64"); + error_append_hint(errp, "Optional suffix k, M, G, T, P or E means" + " kilo-, mega-, giga-, tera-, peta-\n" + "and exabytes, respectively.\n"); return; } - switch (*postfix) { - case 'T': - sizef *=3D 1024; - /* fall through */ - case 'G': - sizef *=3D 1024; - /* fall through */ - case 'M': - sizef *=3D 1024; - /* fall through */ - case 'K': - case 'k': - sizef *=3D 1024; - /* fall through */ - case 'b': - case '\0': - *ret =3D (uint64_t) sizef; - break; - default: - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a size"); - error_append_hint(errp, "You may use k, M, G or T suffixes for " - "kilobytes, megabytes, gigabytes and terabytes.\= n"); - return; - } + *ret =3D size; } =20 bool has_help_option(const char *param) --=20 2.7.4