From patchwork Wed May 13 08:51:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Buclaw X-Patchwork-Id: 471759 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 119AA140758 for ; Wed, 13 May 2015 18:52:09 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=i9UmlU0a; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; q= dns; s=default; b=mTiqGQvujYwGMiLWfT2G1vLp/Covs/plorTn1wb1ZiZlvE HDTrf6zVbJ1xYzYqKKmkNdHjhZxkRFdLNCAAfrh5prS3GtSMsMEnQIZj+EGSczAs 7YgGJvhNIIKkMgbUAYytfR+/5741RJgZdrX/WW8IU1JqTZjEuw5zcyTtR+qgc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; s= default; bh=Z6muS9wk2PXjPMC0CgMc3bZtA6E=; b=i9UmlU0aYkBfRrj5OqSI FQcBbtrvqTMi0uBRNVGhGWkGeKCxv2rHXdVtXUoRN+6UGxRv2WvrU30GFhPfJbvX s45yrEgbaPEgZ11/mK0d9IRY3Pgj4QkikLD3UywhtyRpP9YK7rDZADx0bYZaK2cA GdwUCTbVKjrRGbUZeZNTNfc= Received: (qmail 123145 invoked by alias); 13 May 2015 08:51:29 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 122400 invoked by uid 89); 13 May 2015 08:51:28 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qc0-f174.google.com Received: from mail-qc0-f174.google.com (HELO mail-qc0-f174.google.com) (209.85.216.174) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 13 May 2015 08:51:25 +0000 Received: by qcbgy10 with SMTP id gy10so18677597qcb.3 for ; Wed, 13 May 2015 01:51:23 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.229.54.196 with SMTP id r4mr26338176qcg.15.1431507083550; Wed, 13 May 2015 01:51:23 -0700 (PDT) Received: by 10.229.215.4 with HTTP; Wed, 13 May 2015 01:51:23 -0700 (PDT) Date: Wed, 13 May 2015 10:51:23 +0200 Message-ID: Subject: [PATCH 4/7] [D] libiberty: Check symbol length before using strncmp From: Iain Buclaw To: gcc-patches , Ian Lance Taylor X-IsSubscribed: yes This addresses a subtle logic error, noticed when I was in the middle of testing out some other tightening up of parsing checks. --- libiberty/ChangeLog 2015-05-13 Iain Buclaw * d-demangle.c (dlang_identifier): Check encoded length of identifier to verify strncmp matches entire string. * testsuite/d-demangle-expected: Fix wrong test for postblit symbols. From 6326e0e960b234967d8fa2ccb47eeae8f5768fb3 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Mon, 11 May 2015 09:21:43 +0200 Subject: [PATCH 4/7] D demangle: Check identifier length before using strncmp --- libiberty/d-demangle.c | 133 ++++++++++++++++++-------------- libiberty/testsuite/d-demangle-expected | 2 +- 2 files changed, 76 insertions(+), 59 deletions(-) diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c index bfad5bb..4315071 100644 --- a/libiberty/d-demangle.c +++ b/libiberty/d-demangle.c @@ -672,65 +672,82 @@ dlang_identifier (string *decl, const char *mangled) return NULL; } - if (strncmp (mangled, "__ctor", i) == 0) + switch (i) { - /* Constructor symbol for a class/struct. */ - string_append (decl, "this"); - mangled += i; - return mangled; - } - else if (strncmp (mangled, "__dtor", i) == 0) - { - /* Destructor symbol for a class/struct. */ - string_append (decl, "~this"); - mangled += i; - return mangled; - } - else if (strncmp (mangled, "__postblit", i) == 0) - { - /* Postblit symbol for a struct. */ - string_append (decl, "this(this)"); - mangled += i; - return mangled; - } - else if (strncmp (mangled, "__initZ", i+1) == 0) - { - /* The static initialiser for a given symbol. */ - string_append (decl, "init$"); - mangled += i + 1; - return mangled; - } - else if (strncmp (mangled, "__ClassZ", i+1) == 0) - { - /* The classinfo symbol for a given class. */ - string_prepend (decl, "ClassInfo for "); - string_setlength (decl, string_length (decl) - 1); - mangled += i + 1; - return mangled; - } - else if (strncmp (mangled, "__vtblZ", i+1) == 0) - { - /* The vtable symbol for a given class. */ - string_prepend (decl, "vtable for "); - string_setlength (decl, string_length (decl) - 1); - mangled += i + 1; - return mangled; - } - else if (strncmp (mangled, "__InterfaceZ", i+1) == 0) - { - /* The interface symbol for a given class. */ - string_prepend (decl, "Interface for "); - string_setlength (decl, string_length (decl) - 1); - mangled += i + 1; - return mangled; - } - else if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0) - { - /* The ModuleInfo symbol for a given module. */ - string_prepend (decl, "ModuleInfo for "); - string_setlength (decl, string_length (decl) - 1); - mangled += i + 1; - return mangled; + case 6: + if (strncmp (mangled, "__ctor", i) == 0) + { + /* Constructor symbol for a class/struct. */ + string_append (decl, "this"); + mangled += i; + return mangled; + } + else if (strncmp (mangled, "__dtor", i) == 0) + { + /* Destructor symbol for a class/struct. */ + string_append (decl, "~this"); + mangled += i; + return mangled; + } + else if (strncmp (mangled, "__initZ", i+1) == 0) + { + /* The static initialiser for a given symbol. */ + string_append (decl, "init$"); + mangled += i; + return mangled; + } + else if (strncmp (mangled, "__vtblZ", i+1) == 0) + { + /* The vtable symbol for a given class. */ + string_prepend (decl, "vtable for "); + string_setlength (decl, string_length (decl) - 1); + mangled += i; + return mangled; + } + break; + + case 7: + if (strncmp (mangled, "__ClassZ", i+1) == 0) + { + /* The classinfo symbol for a given class. */ + string_prepend (decl, "ClassInfo for "); + string_setlength (decl, string_length (decl) - 1); + mangled += i; + return mangled; + } + break; + + case 10: + if (strncmp (mangled, "__postblitMFZ", i+3) == 0) + { + /* Postblit symbol for a struct. */ + string_append (decl, "this(this)"); + mangled += i + 3; + return mangled; + } + break; + + case 11: + if (strncmp (mangled, "__InterfaceZ", i+1) == 0) + { + /* The interface symbol for a given class. */ + string_prepend (decl, "Interface for "); + string_setlength (decl, string_length (decl) - 1); + mangled += i; + return mangled; + } + break; + + case 12: + if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0) + { + /* The ModuleInfo symbol for a given module. */ + string_prepend (decl, "ModuleInfo for "); + string_setlength (decl, string_length (decl) - 1); + mangled += i; + return mangled; + } + break; } string_appendn (decl, mangled, i); diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected index e08c989..43de5af 100644 --- a/libiberty/testsuite/d-demangle-expected +++ b/libiberty/testsuite/d-demangle-expected @@ -502,7 +502,7 @@ _D8demangle4test6__dtorMFZv demangle.test.~this() # --format=dlang -_D8demangle4test6__postblitMFZv +_D8demangle4test10__postblitMFZv demangle.test.this(this) # --format=dlang -- 2.1.0