chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dns-domain: enforce maximum DNS domain name length
[elogind.git]
/
src
/
resolve
/
resolved-dns-packet.h
diff --git
a/src/resolve/resolved-dns-packet.h
b/src/resolve/resolved-dns-packet.h
index 77edc05a1910956f93b29f1f92812dd4107db1fe..99f60a15569526c2c9024279170c2e516e2b1647 100644
(file)
--- a/
src/resolve/resolved-dns-packet.h
+++ b/
src/resolve/resolved-dns-packet.h
@@
-41,14
+41,19
@@
struct DnsPacketHeader {
};
#define DNS_PACKET_HEADER_SIZE sizeof(DnsPacketHeader)
};
#define DNS_PACKET_HEADER_SIZE sizeof(DnsPacketHeader)
+
+/* The various DNS protocols deviate in how large a packet can grow,
+ but the TCP transport has a 16bit size field, hence that appears to
+ be the maximum. */
+#define DNS_PACKET_SIZE_MAX 0xFFFF
#define DNS_PACKET_SIZE_START 512
struct DnsPacket {
int n_ref;
#define DNS_PACKET_SIZE_START 512
struct DnsPacket {
int n_ref;
+ int ifindex;
size_t size, allocated, rindex;
Hashmap *names; /* For name compression */
void *data;
size_t size, allocated, rindex;
Hashmap *names; /* For name compression */
void *data;
- int ifindex;
};
static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {
};
static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {
@@
-66,6
+71,7
@@
static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {
#define DNS_PACKET_QR(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 15) & 1)
#define DNS_PACKET_OPCODE(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 11) & 15)
#define DNS_PACKET_RCODE(p) (be16toh(DNS_PACKET_HEADER(p)->flags) & 15)
#define DNS_PACKET_QR(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 15) & 1)
#define DNS_PACKET_OPCODE(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 11) & 15)
#define DNS_PACKET_RCODE(p) (be16toh(DNS_PACKET_HEADER(p)->flags) & 15)
+#define DNS_PACKET_TC(p) ((be16toh(DNS_PACKET_HEADER(p)->flags) >> 9) & 1)
#define DNS_PACKET_QDCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->qdcount)
#define DNS_PACKET_ANCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->ancount)
#define DNS_PACKET_NSCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->nscount)
#define DNS_PACKET_QDCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->qdcount)
#define DNS_PACKET_ANCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->ancount)
#define DNS_PACKET_NSCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->nscount)
@@
-110,6
+116,8
@@
int dns_packet_read_name(DnsPacket *p, char **ret, size_t *start);
int dns_packet_read_key(DnsPacket *p, DnsResourceKey *ret, size_t *start);
int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, size_t *start);
int dns_packet_read_key(DnsPacket *p, DnsResourceKey *ret, size_t *start);
int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, size_t *start);
+void dns_packet_rewind(DnsPacket *p, size_t idx);
+
int dns_packet_skip_question(DnsPacket *p);
enum {
int dns_packet_skip_question(DnsPacket *p);
enum {