From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 121618 invoked by alias); 14 Jan 2018 02:22:58 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 120076 invoked by uid 89); 14 Jan 2018 02:22:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=0et, petr, Petr, lil X-Spam-Status: No, score=-26.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: mail-wr0-f176.google.com Received: from mail-wr0-f176.google.com (HELO mail-wr0-f176.google.com) (209.85.128.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 14 Jan 2018 02:22:49 +0000 Received: by mail-wr0-f176.google.com with SMTP id g21so8495446wrb.13 for ; Sat, 13 Jan 2018 18:22:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=iA0g7I9OHq3d0GLxIGsl9IBMzdfnDCKorMoYkCl3p3A=; b=q/GQNuSR783jYHIpvxAynlwh93x/bT6SZiexFNfN3ioj0TFXdgYX/9luFun9kRHPAX yX8PApVtTVvCFeap2BXyjoa4UAq5Or+dJGXYi0MHv4Xpm4it6QdOD/1VA/RiwQ3OYvPd 2DcslyQKk/x59zE1aDFbzLb4ZOjKDFe7675awUMuLuz/PDgdpARJup/Ahs9uorP5RYli m3iylduwUM2ITvMiq8nl3x0NE5FPNTaPF2A9QHUPTfXJry9NmNCGtzAk6n4GN+W75q0A JJcwvVew1mTVehItQiDHpS1P0lFrbp5ysALe5RdMYnJB1LtnzrdQ+DtUb0GJlO4/INOp kziQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=iA0g7I9OHq3d0GLxIGsl9IBMzdfnDCKorMoYkCl3p3A=; b=DDVMGHt9Ry9Z7SNWKWXLS92FFNDWEzNZF1HuYhkRzRQ8h7cZ1bSumZEgLlvzs/2L5Y KzMXjjTzZYfVokCMR3NFaspRfXk3GcKz5rh3geB+jmWQkodEJkzNWubloMYG4NCww8ce fBl7XdNNHGA4iZ7IgZBhAJmJBaZ7lNXhi/Wx6u6iTzODZMhJIUP4pK11gNcUd5il3axB OL/oljOerrWV/CcKKO0IOFaG1QAIKeFvM95fxUKePvqmNE5um/EwjtLAM9RSX5LjBCX4 r3R9yANkgqNRSqckAMuVkf86JGEJdD8xuBj68bPTkFmT57wjW99/HV1df1BW36htVSZi 5DVA== X-Gm-Message-State: AKwxytf8IJHAMjj5gi2zUM+blVld2SYLNuV0Q8rd76q+yoceKLHHQ4wa 15s98LGIaU9Zs7OLvHHerzjCD1lP X-Google-Smtp-Source: ACJfBotaTAV75R4fE/c9zWM9d8ne9Zaz7qEcQUuep3l/zR2q6TDmmCdwaVBggShbxZFhag9QnQairg== X-Received: by 10.223.160.87 with SMTP id l23mr10821962wrl.51.1515896566679; Sat, 13 Jan 2018 18:22:46 -0800 (PST) Received: from t540p.local (ip-89-176-83-59.net.upcbroadband.cz. [89.176.83.59]) by smtp.gmail.com with ESMTPSA id c11sm15467188wrc.8.2018.01.13.18.22.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 13 Jan 2018 18:22:45 -0800 (PST) From: Petr Machata To: elfutils-devel@sourceware.org Cc: Petr Machata Subject: [PATCH] libdw: dwarf_formsdata should return a signed value Date: Sun, 14 Jan 2018 02:22:00 -0000 Message-Id: X-Mailer: git-send-email 2.14.3 X-IsSubscribed: yes X-SW-Source: 2018-q1/txt/msg00006.txt.bz2 The function dwarf_formsdata is used for decoding signed values, but except for the variable-length DW_FORM_sdata, it uses unsigned primitives to decode the value. This is not a problem for 64-bit values, but the smaller values come decoded wrong. Fix by changing to signed primitives for decoding the fixed-length forms. Add a test case that uses dwarf_aggregate_size to determine an array size whose lower bound is -1, encoded using DW_FORM_data1, and upper bound 255 with DW_FORM_data2. When the -1 is decoded wrongly, it comes back as 255, and the array size is 1. The correct array size should be 257. Signed-off-by: Petr Machata --- libdw/ChangeLog | 7 ++++ libdw/dwarf_formsdata.c | 8 ++--- tests/run-aggregate-size.sh | 8 ++++- tests/testfile-sizes4.o.bz2 | Bin 0 -> 387 bytes tests/testfile-sizes4.s | 77 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 tests/testfile-sizes4.o.bz2 create mode 100644 tests/testfile-sizes4.s Regarding testfile-sizes4.s, that's a product of a TCL script written using dwarf.exp from GDB. I can post it as well (actually would prefer it like that),but I think you bounced it before already (I found a TCL script foranother test case from way back in my elfutils directory. I seem to recall you didn'tlike this approach for whatever reason.) diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 7cfc7825..479dd42b 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,10 @@ +2018-01-14 Petr Machata + + * dwarf_formsdata.c (dwarf_formsdata): + : Cast to signed char. + : Use read_*sbyte_unaligned instead of + read_*ubyte_unaligned. + 2017-12-26 Mark Wielaard * libdwP.h (struct Dwarf_Abbrev): Pack struct. Remove attrcnt, diff --git a/libdw/dwarf_formsdata.c b/libdw/dwarf_formsdata.c index e7deaee1..bc2b508d 100644 --- a/libdw/dwarf_formsdata.c +++ b/libdw/dwarf_formsdata.c @@ -53,25 +53,25 @@ dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_sval) __libdw_seterrno (DWARF_E_INVALID_DWARF); return -1; } - *return_sval = *attr->valp; + *return_sval = (signed char) *attr->valp; break; case DW_FORM_data2: if (datap + 2 > endp) goto invalid; - *return_sval = read_2ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_2sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_data4: if (datap + 4 > endp) goto invalid; - *return_sval = read_4ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_4sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_data8: if (datap + 8 > endp) goto invalid; - *return_sval = read_8ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_8sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_sdata: diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh index 6d8aa240..08d57bbf 100755 --- a/tests/run-aggregate-size.sh +++ b/tests/run-aggregate-size.sh @@ -63,7 +63,9 @@ # # gcc -std=c99 -g -c -o testfile-sizes3.o sizes.c -testfiles testfile-sizes1.o testfile-sizes2.o testfile-sizes3.o +# The file testfile-size4.o is hand-crafted. + +testfiles testfile-sizes1.o testfile-sizes2.o testfile-sizes3.o testfile-sizes4.o testrun_compare ${abs_builddir}/aggregate_size -e testfile-sizes1.o <<\EOF c size 1 @@ -104,4 +106,8 @@ f size 4 b size 4 EOF +testrun_compare ${abs_builddir}/aggregate_size -e testfile-sizes4.o <<\EOF +v size 257 +EOF + exit 0 diff --git a/tests/testfile-sizes4.o.bz2 b/tests/testfile-sizes4.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..046e0a23429c166c659349f628c39170bbb4818f GIT binary patch literal 387 zcmV-}0et>KT4*^jL0KkKS*U1%zyJYNfAs(V>Th(1qytN(LIL;ppJ2d1006)MKmY&; zumMI1hJq6+dsOu{DWf1XWM}{Y05m;ErkaNtGHApxG{8W>nqZ6*6HPP#VFZaN$V1Wr zpk!zPpa99EKn(_(N{z;abVA6Etg=-jpBQVd%dq;e6Q>9sa+xWbp{9draa^JPJRNG7UMVI%lII?kh^@`&;bZ`8l9vj(N&GCdoUne%}m2_-C-sJeC$dc zRs=NKY&V)*jSAC3*!qNUJ2&v)o8u3XuT?+XU(%w3Ol_&e+S<9PJno*e2s+^yC2Wuv zYYL>0n@d&qy3D-8C5BTLMaZa%@P*vOUdIVvr$m7B7*vxZ#l?7usFf6{7O7%ox7xzP zn4E{qj4D#xi1vKslj!Or-mJ>1XagNuBz3(2vJWi57V$TVwSIoYVz!`!_C;