mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-30 20:33:08 +02:00
gthreadedresolver: Limit length of each record to its stated rdlength
Rather than limiting them to the full length of the answer, which may include subsequent records. Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
This commit is contained in:
parent
023fab80f9
commit
08dee06b59
@ -836,6 +836,15 @@ g_resolver_records_from_res_query (const gchar *rrname,
|
|||||||
p += 4; /* ignore the ttl (type=long) value */
|
p += 4; /* ignore the ttl (type=long) value */
|
||||||
GETSHORT (rdlength, p);
|
GETSHORT (rdlength, p);
|
||||||
|
|
||||||
|
if (end - p < rdlength)
|
||||||
|
{
|
||||||
|
g_set_error (&parsing_error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_INTERNAL,
|
||||||
|
/* Translators: the first placeholder is a domain name, the
|
||||||
|
* second is an error message */
|
||||||
|
_("Error resolving “%s”: %s"), rrname, _("Malformed DNS packet"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (type != rrtype || qclass != C_IN)
|
if (type != rrtype || qclass != C_IN)
|
||||||
{
|
{
|
||||||
p += rdlength;
|
p += rdlength;
|
||||||
@ -845,16 +854,16 @@ g_resolver_records_from_res_query (const gchar *rrname,
|
|||||||
switch (rrtype)
|
switch (rrtype)
|
||||||
{
|
{
|
||||||
case T_SRV:
|
case T_SRV:
|
||||||
record = parse_res_srv (answer, end, &p, &parsing_error);
|
record = parse_res_srv (answer, p + rdlength, &p, &parsing_error);
|
||||||
break;
|
break;
|
||||||
case T_MX:
|
case T_MX:
|
||||||
record = parse_res_mx (answer, end, &p, &parsing_error);
|
record = parse_res_mx (answer, p + rdlength, &p, &parsing_error);
|
||||||
break;
|
break;
|
||||||
case T_SOA:
|
case T_SOA:
|
||||||
record = parse_res_soa (answer, end, &p, &parsing_error);
|
record = parse_res_soa (answer, p + rdlength, &p, &parsing_error);
|
||||||
break;
|
break;
|
||||||
case T_NS:
|
case T_NS:
|
||||||
record = parse_res_ns (answer, end, &p, &parsing_error);
|
record = parse_res_ns (answer, p + rdlength, &p, &parsing_error);
|
||||||
break;
|
break;
|
||||||
case T_TXT:
|
case T_TXT:
|
||||||
record = parse_res_txt (answer, p + rdlength, &p, &parsing_error);
|
record = parse_res_txt (answer, p + rdlength, &p, &parsing_error);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user