diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2013-04-07 17:52:37 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2013-04-08 09:16:39 +0300 |
commit | 5119c432d09946864ba8179da319578750226b3b (patch) | |
tree | 10226575bf2fd0f1f73a413e7e17d4847a37e02a /src/dnsproxy.c | |
parent | 40efa0d29e0f0b41e445003bd3026272b5e59e4b (diff) | |
download | connman-5119c432d09946864ba8179da319578750226b3b.tar.gz connman-5119c432d09946864ba8179da319578750226b3b.tar.bz2 connman-5119c432d09946864ba8179da319578750226b3b.zip |
dnsproxy: Fix cached message length correctly
We must copy the response buffer before fixing the packet length.
Otherwise the packet length will go wrong if the request contained
EDNS0 data.
Diffstat (limited to 'src/dnsproxy.c')
-rw-r--r-- | src/dnsproxy.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/dnsproxy.c b/src/dnsproxy.c index 388ea4bf..52d67d4a 100644 --- a/src/dnsproxy.c +++ b/src/dnsproxy.c @@ -1556,12 +1556,16 @@ static int cache_update(struct server_data *srv, unsigned char *msg, * two bytes. This way we do not need to know the format * (UDP/TCP) of the cached message. */ + if (srv->protocol == IPPROTO_UDP) + memcpy(ptr + 2, msg, offset + 12); + else + memcpy(ptr, msg, offset + 12); + ptr[0] = (data->data_len - 2) / 256; ptr[1] = (data->data_len - 2) - ptr[0] * 256; if (srv->protocol == IPPROTO_UDP) ptr += 2; - memcpy(ptr, msg, offset + 12); memcpy(ptr + offset + 12, question, qlen + 1); /* copy also the \0 */ q = (void *) (ptr + offset + 12 + qlen + 1); |