summaryrefslogtreecommitdiff
path: root/source4/dns_server
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2017-12-29 11:11:59 +0100
committerJeremy Allison <jra@samba.org>2018-01-04 00:37:21 +0100
commit300821b7934084f06b44b7a63a63db7cb544e8fa (patch)
tree394877859e56e69b7d16e730c380982859835618 /source4/dns_server
parent0bb92d7f377caffb2425cc7757b370bcf671e598 (diff)
downloadsamba-300821b7934084f06b44b7a63a63db7cb544e8fa.tar.gz
dns_server: Use dns_cli_request instead of direct udp
This skips adding the DNS option for a larger UDP packet size than 512. This is a different fix for bug 9632. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source4/dns_server')
-rw-r--r--source4/dns_server/dns_query.c62
1 files changed, 6 insertions, 56 deletions
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c
index 8d3f601b708..265cfd1878c 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -270,9 +270,7 @@ static WERROR add_dns_res_rec(struct dns_res_rec **pdst,
}
struct ask_forwarder_state {
- struct tevent_context *ev;
- uint16_t id;
- struct dns_name_packet in_packet;
+ struct dns_name_packet *reply;
};
static void ask_forwarder_done(struct tevent_req *subreq);
@@ -284,49 +282,15 @@ static struct tevent_req *ask_forwarder_send(
{
struct tevent_req *req, *subreq;
struct ask_forwarder_state *state;
- struct dns_res_rec *options;
- struct dns_name_packet out_packet = { 0, };
- DATA_BLOB out_blob;
- enum ndr_err_code ndr_err;
- WERROR werr;
req = tevent_req_create(mem_ctx, &state, struct ask_forwarder_state);
if (req == NULL) {
return NULL;
}
- state->ev = ev;
- generate_random_buffer((uint8_t *)&state->id, sizeof(state->id));
-
- if (!is_ipaddress(forwarder)) {
- DEBUG(0, ("Invalid 'dns forwarder' setting '%s', needs to be "
- "an IP address\n", forwarder));
- tevent_req_werror(req, DNS_ERR(NAME_ERROR));
- return tevent_req_post(req, ev);
- }
-
- out_packet.id = state->id;
- out_packet.operation |= DNS_OPCODE_QUERY | DNS_FLAG_RECURSION_DESIRED;
- out_packet.qdcount = 1;
- out_packet.questions = question;
-
- werr = dns_generate_options(dns, state, &options);
- if (!W_ERROR_IS_OK(werr)) {
- tevent_req_werror(req, werr);
- return tevent_req_post(req, ev);
- }
-
- out_packet.arcount = 1;
- out_packet.additional = options;
- ndr_err = ndr_push_struct_blob(
- &out_blob, state, &out_packet,
- (ndr_push_flags_fn_t)ndr_push_dns_name_packet);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- tevent_req_werror(req, DNS_ERR(SERVER_FAILURE));
- return tevent_req_post(req, ev);
- }
- subreq = dns_udp_request_send(state, ev, forwarder, out_blob.data,
- out_blob.length);
+ subreq = dns_cli_request_send(state, ev, forwarder,
+ question->name, question->question_class,
+ question->question_type);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -340,12 +304,9 @@ static void ask_forwarder_done(struct tevent_req *subreq)
subreq, struct tevent_req);
struct ask_forwarder_state *state = tevent_req_data(
req, struct ask_forwarder_state);
- DATA_BLOB in_blob;
- enum ndr_err_code ndr_err;
int ret;
- ret = dns_udp_request_recv(subreq, state,
- &in_blob.data, &in_blob.length);
+ ret = dns_cli_request_recv(subreq, state, &state->reply);
TALLOC_FREE(subreq);
if (ret != 0) {
@@ -353,17 +314,6 @@ static void ask_forwarder_done(struct tevent_req *subreq)
return;
}
- ndr_err = ndr_pull_struct_blob(
- &in_blob, state, &state->in_packet,
- (ndr_pull_flags_fn_t)ndr_pull_dns_name_packet);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- tevent_req_werror(req, DNS_ERR(SERVER_FAILURE));
- return;
- }
- if (state->in_packet.id != state->id) {
- tevent_req_werror(req, DNS_ERR(NAME_ERROR));
- return;
- }
tevent_req_done(req);
}
@@ -375,7 +325,7 @@ static WERROR ask_forwarder_recv(
{
struct ask_forwarder_state *state = tevent_req_data(
req, struct ask_forwarder_state);
- struct dns_name_packet *in_packet = &state->in_packet;
+ struct dns_name_packet *in_packet = state->reply;
WERROR err;
if (tevent_req_is_werror(req, &err)) {