summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-16 01:07:52 +0000
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-16 01:07:52 +0000
commita9ff83659316cbf59e0f751fed2975c75886a86d (patch)
tree36dda64d30068c584b2a3efbdad5b5d9fefa6696 /libiberty
parent89c31ddbc3ca95e53931ef4d11c729e008ed601c (diff)
downloadgcc-a9ff83659316cbf59e0f751fed2975c75886a86d.tar.gz
* cp-demangle.c (d_encoding): Exit early on error.
(d_pointer_to_member_type): Exit early if cplus_demangle_type returns NULL. (cplus_demangle_type): Likewise. * testsuite/demangle-expected: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122972 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog8
-rw-r--r--libiberty/cp-demangle.c6
-rw-r--r--libiberty/testsuite/demangle-expected4
3 files changed, 16 insertions, 2 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 6ac77d7cc17..5c2f527c102 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,11 @@
+2007-03-15 Geoffrey Keating <geoffk@apple.com>
+
+ * cp-demangle.c (d_encoding): Exit early on error.
+ (d_pointer_to_member_type): Exit early if cplus_demangle_type
+ returns NULL.
+ (cplus_demangle_type): Likewise.
+ * testsuite/demangle-expected: New testcase.
+
2007-03-01 Brooks Moses <brooks.moses@codesourcery.com>
* Makefile.in: Add install-pdf target as copied from
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 1e775d9a9c1..5c930c6ab3f 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -1067,7 +1067,7 @@ d_encoding (struct d_info *di, int top_level)
}
peek = d_peek_char (di);
- if (peek == '\0' || peek == 'E')
+ if (dc == NULL || peek == '\0' || peek == 'E')
return dc;
return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
d_bare_function_type (di, has_return_type (dc)));
@@ -1780,7 +1780,7 @@ cplus_demangle_type (struct d_info *di)
if (pret == NULL)
return NULL;
*pret = cplus_demangle_type (di);
- if (! d_add_substitution (di, ret))
+ if (! *pret || ! d_add_substitution (di, ret))
return NULL;
return ret;
}
@@ -2135,6 +2135,8 @@ d_pointer_to_member_type (struct d_info *di)
if (pmem == NULL)
return NULL;
*pmem = cplus_demangle_type (di);
+ if (*pmem == NULL)
+ return NULL;
if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
{
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index 56d9f899155..471819e26c0 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -3838,3 +3838,7 @@ _ZNSA
--format=gnu-v3
_ZNT
_ZNT
+# Dereferencing NULL in d_pointer_to_member_type
+--format=gnu-v3
+_Z1aMark
+_Z1aMark