| File: | build-scan/../src/libsystemd-network/sd-dhcp6-lease.c |
| Warning: | line 56, column 17 Use of memory after it is freed |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | |||
| 2 | /*** | |||
| 3 | Copyright © 2014-2015 Intel Corporation. All rights reserved. | |||
| 4 | ***/ | |||
| 5 | ||||
| 6 | #include <errno(*__errno_location ()).h> | |||
| 7 | ||||
| 8 | #include "alloc-util.h" | |||
| 9 | #include "dhcp6-lease-internal.h" | |||
| 10 | #include "dhcp6-protocol.h" | |||
| 11 | #include "strv.h" | |||
| 12 | #include "util.h" | |||
| 13 | ||||
| 14 | int dhcp6_lease_clear_timers(DHCP6IA *ia) { | |||
| 15 | assert_return(ia, -EINVAL)do { if (!(((__builtin_expect(!!(ia),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ia"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 15, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 16 | ||||
| 17 | ia->timeout_t1 = sd_event_source_unref(ia->timeout_t1); | |||
| 18 | ia->timeout_t2 = sd_event_source_unref(ia->timeout_t2); | |||
| 19 | ||||
| 20 | return 0; | |||
| 21 | } | |||
| 22 | ||||
| 23 | int dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire) { | |||
| 24 | DHCP6Address *addr; | |||
| 25 | uint32_t valid = 0, t; | |||
| 26 | ||||
| 27 | assert_return(ia, -EINVAL)do { if (!(((__builtin_expect(!!(ia),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ia"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 27, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 28 | assert_return(expire, -EINVAL)do { if (!(((__builtin_expect(!!(expire),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("expire"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 28, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 29 | ||||
| 30 | LIST_FOREACH(addresses, addr, ia->addresses)for ((addr) = (ia->addresses); (addr); (addr) = (addr)-> addresses_next) { | |||
| 31 | t = be32toh(addr->iaaddr.lifetime_valid); | |||
| 32 | if (valid < t) | |||
| 33 | valid = t; | |||
| 34 | } | |||
| 35 | ||||
| 36 | t = be32toh(ia->ia_na.lifetime_t2); | |||
| 37 | if (t > valid) | |||
| 38 | return -EINVAL22; | |||
| 39 | ||||
| 40 | *expire = valid - t; | |||
| 41 | ||||
| 42 | return 0; | |||
| 43 | } | |||
| 44 | ||||
| 45 | DHCP6IA *dhcp6_lease_free_ia(DHCP6IA *ia) { | |||
| 46 | DHCP6Address *address; | |||
| 47 | ||||
| 48 | if (!ia
| |||
| 49 | return NULL((void*)0); | |||
| 50 | ||||
| 51 | dhcp6_lease_clear_timers(ia); | |||
| 52 | ||||
| 53 | while (ia->addresses) { | |||
| 54 | address = ia->addresses; | |||
| 55 | ||||
| 56 | LIST_REMOVE(addresses, ia->addresses, address)do { typeof(*(ia->addresses)) **_head = &(ia->addresses ), *_item = (address); do { if ((__builtin_expect(!!(!(_item) ),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("_item"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 56, __PRETTY_FUNCTION__); } while (0); if (_item->addresses_next ) _item->addresses_next->addresses_prev = _item->addresses_prev ; if (_item->addresses_prev) _item->addresses_prev-> addresses_next = _item->addresses_next; else { do { if ((__builtin_expect (!!(!(*_head == _item)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD , ("*_head == _item"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 56, __PRETTY_FUNCTION__); } while (0); *_head = _item->addresses_next ; } _item->addresses_next = _item->addresses_prev = ((void *)0); } while (0); | |||
| ||||
| 57 | ||||
| 58 | free(address); | |||
| 59 | } | |||
| 60 | ||||
| 61 | return NULL((void*)0); | |||
| 62 | } | |||
| 63 | ||||
| 64 | int dhcp6_lease_set_serverid(sd_dhcp6_lease *lease, const uint8_t *id, | |||
| 65 | size_t len) { | |||
| 66 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 66, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 67 | assert_return(id, -EINVAL)do { if (!(((__builtin_expect(!!(id),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("id"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 67, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 68 | ||||
| 69 | free(lease->serverid); | |||
| 70 | ||||
| 71 | lease->serverid = memdup(id, len); | |||
| 72 | if (!lease->serverid) | |||
| 73 | return -EINVAL22; | |||
| 74 | ||||
| 75 | lease->serverid_len = len; | |||
| 76 | ||||
| 77 | return 0; | |||
| 78 | } | |||
| 79 | ||||
| 80 | int dhcp6_lease_get_serverid(sd_dhcp6_lease *lease, uint8_t **id, size_t *len) { | |||
| 81 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 81, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 82 | ||||
| 83 | if (!lease->serverid) | |||
| 84 | return -ENOMSG42; | |||
| 85 | ||||
| 86 | if (id) | |||
| 87 | *id = lease->serverid; | |||
| 88 | if (len) | |||
| 89 | *len = lease->serverid_len; | |||
| 90 | ||||
| 91 | return 0; | |||
| 92 | } | |||
| 93 | ||||
| 94 | int dhcp6_lease_set_preference(sd_dhcp6_lease *lease, uint8_t preference) { | |||
| 95 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 95, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 96 | ||||
| 97 | lease->preference = preference; | |||
| 98 | ||||
| 99 | return 0; | |||
| 100 | } | |||
| 101 | ||||
| 102 | int dhcp6_lease_get_preference(sd_dhcp6_lease *lease, uint8_t *preference) { | |||
| 103 | assert_return(preference, -EINVAL)do { if (!(((__builtin_expect(!!(preference),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("preference"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 103, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 104 | ||||
| 105 | if (!lease) | |||
| 106 | return -EINVAL22; | |||
| 107 | ||||
| 108 | *preference = lease->preference; | |||
| 109 | ||||
| 110 | return 0; | |||
| 111 | } | |||
| 112 | ||||
| 113 | int dhcp6_lease_set_rapid_commit(sd_dhcp6_lease *lease) { | |||
| 114 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 114, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 115 | ||||
| 116 | lease->rapid_commit = true1; | |||
| 117 | ||||
| 118 | return 0; | |||
| 119 | } | |||
| 120 | ||||
| 121 | int dhcp6_lease_get_rapid_commit(sd_dhcp6_lease *lease, bool_Bool *rapid_commit) { | |||
| 122 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 122, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 123 | assert_return(rapid_commit, -EINVAL)do { if (!(((__builtin_expect(!!(rapid_commit),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("rapid_commit" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 123, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | |||
| 124 | ||||
| 125 | *rapid_commit = lease->rapid_commit; | |||
| 126 | ||||
| 127 | return 0; | |||
| 128 | } | |||
| 129 | ||||
| 130 | int dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid) { | |||
| 131 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 131, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 132 | assert_return(iaid, -EINVAL)do { if (!(((__builtin_expect(!!(iaid),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("iaid"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 132, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 133 | ||||
| 134 | *iaid = lease->ia.ia_na.id; | |||
| 135 | ||||
| 136 | return 0; | |||
| 137 | } | |||
| 138 | ||||
| 139 | int sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease, struct in6_addr *addr, | |||
| 140 | uint32_t *lifetime_preferred, | |||
| 141 | uint32_t *lifetime_valid) { | |||
| 142 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 142, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 143 | assert_return(addr, -EINVAL)do { if (!(((__builtin_expect(!!(addr),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("addr"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 143, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 144 | assert_return(lifetime_preferred, -EINVAL)do { if (!(((__builtin_expect(!!(lifetime_preferred),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("lifetime_preferred" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 144, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | |||
| 145 | assert_return(lifetime_valid, -EINVAL)do { if (!(((__builtin_expect(!!(lifetime_valid),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("lifetime_valid" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 145, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | |||
| 146 | ||||
| 147 | if (!lease->addr_iter) | |||
| 148 | return -ENOMSG42; | |||
| 149 | ||||
| 150 | memcpy(addr, &lease->addr_iter->iaaddr.address, | |||
| 151 | sizeof(struct in6_addr)); | |||
| 152 | *lifetime_preferred = | |||
| 153 | be32toh(lease->addr_iter->iaaddr.lifetime_preferred); | |||
| 154 | *lifetime_valid = be32toh(lease->addr_iter->iaaddr.lifetime_valid); | |||
| 155 | ||||
| 156 | lease->addr_iter = lease->addr_iter->addresses_next; | |||
| 157 | ||||
| 158 | return 0; | |||
| 159 | } | |||
| 160 | ||||
| 161 | void sd_dhcp6_lease_reset_address_iter(sd_dhcp6_lease *lease) { | |||
| 162 | if (lease) | |||
| 163 | lease->addr_iter = lease->ia.addresses; | |||
| 164 | } | |||
| 165 | ||||
| 166 | int sd_dhcp6_lease_get_pd(sd_dhcp6_lease *lease, struct in6_addr *prefix, | |||
| 167 | uint8_t *prefix_len, | |||
| 168 | uint32_t *lifetime_preferred, | |||
| 169 | uint32_t *lifetime_valid) { | |||
| 170 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 170, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 171 | assert_return(prefix, -EINVAL)do { if (!(((__builtin_expect(!!(prefix),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("prefix"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 171, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 172 | assert_return(prefix_len, -EINVAL)do { if (!(((__builtin_expect(!!(prefix_len),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("prefix_len"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 172, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 173 | assert_return(lifetime_preferred, -EINVAL)do { if (!(((__builtin_expect(!!(lifetime_preferred),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("lifetime_preferred" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 173, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | |||
| 174 | assert_return(lifetime_valid, -EINVAL)do { if (!(((__builtin_expect(!!(lifetime_valid),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("lifetime_valid" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 174, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | |||
| 175 | ||||
| 176 | if (!lease->prefix_iter) | |||
| 177 | return -ENOMSG42; | |||
| 178 | ||||
| 179 | memcpy(prefix, &lease->prefix_iter->iapdprefix.address, | |||
| 180 | sizeof(struct in6_addr)); | |||
| 181 | *prefix_len = lease->prefix_iter->iapdprefix.prefixlen; | |||
| 182 | *lifetime_preferred = | |||
| 183 | be32toh(lease->prefix_iter->iapdprefix.lifetime_preferred); | |||
| 184 | *lifetime_valid = | |||
| 185 | be32toh(lease->prefix_iter->iapdprefix.lifetime_valid); | |||
| 186 | ||||
| 187 | lease->prefix_iter = lease->prefix_iter->addresses_next; | |||
| 188 | ||||
| 189 | return 0; | |||
| 190 | } | |||
| 191 | ||||
| 192 | void sd_dhcp6_lease_reset_pd_prefix_iter(sd_dhcp6_lease *lease) { | |||
| 193 | if (lease) | |||
| 194 | lease->prefix_iter = lease->pd.addresses; | |||
| 195 | } | |||
| 196 | ||||
| 197 | int dhcp6_lease_set_dns(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) { | |||
| 198 | int r; | |||
| 199 | ||||
| 200 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 200, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 201 | assert_return(optval, -EINVAL)do { if (!(((__builtin_expect(!!(optval),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("optval"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 201, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 202 | ||||
| 203 | if (!optlen) | |||
| 204 | return 0; | |||
| 205 | ||||
| 206 | r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->dns, | |||
| 207 | lease->dns_count, | |||
| 208 | &lease->dns_allocated); | |||
| 209 | if (r < 0) { | |||
| 210 | log_dhcp6_client(client, "Invalid DNS server option: %s",log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 211, __func__ , "DHCPv6 CLIENT: " "Invalid DNS server option: %s", strerror (-r)) | |||
| 211 | strerror(-r))log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 211, __func__ , "DHCPv6 CLIENT: " "Invalid DNS server option: %s", strerror (-r)); | |||
| 212 | ||||
| 213 | return r; | |||
| 214 | } | |||
| 215 | ||||
| 216 | lease->dns_count = r; | |||
| 217 | ||||
| 218 | return 0; | |||
| 219 | } | |||
| 220 | ||||
| 221 | int sd_dhcp6_lease_get_dns(sd_dhcp6_lease *lease, struct in6_addr **addrs) { | |||
| 222 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 222, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 223 | assert_return(addrs, -EINVAL)do { if (!(((__builtin_expect(!!(addrs),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("addrs"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 223, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 224 | ||||
| 225 | if (lease->dns_count) { | |||
| 226 | *addrs = lease->dns; | |||
| 227 | return lease->dns_count; | |||
| 228 | } | |||
| 229 | ||||
| 230 | return -ENOENT2; | |||
| 231 | } | |||
| 232 | ||||
| 233 | int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval, | |||
| 234 | size_t optlen) { | |||
| 235 | int r; | |||
| 236 | char **domains; | |||
| 237 | ||||
| 238 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 238, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 239 | assert_return(optval, -EINVAL)do { if (!(((__builtin_expect(!!(optval),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("optval"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 239, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 240 | ||||
| 241 | if (!optlen) | |||
| 242 | return 0; | |||
| 243 | ||||
| 244 | r = dhcp6_option_parse_domainname(optval, optlen, &domains); | |||
| 245 | if (r < 0) | |||
| 246 | return 0; | |||
| 247 | ||||
| 248 | strv_free_and_replace(lease->domains, domains)({ strv_free(lease->domains); (lease->domains) = (domains ); (domains) = ((void*)0); 0; }); | |||
| 249 | lease->domains_count = r; | |||
| 250 | ||||
| 251 | return r; | |||
| 252 | } | |||
| 253 | ||||
| 254 | int sd_dhcp6_lease_get_domains(sd_dhcp6_lease *lease, char ***domains) { | |||
| 255 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 255, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 256 | assert_return(domains, -EINVAL)do { if (!(((__builtin_expect(!!(domains),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("domains"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 256, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 257 | ||||
| 258 | if (lease->domains_count) { | |||
| 259 | *domains = lease->domains; | |||
| 260 | return lease->domains_count; | |||
| 261 | } | |||
| 262 | ||||
| 263 | return -ENOENT2; | |||
| 264 | } | |||
| 265 | ||||
| 266 | int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) { | |||
| 267 | int r; | |||
| 268 | uint16_t subopt; | |||
| 269 | size_t sublen; | |||
| 270 | uint8_t *subval; | |||
| 271 | ||||
| 272 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 272, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 273 | assert_return(optval, -EINVAL)do { if (!(((__builtin_expect(!!(optval),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("optval"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 273, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 274 | ||||
| 275 | lease->ntp = mfree(lease->ntp); | |||
| 276 | lease->ntp_count = 0; | |||
| 277 | lease->ntp_allocated = 0; | |||
| 278 | ||||
| 279 | while ((r = dhcp6_option_parse(&optval, &optlen, &subopt, &sublen, | |||
| 280 | &subval)) >= 0) { | |||
| 281 | int s; | |||
| 282 | char **servers; | |||
| 283 | ||||
| 284 | switch(subopt) { | |||
| 285 | case DHCP6_NTP_SUBOPTION_SRV_ADDR: | |||
| 286 | case DHCP6_NTP_SUBOPTION_MC_ADDR: | |||
| 287 | if (sublen != 16) | |||
| 288 | return 0; | |||
| 289 | ||||
| 290 | s = dhcp6_option_parse_ip6addrs(subval, sublen, | |||
| 291 | &lease->ntp, | |||
| 292 | lease->ntp_count, | |||
| 293 | &lease->ntp_allocated); | |||
| 294 | if (s < 0) | |||
| 295 | return s; | |||
| 296 | ||||
| 297 | lease->ntp_count = s; | |||
| 298 | ||||
| 299 | break; | |||
| 300 | ||||
| 301 | case DHCP6_NTP_SUBOPTION_SRV_FQDN: | |||
| 302 | r = dhcp6_option_parse_domainname(subval, sublen, | |||
| 303 | &servers); | |||
| 304 | if (r < 0) | |||
| 305 | return 0; | |||
| 306 | ||||
| 307 | strv_free_and_replace(lease->ntp_fqdn, servers)({ strv_free(lease->ntp_fqdn); (lease->ntp_fqdn) = (servers ); (servers) = ((void*)0); 0; }); | |||
| 308 | lease->ntp_fqdn_count = r; | |||
| 309 | ||||
| 310 | break; | |||
| 311 | } | |||
| 312 | } | |||
| 313 | ||||
| 314 | if (r != -ENOMSG42) | |||
| 315 | return r; | |||
| 316 | ||||
| 317 | return 0; | |||
| 318 | } | |||
| 319 | ||||
| 320 | int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) { | |||
| 321 | int r; | |||
| 322 | ||||
| 323 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 323, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 324 | assert_return(optval, -EINVAL)do { if (!(((__builtin_expect(!!(optval),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("optval"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 324, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 325 | ||||
| 326 | if (!optlen) | |||
| 327 | return 0; | |||
| 328 | ||||
| 329 | if (lease->ntp || lease->ntp_fqdn) { | |||
| 330 | log_dhcp6_client(client, "NTP information already provided")log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 330, __func__ , "DHCPv6 CLIENT: " "NTP information already provided"); | |||
| 331 | ||||
| 332 | return 0; | |||
| 333 | } | |||
| 334 | ||||
| 335 | log_dhcp6_client(client, "Using deprecated SNTP information")log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 335, __func__ , "DHCPv6 CLIENT: " "Using deprecated SNTP information"); | |||
| 336 | ||||
| 337 | r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->ntp, | |||
| 338 | lease->ntp_count, | |||
| 339 | &lease->ntp_allocated); | |||
| 340 | if (r < 0) { | |||
| 341 | log_dhcp6_client(client, "Invalid SNTP server option: %s",log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 342, __func__ , "DHCPv6 CLIENT: " "Invalid SNTP server option: %s", strerror (-r)) | |||
| 342 | strerror(-r))log_internal_realm(((LOG_REALM_SYSTEMD) << 10 | ((7))), 0, "../src/libsystemd-network/sd-dhcp6-lease.c", 342, __func__ , "DHCPv6 CLIENT: " "Invalid SNTP server option: %s", strerror (-r)); | |||
| 343 | ||||
| 344 | return r; | |||
| 345 | } | |||
| 346 | ||||
| 347 | lease->ntp_count = r; | |||
| 348 | ||||
| 349 | return 0; | |||
| 350 | } | |||
| 351 | ||||
| 352 | int sd_dhcp6_lease_get_ntp_addrs(sd_dhcp6_lease *lease, | |||
| 353 | struct in6_addr **addrs) { | |||
| 354 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 354, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 355 | assert_return(addrs, -EINVAL)do { if (!(((__builtin_expect(!!(addrs),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("addrs"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 355, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 356 | ||||
| 357 | if (lease->ntp_count) { | |||
| 358 | *addrs = lease->ntp; | |||
| 359 | return lease->ntp_count; | |||
| 360 | } | |||
| 361 | ||||
| 362 | return -ENOENT2; | |||
| 363 | } | |||
| 364 | ||||
| 365 | int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ntp_fqdn) { | |||
| 366 | assert_return(lease, -EINVAL)do { if (!(((__builtin_expect(!!(lease),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("lease"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 366, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 367 | assert_return(ntp_fqdn, -EINVAL)do { if (!(((__builtin_expect(!!(ntp_fqdn),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ntp_fqdn"), "../src/libsystemd-network/sd-dhcp6-lease.c" , 367, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | |||
| 368 | ||||
| 369 | if (lease->ntp_fqdn_count) { | |||
| 370 | *ntp_fqdn = lease->ntp_fqdn; | |||
| 371 | return lease->ntp_fqdn_count; | |||
| 372 | } | |||
| 373 | ||||
| 374 | return -ENOENT2; | |||
| 375 | } | |||
| 376 | ||||
| 377 | sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease) { | |||
| 378 | ||||
| 379 | if (!lease) | |||
| 380 | return NULL((void*)0); | |||
| 381 | ||||
| 382 | assert(lease->n_ref >= 1)do { if ((__builtin_expect(!!(!(lease->n_ref >= 1)),0)) ) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("lease->n_ref >= 1" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 382, __PRETTY_FUNCTION__ ); } while (0); | |||
| 383 | lease->n_ref++; | |||
| 384 | ||||
| 385 | return lease; | |||
| 386 | } | |||
| 387 | ||||
| 388 | sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease) { | |||
| 389 | ||||
| 390 | if (!lease) | |||
| ||||
| 391 | return NULL((void*)0); | |||
| 392 | ||||
| 393 | assert(lease->n_ref >= 1)do { if ((__builtin_expect(!!(!(lease->n_ref >= 1)),0)) ) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("lease->n_ref >= 1" ), "../src/libsystemd-network/sd-dhcp6-lease.c", 393, __PRETTY_FUNCTION__ ); } while (0); | |||
| 394 | lease->n_ref--; | |||
| 395 | ||||
| 396 | if (lease->n_ref > 0) | |||
| 397 | return NULL((void*)0); | |||
| 398 | ||||
| 399 | free(lease->serverid); | |||
| 400 | dhcp6_lease_free_ia(&lease->ia); | |||
| 401 | dhcp6_lease_free_ia(&lease->pd); | |||
| 402 | ||||
| 403 | free(lease->dns); | |||
| 404 | ||||
| 405 | lease->domains = strv_free(lease->domains); | |||
| 406 | ||||
| 407 | free(lease->ntp); | |||
| 408 | ||||
| 409 | lease->ntp_fqdn = strv_free(lease->ntp_fqdn); | |||
| 410 | return mfree(lease); | |||
| 411 | } | |||
| 412 | ||||
| 413 | int dhcp6_lease_new(sd_dhcp6_lease **ret) { | |||
| 414 | sd_dhcp6_lease *lease; | |||
| 415 | ||||
| 416 | lease = new0(sd_dhcp6_lease, 1)((sd_dhcp6_lease*) calloc((1), sizeof(sd_dhcp6_lease))); | |||
| 417 | if (!lease) | |||
| 418 | return -ENOMEM12; | |||
| 419 | ||||
| 420 | lease->n_ref = 1; | |||
| 421 | ||||
| 422 | LIST_HEAD_INIT(lease->ia.addresses)do { (lease->ia.addresses) = ((void*)0); } while (0); | |||
| 423 | ||||
| 424 | *ret = lease; | |||
| 425 | return 0; | |||
| 426 | } |