diff options
author | Volker Lendecke <vl@samba.org> | 2017-12-29 11:11:59 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2018-01-04 00:37:21 +0100 |
commit | 300821b7934084f06b44b7a63a63db7cb544e8fa (patch) | |
tree | 394877859e56e69b7d16e730c380982859835618 /source4/dns_server | |
parent | 0bb92d7f377caffb2425cc7757b370bcf671e598 (diff) | |
download | samba-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.c | 62 |
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)) { |