Skip to content
Snippets Groups Projects
Commit 132042ef authored by Libor Peltan's avatar Libor Peltan Committed by Daniel Salzman
Browse files

nameserver/compression: avoid pointers on pointers

parent 6f259e26
Branches
Tags
1 merge request!1388namserver/compression: avoid pointing directly at pointer
...@@ -238,7 +238,7 @@ static int compr_put_dname(const knot_dname_t *dname, uint8_t *dst, uint16_t max ...@@ -238,7 +238,7 @@ static int compr_put_dname(const knot_dname_t *dname, uint8_t *dst, uint16_t max
if (written + sizeof(uint16_t) > max) { if (written + sizeof(uint16_t) > max) {
return KNOT_ESPACE; return KNOT_ESPACE;
} }
knot_wire_put_pointer(dst + written, compr_ptr - compr->wire); knot_wire_put_pointer_check(dst + written, compr_ptr - compr->wire, compr->wire);
written += sizeof(uint16_t); written += sizeof(uint16_t);
} }
...@@ -280,14 +280,14 @@ static int write_owner(const knot_rrset_t *rrset, uint8_t **dst, size_t *dst_ava ...@@ -280,14 +280,14 @@ static int write_owner(const knot_rrset_t *rrset, uint8_t **dst, size_t *dst_ava
// Write result. // Write result.
if (owner_pointer > 0) { if (owner_pointer > 0) {
WRITE_OWNER_CHECK(sizeof(uint16_t), dst_avail); WRITE_OWNER_CHECK(sizeof(uint16_t), dst_avail);
knot_wire_put_pointer(*dst, owner_pointer); knot_wire_put_pointer_check(*dst, owner_pointer, compr->wire);
WRITE_OWNER_INCR(dst, dst_avail, sizeof(uint16_t)); WRITE_OWNER_INCR(dst, dst_avail, sizeof(uint16_t));
// Check for coincidence with previous RR set. // Check for coincidence with previous RR set.
} else if (compr != NULL && compr->suffix.pos != 0 && *rrset->owner != '\0' && } else if (compr != NULL && compr->suffix.pos != 0 && *rrset->owner != '\0' &&
dname_equal_wire(rrset->owner, compr->wire + compr->suffix.pos, dname_equal_wire(rrset->owner, compr->wire + compr->suffix.pos,
compr->wire)) { compr->wire)) {
WRITE_OWNER_CHECK(sizeof(uint16_t), dst_avail); WRITE_OWNER_CHECK(sizeof(uint16_t), dst_avail);
knot_wire_put_pointer(*dst, compr->suffix.pos); knot_wire_put_pointer_check(*dst, compr->suffix.pos, compr->wire);
compr_set_ptr(compr, KNOT_COMPR_HINT_OWNER, compr_set_ptr(compr, KNOT_COMPR_HINT_OWNER,
compr->wire + compr->suffix.pos, compr->wire + compr->suffix.pos,
knot_dname_size(rrset->owner)); knot_dname_size(rrset->owner));
......
...@@ -1017,6 +1017,17 @@ static inline void knot_wire_put_pointer(uint8_t *pos, uint16_t ptr) ...@@ -1017,6 +1017,17 @@ static inline void knot_wire_put_pointer(uint8_t *pos, uint16_t ptr)
pos[0] |= KNOT_WIRE_PTR; // Add pointer mark. pos[0] |= KNOT_WIRE_PTR; // Add pointer mark.
} }
/*! \brief Put pointer, but avoid pointing at other pointer. */
static inline void knot_wire_put_pointer_check(uint8_t *pos, uint16_t ptr, const uint8_t *wire)
{
if (knot_wire_is_pointer(wire + ptr)) {
// copy the referenced pointer instead
memcpy(pos, wire + ptr, sizeof(ptr));
} else {
knot_wire_put_pointer(pos, ptr);
}
}
static inline uint16_t knot_wire_get_pointer(const uint8_t *pos) static inline uint16_t knot_wire_get_pointer(const uint8_t *pos)
{ {
assert(knot_wire_is_pointer(pos)); // Check pointer. assert(knot_wire_is_pointer(pos)); // Check pointer.
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment