Prevent an illegal memory access when comparing the prefix of a section name regexp.

PR 29849
	* ldlang.c (spec_match): Check that there is sufficient length in
	the target name to match the spec's prefix.
This commit is contained in:
Nick Clifton 2022-12-05 14:57:17 +00:00
parent 76a2bcc6b8
commit 3bf5bf547a
2 changed files with 27 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2022-12-05 Nick Clifton <nickc@redhat.com>
PR 29849
* ldlang.c (spec_match): Check that there is sufficient length in
the target name to match the spec's prefix.
2022-11-03 Nick Clifton <nickc@redhat.com>
PR 29748

View File

@ -223,23 +223,39 @@ spec_match (const struct wildcard_spec *spec, const char *name)
size_t nl = spec->namelen;
size_t pl = spec->prefixlen;
size_t sl = spec->suffixlen;
size_t inputlen = strlen (name);
int r;
if (pl && (r = memcmp (spec->name, name, pl)))
return r;
if (pl)
{
if (inputlen < pl)
return 1;
r = memcmp (spec->name, name, pl);
if (r)
return r;
}
if (sl)
{
size_t inputlen = strlen (name);
if (inputlen < sl)
return 1;
r = memcmp (spec->name + nl - sl, name + inputlen - sl, sl);
if (r)
return r;
}
if (nl == pl + sl + 1 && spec->name[pl] == '*')
return 0;
else if (nl > pl)
if (nl > pl)
return fnmatch (spec->name + pl, name + pl, 0);
return name[nl];
if (inputlen >= nl)
return name[nl];
return 0;
}
static char *