dns_parse_labels (guint8 *in, char **target, guint8 **pos, struct rspamd_dns_reply *rep, int *remain, gboolean make_name)
{
guint16 namelen = 0;
- guint8 *p = *pos, *begin = *pos, *l, *t;
+ guint8 *p = *pos, *begin = *pos, *l, *t, *end = *pos + *remain;
guint16 llen;
gint offset = -1;
gint length = *remain;
else if (llen & DNS_COMPRESSION_BITS) {
ptrs ++;
memcpy (&llen, p, sizeof (guint16));
- l = decompress_label (in, &llen, length + (*pos - in));
+ l = decompress_label (in, &llen, end - in);
if (l == NULL) {
msg_info ("invalid DNS pointer");
return FALSE;
return FALSE;
}
begin = l;
+ length = end - begin;
p = l + *l + 1;
namelen += *l;
labels ++;
t = (guint8 *)*target;
p = *pos;
begin = *pos;
+ length = *remain;
/* Now copy labels to name */
while (p - begin < length) {
llen = *p;
}
else if (llen & DNS_COMPRESSION_BITS) {
memcpy (&llen, p, sizeof (guint16));
- l = decompress_label (in, &llen, length + (*pos - in));
+ l = decompress_label (in, &llen, end - in);
begin = l;
+ length = end - begin;
p = l + *l + 1;
memcpy (t, l + 1, *l);
t += *l;