keys, dns: Allow key types (eg. DNS) to be reclaimed immediately on expiry
[linux-2.6-block.git] / net / dns_resolver / dns_key.c
index 01e54b46ae0b9786730a79401cb58762896d0b50..2a6d363763a2bcf287708db50c9fba89486071e0 100644 (file)
@@ -91,6 +91,7 @@ const struct cred *dns_resolver_cache;
 static int
 dns_resolver_preparse(struct key_preparsed_payload *prep)
 {
+       const struct dns_server_list_v1_header *v1;
        const struct dns_payload_header *bin;
        struct user_key_payload *upayload;
        unsigned long derrno;
@@ -122,6 +123,13 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
                        return -EINVAL;
                }
 
+               v1 = (const struct dns_server_list_v1_header *)bin;
+               if ((v1->status != DNS_LOOKUP_GOOD &&
+                    v1->status != DNS_LOOKUP_GOOD_WITH_BAD)) {
+                       if (prep->expiry == TIME64_MAX)
+                               prep->expiry = ktime_get_real_seconds() + 1;
+               }
+
                result_len = datalen;
                goto store_result;
        }
@@ -314,7 +322,7 @@ static long dns_resolver_read(const struct key *key,
 
 struct key_type key_type_dns_resolver = {
        .name           = "dns_resolver",
-       .flags          = KEY_TYPE_NET_DOMAIN,
+       .flags          = KEY_TYPE_NET_DOMAIN | KEY_TYPE_INSTANT_REAP,
        .preparse       = dns_resolver_preparse,
        .free_preparse  = dns_resolver_free_preparse,
        .instantiate    = generic_key_instantiate,