+ if (p->size + add > p->allocated) {
+ size_t a;
+
+ a = PAGE_ALIGN((p->size + add) * 2);
+ if (a > DNS_PACKET_SIZE_MAX)
+ a = DNS_PACKET_SIZE_MAX;
+
+ if (p->size + add > a)
+ return -EMSGSIZE;
+
+ if (p->data) {
+ void *d;
+
+ d = realloc(p->data, a);
+ if (!d)
+ return -ENOMEM;
+
+ p->data = d;
+ } else {
+ p->data = malloc(a);
+ if (!p->data)
+ return -ENOMEM;
+
+ memcpy(p->data, (uint8_t*) p + ALIGN(sizeof(DnsPacket)), p->size);
+ memzero((uint8_t*) p->data + p->size, a - p->size);
+ }
+
+ p->allocated = a;
+ }