]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: let's propagate errors from dns_scope_announce() and elsewhere
authorLennart Poettering <lennart@poettering.net>
Mon, 13 Feb 2017 19:44:11 +0000 (20:44 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 13 Feb 2017 19:44:11 +0000 (20:44 +0100)
We don't actually make use of the return value for now, but it matches
our coding style elsewhere, and it actually shortens our code quite a
bit.

Also, add a missing OOM check after dns_answer_new().

src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-mdns.c

index 7a26edbaf7262948cc0d51ebdf646bad23681d59..cf098b3b031785673a5ced3431b020834792f862 100644 (file)
@@ -1061,49 +1061,46 @@ static int on_announcement_timeout(sd_event_source *s, usec_t usec, void *userda
 
         scope->announce_event_source = sd_event_source_unref(scope->announce_event_source);
 
-        dns_scope_announce(scope, false);
+        (void) dns_scope_announce(scope, false);
         return 0;
 }
 
-void dns_scope_announce(DnsScope *scope, bool goodbye) {
+int dns_scope_announce(DnsScope *scope, bool goodbye) {
         _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
         LinkAddress *a;
         int r;
 
         if (!scope)
-                return;
+                return 0;
 
         if (scope->protocol != DNS_PROTOCOL_MDNS)
-                return;
+                return 0;
 
         answer = dns_answer_new(4);
+        if (!answer)
+                return log_oom();
+
         LIST_FOREACH(addresses, a, scope->link->addresses) {
                 r = dns_answer_add(answer, a->mdns_address_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
-                if (r < 0) {
-                        log_debug_errno(r, "Failed to add address RR to answer: %m");
-                        return;
-                }
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to add address RR to answer: %m");
+
                 r = dns_answer_add(answer, a->mdns_ptr_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
-                if (r < 0) {
-                        log_debug_errno(r, "Failed to add PTR RR to answer: %m");
-                        return;
-                }
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to add PTR RR to answer: %m");
         }
 
         if (dns_answer_isempty(answer))
-                return;
+                return 0;
 
         r = dns_scope_make_reply_packet(scope, 0, DNS_RCODE_SUCCESS, NULL, answer, NULL, false, &p);
-        if (r < 0) {
-                log_debug_errno(r, "Failed to build reply packet: %m");
-                return;
-        }
+        if (r < 0)
+                return log_debug_errno(r, "Failed to build reply packet: %m");
+
         r = dns_scope_emit_udp(scope, -1, p);
-        if (r < 0) {
-                log_debug_errno(r, "Failed to send reply packet: %m");
-                return;
-        }
+        if (r < 0)
+                return log_debug_errno(r, "Failed to send reply packet: %m");
 
         /* In section 8.3 of RFC6762: "The Multicast DNS responder MUST send at least two unsolicited
          * responses, one second apart." */
@@ -1123,6 +1120,8 @@ void dns_scope_announce(DnsScope *scope, bool goodbye) {
                                 MDNS_JITTER_RANGE_USEC,
                                 on_announcement_timeout, scope);
                 if (r < 0)
-                        log_debug_errno(r, "Failed to schedule second announcement: %m");
+                        return log_debug_errno(r, "Failed to schedule second announcement: %m");
         }
+
+        return 0;
 }
index 360d86bc2501fdef38671ac25ae605c183a936e7..6f94b1fdcdd65e66f51d465a03ac1328c8bf32c9 100644 (file)
@@ -117,4 +117,4 @@ bool dns_scope_network_good(DnsScope *s);
 
 int dns_scope_ifindex(DnsScope *s);
 
-void dns_scope_announce(DnsScope *scope, bool goodbye);
+int dns_scope_announce(DnsScope *scope, bool goodbye);
index 0c7a8867fbb44cb810ad8c134884882d4cff2387..69e1d58ccfa84ff4195e7b91cbfef2fc07186307 100644 (file)
@@ -364,7 +364,7 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
                 dns_zone_item_notify(z);
         SWAP_TWO(t->notify_zone_items, t->notify_zone_items_done);
         if (t->probing)
-                dns_scope_announce(t->scope, false);
+                (void) dns_scope_announce(t->scope, false);
 
         SET_FOREACH_MOVE(d, t->notify_transactions_done, t->notify_transactions)
                 dns_transaction_notify(d, t);
index f5cae6f68293452aafa4536ce116e555a9293136..aa7661b5adb5c2d6e85b1c2a3eac407a9a240b69 100644 (file)
@@ -78,10 +78,8 @@ static int mdns_scope_process_query(DnsScope *s, DnsPacket *p) {
         assert(p);
 
         r = dns_packet_extract(p);
-        if (r < 0) {
-                log_debug_errno(r, "Failed to extract resource records from incoming packet: %m");
-                return r;
-        }
+        if (r < 0)
+                return log_debug_errno(r, "Failed to extract resource records from incoming packet: %m");
 
         /* TODO: there might be more than one question in mDNS queries. */
         assert_return((dns_question_size(p->question) > 0), -EINVAL);
@@ -182,7 +180,7 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
 
                 r = mdns_scope_process_query(scope, p);
                 if (r < 0) {
-                        log_debug("mDNS query processing failed.");
+                        log_debug_errno(r, "mDNS query processing failed: %m");
                         return 0;
                 }
         } else