diff mbox

[4/7,D] libiberty: Check symbol length before using strncmp

Message ID CABOHX+d3S0Cm-CwfhgPVQmbbqHRjqj3ot-sGMq=6mVhobQRnjQ@mail.gmail.com
State New
Headers show

Commit Message

Iain Buclaw May 13, 2015, 8:51 a.m. UTC
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  <ibuclaw@gdcproject.org>

    * 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.

Comments

Jeff Law May 14, 2015, 1:09 p.m. UTC | #1
On 05/13/2015 02:51 AM, Iain Buclaw wrote:
> 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  <ibuclaw@gdcproject.org>
>
>      * 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.
That's some pretty obtuse code.  Looks like it's easy to get wrong.

OK.
jeff
diff mbox

Patch

From 6326e0e960b234967d8fa2ccb47eeae8f5768fb3 Mon Sep 17 00:00:00 2001
From: Iain Buclaw <ibuclaw@gdcproject.org>
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