From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02on2042.outbound.protection.outlook.com [40.107.241.42]) by sourceware.org (Postfix) with ESMTPS id 2FAF83858020 for ; Tue, 4 Apr 2023 07:00:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2FAF83858020 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IgTFBEMz4yxSEnfZOWQh5njxBUoaqRB4svI4DrYsjElzLdVnft7uQf2wH8SoKsQajt7nyE/6yNuhLa2gf2WrJ0YLvOccbvRORmy/lze5xgiYo3c1988M6yUhPvG9fuXeY2J0snabXBV1/mS1Igf7IqXY7UVfFH0oRC99yQqb+5rxqgmf/5F9ko6UeP6kRndQLn/sWucS9cF1h7SSr9z9g4Kd1KuT4J11MxLOQBtHHA6pbkwp1ZHfQIpKBb3tGXH5jleH4K6hxW+ksMsn5c5PNyDqNM+VT0wEVBUbpUb2mvOKe0wJzU7ViJzNWQqHcKEe0p+yVgI9wI+JmwCfXwsJQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FWjaKqYe8S76QlzIymrz53DMJlSMKHK0xLFpLwLUbfU=; b=DrsYpLPAeVENm6zFQgq5zlPVfhOgXMDFPfUteBTQYdxr3sGLHczgbJrDUmrefLfV7spkpxwNJ6prgB4El1XmqzLfsTn4JuZciYPKTRDJGsQLIernJOFbyiAVJg53zRKW++tuN3HwomO/X8kRhRxqtuckKiNPKwioyP6Jzh1Zzz7i9UNiHN7VKc9mLLIQ85vvKHZyUuz8+zRALHps1oSEHfcCUTggD+xioOOvM/S1/9FvBg+k0112SzMg+Xl2igjNsoSB7PMIh0HChqMaMT6wIBxNI8BKRTZ7zrXE0fFNBDGBNXFrsEQZQg1PHCYjp/ec8sfHZ9IepEUZYtCD8mv0Aw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FWjaKqYe8S76QlzIymrz53DMJlSMKHK0xLFpLwLUbfU=; b=L/wtantl1G1bSSoVPwDhr1Iw1GhExBcj1b8jU9FTY4ykd9O7pLnAR6h5YJvbcqNmJAUh7ZleSXElpMllmavli5ptXG86NrYE/1jWWy1uMdY1z4lTzX9qAPDgIaCJEF4sNqaIVXgRWQML9bA9WTNjJODzKbIQSxVjiBLRNIjgBFuVwT4T9J/oj7IX5cjWttUFhx0W3COlCmI862PnRF9GMQUXh9GDlpk3HCJDhYFvZMmOBa7bOHx9MI/M5ejCi3j4qk4sakqQMc6aYLGCOF9C7iXQqqpyL4hRjXXLx0bIaxl/ays3K/1doJZWbtMzD2Sl55R+AhXHdLjvVStIEp0Abg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AS8PR04MB8609.eurprd04.prod.outlook.com (2603:10a6:20b:424::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6254.35; Tue, 4 Apr 2023 07:00:49 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b%6]) with mapi id 15.20.6254.035; Tue, 4 Apr 2023 07:00:48 +0000 Message-ID: Date: Tue, 4 Apr 2023 09:00:46 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 Subject: [PATCH 6/8] x86: change fetch error handling for get() Content-Language: en-US To: Binutils Cc: "H.J. Lu" , Alan Modra References: <5dac45a8-cd5f-ee4d-52fc-7d283fc29ec4@suse.com> From: Jan Beulich In-Reply-To: <5dac45a8-cd5f-ee4d-52fc-7d283fc29ec4@suse.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR3P281CA0188.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a4::20) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AS8PR04MB8609:EE_ X-MS-Office365-Filtering-Correlation-Id: 0ec12cd0-bce4-4dd3-fc1c-08db34da5184 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Kmh76Z5Z0oD8Oi4k3IanSUnKwwLO8//xRBZqIJFcH+H7LLVf214xugUgdiEnkoUiOyLuo1VI3+PsvbbgFseJDKiDZykkpqfD1tzROENg6qU17kKhZbR8NAA8hoZjb8+NI7PWQ8IO1u5N6sSQQuOhlKHALZKbwVRufg57gHrzipZ9ycMq08s6p8tTxsI+/krO0cRmgXQ3pkFH+U3/yxRc8hLa922c9hNO0blozV4I65IPndU7bqk3nUTpwEIBOGZlIoKleAwpvqqveLI57A9H9Ua3Edmmvnr7vTWVfiuds96Cp9M6LzovjX5Y5v4mFMHvNK2qAsoRzhcQdkbqx07yfuNs0ArWvy6lkXHgaucgyVBBBzNxA6Fw38wDVKIhujPx6RErv9XLsrO9h1nrSkeubkKHYSxkEwUy8nKBr+eWLjS5xF9PEnFRc7nx+wvJba+VTGEA65GIMhkt2DvBAEZ/Aila8KaggoNFunmkCPavQNbXoBwQGrlmaCRG9npI9CUUiAEhC6OvUwPuafWTzgUpK2fK5fEvFACWwnXzCnOFFJruVP3s2rnjmuDIMdDQWDy6v5vQQfXEjAbcclNKpwVkv58RYcJn/IWA6xlo+lPlNUfJFd6qP8T535/hH3Nn6w4oSx7GFYDaSV3+qalVx/oQ2g== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR04MB6560.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(39860400002)(136003)(376002)(366004)(346002)(396003)(451199021)(31686004)(6486002)(54906003)(66476007)(66556008)(66946007)(8676002)(41300700001)(6916009)(4326008)(31696002)(36756003)(478600001)(316002)(86362001)(38100700002)(6506007)(6512007)(186003)(2616005)(8936002)(2906002)(5660300002)(26005)(30864003)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ektvbXptSE1scjJnTzd2ZmxjZDdveGR1ZzdjekMzQXNuc3RaZHRtZUhwZnpm?= =?utf-8?B?T2plczZtUXg4di93R0hYMEhQb2hQcEJTMkFpZlFpVTd5d3FrVkp1UlVKSENG?= =?utf-8?B?WW9jTnBMZndzVlc2MTB1VVAxTHFXSUVVUjNNTXdSQ3BwUnVjekdJeDMwL2kz?= =?utf-8?B?MWRGSGx5R1Zkc2x3ZnplQmpDbFVNU3JRRkR2MW9kUmJGRUlPelJXeXdIeHZr?= =?utf-8?B?SDJEK1RUemlGSFpWaVlGblU4Kzg5Mm15dUM4a3QxeGV5UXFrN2VVN0cyVFZw?= =?utf-8?B?WXkwSmFFYlZWdmRhdFRtbUNObUNacXQ5c1NJSWtLOW5KdFppSUNNQzJQSlQz?= =?utf-8?B?djRxbTlIU2JjR1pqMEhXRjFjMmc0MU1CNEluUTV6bjFRS1ovMjZwM2pKMHJD?= =?utf-8?B?WFduckFMbGp2ZTdnT0VBWW9LV3REb0RSOGN2YWZxa3VPK3A0bk0rQjJINW1S?= =?utf-8?B?SC9QZEJpY2hITURyeks5azV6STRiaUVLRXZkTndvbHg5bzhxZ2dML3JaNjV4?= =?utf-8?B?T2lqcTAwYjZrZmc0WTEzV1NrZytmaWsvc2dsUDBrNWZvL1FDajFhQjFKdU9j?= =?utf-8?B?L3ZTTmI3TWVUZ1FSelkrWjM1SEE3TTBrTUc1WU5wZGlVR1dSK25pWmFsNURP?= =?utf-8?B?cXpYTGt0eVh4RS9qSTdmTWE5a0haVCtHT0dBSjVSeFdIckxqNTNycG1QRUlZ?= =?utf-8?B?ZTcyUDNCYnQzN3BadFk4UEtXRlF6N1c5NzVWRGwrV1JSck9hVFBESHlwM01l?= =?utf-8?B?endBU1hOSmtFRlg1eWM0WkduQzE4OU9ZSDZ2L3RWU1BPb3lMOWtpd0NIRHVa?= =?utf-8?B?UmpOa2xVcHZwNnJoMENJWGU2SGFVd0hXUXpNNGRKRk5EVGtUbHBJSTFISWN3?= =?utf-8?B?V0FtMjZ0ZE94N2dnUEFIaFE2UWZuRU9jekc1REFGRzdLbzdPQ1lFa0NYeFNN?= =?utf-8?B?d3hXR1NoVC9zVUhyejkrV3dvVWxpN05ya2VqUUZrUmJlNlFQUHlnV1ppcjQ4?= =?utf-8?B?RzBmOGtrY1J1bWl3MDhocHVXRitiTkVIYk9NVWNMNllWbWxDaG1CZUFoaERy?= =?utf-8?B?VTBZK2p1dGNzOEc0eGgvNmEyMHJFem1COXM4OEJqNlowaVRCVUdzRWUvYjBQ?= =?utf-8?B?aVhiRlNpWVM4RlRwUlI0eVZ6YStVeHpyMGgyWDVzMkxpcCtqSHpReXdTSzVT?= =?utf-8?B?RXhLZHB1Sjl1WEtrSDlHYzd1Y2NQRDg4QmlBU2k4SkM5SGVqSlNrTzNQbWUz?= =?utf-8?B?ZmpqRXpZaFgxMk0yOEkvSDByMUxNaTRXNEJ2Tk96blI3T3pyVTNvZ1F1MnA2?= =?utf-8?B?c04wdWE1bkUwZmd0d04rem14N1h1TDZuTnF0YXJxa1djTHhTNGQyK2R6d2Nz?= =?utf-8?B?UE01cHBkNGpnZUlGZVY4bEFsTGdZcWNQN1pqNVNXNnMra0E2QkFxU0tQZnFE?= =?utf-8?B?TjBuOHZyT1dpcWRNbHVWa0p5SUozTTVsS1VmeHJjQWpBbm5YNDVoeUFTSThI?= =?utf-8?B?ZEk4czhad1kvaWd6dHdsMTczZENkSjBXL1hGYU40bGZJSWx2KzArTFQxQ2Ey?= =?utf-8?B?Y3d4S1RnMml2QkV2M3hrcGNJYTdnajdxeHpuZnhDa1R3SloxTi82S0Zrbkdr?= =?utf-8?B?ekoyQ1NPVXFJaFpjdEZpUTZETFVYN1U4OGxGUHM2VTJGMzNaRTdVT0NFOXlj?= =?utf-8?B?TFNCbHhKd3VOVGdFa0M5L013NmxxWng0bVVtUktYS3NNdnhURWNFNWd3c0Vq?= =?utf-8?B?OW1aTHBkWjBkSWtCQUFLUDVYV0Y5ak44Y2RHZ1dyQWRHeVBaVWpaSUxRQWRh?= =?utf-8?B?cElYRWpBYWhWRDJKZ0FnWnZGZUlnQTRob2V3OEVPdGFSRzdoMnArcDlOTE5J?= =?utf-8?B?UzU3VGp5bGdQS2V1S3ZGb21hbGRHSzJpNGNOVGY4MTRiQVI1UHpOa1FhNy9M?= =?utf-8?B?N0l3TUVCM05RQnA1eHdMRzFtS05zVGplZ2RWVW96aStocW9iaWhBUVV6TG0v?= =?utf-8?B?K1NrUVFUaUhzYnhlaHpXei8vWElBVjJubkNaNGtncWdjNmo5NUpwc1g5cUhI?= =?utf-8?B?SWVDYm5aZHJvWDlQdTZuU3hKdmpDT1g1R29UN2ZXMUt3eVJodVpiSEZXdXV2?= =?utf-8?Q?QGbesGXqkrIKWPBVc3wzJCMl3?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0ec12cd0-bce4-4dd3-fc1c-08db34da5184 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Apr 2023 07:00:47.9831 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Jdb4QalVO0BXj1kyTmwygtiluJWorvci+5J9cPoo+6iu8ExuN1XfDf6KxZN0Jx6RwYursHUMxMQcOupJJ2RUng== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8609 X-Spam-Status: No, score=-3028.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Make them return boolean and convert FETCH_DATA() uses to fetch_code(). With this no further users of FETCH_DATA() remain, so the macro and its backing function are dropped as well. Leave value types as they were for the helper functions, even if I don't think that beyond get64() use of bfd_{,signed_}vma is really necessary. With type change of "disp" in OP_E_memory(), change the 2nd parameter of print_displacement() to a signed type as well, though (eliminating the need for a local variable of signed type). This also eliminates the need for custom printing of '-' in Intel syntax displacement expressions. While there drop forward declarations which aren't really needed. --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -48,10 +48,8 @@ static void oappend_with_style (instr_in enum disassembler_style); static void oappend (instr_info *, const char *); static void append_seg (instr_info *); -static bfd_vma get64 (instr_info *); -static bfd_signed_vma get32 (instr_info *); -static bfd_signed_vma get32s (instr_info *); -static int get16 (instr_info *); +static bool get32s (instr_info *, bfd_signed_vma *); +static bool get16 (instr_info *, int *); static void set_op (instr_info *, bfd_vma, bool); static bool OP_E (instr_info *, int, int); @@ -295,41 +293,8 @@ struct instr_info #define PREFIX_FWAIT 0x800 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) - to ADDR (exclusive) are valid. Returns 1 for success, longjmps + to ADDR (exclusive) are valid. Returns true for success, false on error. */ -#define FETCH_DATA(info, addr) \ - ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \ - ? 1 : fetch_data ((info), (addr))) - -static int -fetch_data (struct disassemble_info *info, bfd_byte *addr) -{ - int status; - struct dis_private *priv = (struct dis_private *) info->private_data; - bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); - - if (addr <= priv->the_buffer + MAX_MNEM_SIZE) - status = (*info->read_memory_func) (start, - priv->max_fetched, - addr - priv->max_fetched, - info); - else - status = -1; - if (status != 0) - { - /* If we did manage to read at least one byte, then - print_insn_i386 will do something sensible. Otherwise, print - an error. We do that here because this is where we know - STATUS. */ - if (priv->max_fetched == priv->the_buffer) - (*info->memory_error_func) (status, start, info); - OPCODES_SIGLONGJMP (priv->bailout, 1); - } - else - priv->max_fetched = addr; - return 1; -} - static bool fetch_code (struct disassemble_info *info, bfd_byte *until) { @@ -11412,15 +11377,14 @@ oappend_immediate (instr_info *ins, bfd_ /* Put DISP in BUF as signed hex number. */ static void -print_displacement (instr_info *ins, bfd_vma disp) +print_displacement (instr_info *ins, bfd_signed_vma val) { - bfd_signed_vma val = disp; char tmp[30]; if (val < 0) { oappend_char_with_style (ins, '-', dis_style_address_offset); - val = -disp; + val = (bfd_vma) 0 - val; /* Check for possible overflow. */ if (val < 0) @@ -11830,7 +11794,6 @@ print_register (instr_info *ins, unsigne static bool OP_E_memory (instr_info *ins, int bytemode, int sizeflag) { - bfd_vma disp = 0; int add = (ins->rex & REX_B) ? 8 : 0; int riprel = 0; int shift; @@ -11939,6 +11902,7 @@ OP_E_memory (instr_info *ins, int bytemo if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) { /* 32/64 bit address mode */ + bfd_signed_vma disp = 0; int havedisp; int havebase; int needindex; @@ -12030,7 +11994,8 @@ OP_E_memory (instr_info *ins, int bytemo havebase = 0; if (ins->address_mode == mode_64bit && !ins->has_sib) riprel = 1; - disp = get32s (ins); + if (!get32s (ins, &disp)) + return false; if (riprel && bytemode == v_bndmk_mode) { oappend (ins, "(bad)"); @@ -12048,7 +12013,8 @@ OP_E_memory (instr_info *ins, int bytemo disp <<= shift; break; case 2: - disp = get32s (ins); + if (!get32s (ins, &disp)) + return false; break; } @@ -12154,14 +12120,8 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->intel_syntax && (disp || ins->modrm.mod != 0 || base == 5)) { - if (!havedisp || (bfd_signed_vma) disp >= 0) + if (!havedisp || disp >= 0) oappend_char (ins, '+'); - else if (ins->modrm.mod != 1 && disp != -disp) - { - oappend_char (ins, '-'); - disp = -disp; - } - if (havedisp) print_displacement (ins, disp); else @@ -12209,13 +12169,17 @@ OP_E_memory (instr_info *ins, int bytemo else { /* 16 bit address mode */ + int disp = 0; + ins->used_prefixes |= ins->prefixes & PREFIX_ADDR; switch (ins->modrm.mod) { case 0: if (ins->modrm.rm == 6) { - disp = get16 (ins); + case 2: + if (!get16 (ins, &disp)) + return false; if ((disp & 0x8000) != 0) disp -= 0x10000; } @@ -12229,11 +12193,6 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->vex.evex && shift > 0) disp <<= shift; break; - case 2: - disp = get16 (ins); - if ((disp & 0x8000) != 0) - disp -= 0x10000; - break; } if (!ins->intel_syntax) @@ -12248,14 +12207,8 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->intel_syntax && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6)) { - if ((bfd_signed_vma) disp >= 0) + if (disp >= 0) oappend_char (ins, '+'); - else if (ins->modrm.mod != 1) - { - oappend_char (ins, '-'); - disp = -disp; - } - print_displacement (ins, disp); } @@ -12382,14 +12335,14 @@ OP_G (instr_info *ins, int bytemode, int } #ifdef BFD64 -static bfd_vma -get64 (instr_info *ins) +static bool +get64 (instr_info *ins, bfd_vma *res) { - bfd_vma x; unsigned int a; unsigned int b; - FETCH_DATA (ins->info, ins->codep + 8); + if (!fetch_code (ins->info, ins->codep + 8)) + return false; a = *ins->codep++ & 0xff; a |= (*ins->codep++ & 0xff) << 8; a |= (*ins->codep++ & 0xff) << 16; @@ -12398,56 +12351,49 @@ get64 (instr_info *ins) b |= (*ins->codep++ & 0xff) << 8; b |= (*ins->codep++ & 0xff) << 16; b |= (*ins->codep++ & 0xffu) << 24; - x = a + ((bfd_vma) b << 32); - return x; + *res = a + ((bfd_vma) b << 32); + return true; } #else -static bfd_vma -get64 (instr_info *ins ATTRIBUTE_UNUSED) +static bool +get64 (instr_info *ins ATTRIBUTE_UNUSED, bfd_vma *res ATTRIBUTE_UNUSED) { abort (); - return 0; + return false; } #endif -static bfd_signed_vma -get32 (instr_info *ins) +static bool +get32 (instr_info *ins, bfd_signed_vma *res) { - bfd_vma x = 0; - - FETCH_DATA (ins->info, ins->codep + 4); - x = *ins->codep++ & (bfd_vma) 0xff; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 8; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 16; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 24; - return x; + if (!fetch_code (ins->info, ins->codep + 4)) + return false; + *res = *ins->codep++ & (bfd_vma) 0xff; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 8; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 16; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 24; + return true; } -static bfd_signed_vma -get32s (instr_info *ins) +static bool +get32s (instr_info *ins, bfd_signed_vma *res) { - bfd_vma x = 0; - - FETCH_DATA (ins->info, ins->codep + 4); - x = *ins->codep++ & (bfd_vma) 0xff; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 8; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 16; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 24; + if (!get32 (ins, res)) + return false; - x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31); + *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31); - return x; + return true; } -static int -get16 (instr_info *ins) +static bool +get16 (instr_info *ins, int *res) { - int x = 0; - - FETCH_DATA (ins->info, ins->codep + 2); - x = *ins->codep++ & 0xff; - x |= (*ins->codep++ & 0xff) << 8; - return x; + if (!fetch_code (ins->info, ins->codep + 2)) + return false; + *res = *ins->codep++ & 0xff; + *res |= (*ins->codep++ & 0xff) << 8; + return true; } static void @@ -12587,30 +12533,32 @@ OP_I (instr_info *ins, int bytemode, int case v_mode: USED_REX (REX_W); if (ins->rex & REX_W) - op = get32s (ins); + { + if (!get32s (ins, &op)) + return false; + } else { + ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); if (sizeflag & DFLAG) { - op = get32 (ins); + case d_mode: + if (!get32 (ins, &op)) + return false; mask = 0xffffffff; } else { - op = get16 (ins); + int num; + + case w_mode: + if (!get16 (ins, &num)) + return false; + op = num; mask = 0xfffff; } - ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); } break; - case d_mode: - mask = 0xffffffff; - op = get32 (ins); - break; - case w_mode: - mask = 0xfffff; - op = get16 (ins); - break; case const_1_mode: if (ins->intel_syntax) oappend (ins, "1"); @@ -12628,13 +12576,18 @@ OP_I (instr_info *ins, int bytemode, int static bool OP_I64 (instr_info *ins, int bytemode, int sizeflag) { + bfd_vma op; + if (bytemode != v_mode || ins->address_mode != mode_64bit || !(ins->rex & REX_W)) return OP_I (ins, bytemode, sizeflag); USED_REX (REX_W); - oappend_immediate (ins, get64 (ins)); + if (!get64 (ins, &op)) + return false; + + oappend_immediate (ins, op); return true; } @@ -12677,10 +12630,16 @@ OP_sI (instr_info *ins, int bytemode, in break; case v_mode: /* The operand-size prefix is overridden by a REX prefix. */ - if ((sizeflag & DFLAG) || (ins->rex & REX_W)) - op = get32s (ins); - else - op = get16 (ins); + if (!(sizeflag & DFLAG) && !(ins->rex & REX_W)) + { + int val; + + if (!get16 (ins, &val)) + return false; + op = val; + } + else if (!get32s (ins, &op)) + return false; break; default: oappend (ins, INTERNAL_DISASSEMBLER_ERROR); @@ -12713,12 +12672,19 @@ OP_J (instr_info *ins, int bytemode, int || (ins->address_mode == mode_64bit && ((ins->isa64 == intel64 && bytemode != dqw_mode) || (ins->rex & REX_W)))) - disp = get32s (ins); + { + bfd_signed_vma val; + + if (!get32s (ins, &val)) + return false; + disp = val; + } else { - disp = get16 (ins); - if ((disp & 0x8000) != 0) - disp -= 0x10000; + int val; + + get16 (ins, &val); + disp = val & 0x8000 ? val - 0x10000 : val; /* In 16bit mode, address is wrapped around at 64k within the same segment. Otherwise, a data16 prefix on a jump instruction means that the pc is masked to 16 bits after @@ -12762,14 +12728,16 @@ OP_DIR (instr_info *ins, int dummy ATTRI if (sizeflag & DFLAG) { - offset = get32 (ins); - seg = get16 (ins); - } - else - { - offset = get16 (ins); - seg = get16 (ins); + bfd_signed_vma val; + + if (!get32 (ins, &val)) + return false;; + offset = val; } + else if (!get16 (ins, &offset)) + return false; + if (!get16 (ins, &seg)) + return false;; ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); res = snprintf (scratch, ARRAY_SIZE (scratch), @@ -12791,9 +12759,21 @@ OP_OFF (instr_info *ins, int bytemode, i append_seg (ins); if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) - off = get32 (ins); + { + bfd_signed_vma val; + + if (!get32 (ins, &val)) + return false; + off = val; + } else - off = get16 (ins); + { + int val; + + if (!get16 (ins, &val)) + return false; + off = val; + } if (ins->intel_syntax) { @@ -12820,7 +12800,8 @@ OP_OFF64 (instr_info *ins, int bytemode, intel_operand_size (ins, bytemode, sizeflag); append_seg (ins); - off = get64 (ins); + if (!get64 (ins, &off)) + return false; if (ins->intel_syntax) {