#include "list.h"
#include "mkdir.h"
#include "fileio.h"
+#include "unaligned.h"
+#include "in-addr-util.h"
#include "dhcp-protocol.h"
#include "dhcp-internal.h"
}
static void lease_parse_u32(const uint8_t *option, size_t len, uint32_t *ret, uint32_t min) {
- be32_t val;
-
assert(option);
assert(ret);
if (len == 4) {
- memcpy(&val, option, 4);
- *ret = be32toh(val);
+ *ret = unaligned_read_be32((be32_t*) option);
if (*ret < min)
*ret = min;
}
static void lease_parse_u16(const uint8_t *option, size_t len, uint16_t *ret, uint16_t min) {
- be16_t val;
-
assert(option);
assert(ret);
if (len == 2) {
- memcpy(&val, option, 2);
- *ret = be16toh(val);
+ *ret = unaligned_read_be16((be16_t*) option);
if (*ret < min)
*ret = min;
break;
case DHCP_OPTION_DOMAIN_NAME:
- r = lease_parse_string(option, len, &lease->domainname);
+ {
+ _cleanup_free_ char *domainname = NULL;
+
+ r = lease_parse_string(option, len, &domainname);
if (r < 0)
return r;
- break;
+ if (!hostname_is_valid(domainname) || is_localhost(domainname))
+ break;
+
+ free(lease->domainname);
+ lease->domainname = domainname;
+ domainname = NULL;
+ break;
+ }
case DHCP_OPTION_HOST_NAME:
- r = lease_parse_string(option, len, &lease->hostname);
+ {
+ _cleanup_free_ char *hostname = NULL;
+
+ r = lease_parse_string(option, len, &hostname);
if (r < 0)
return r;
- break;
+ if (!hostname_is_valid(hostname) || is_localhost(hostname))
+ break;
+ free(lease->hostname);
+ lease->hostname = hostname;
+ hostname = NULL;
+
+ break;
+ }
case DHCP_OPTION_ROOT_PATH:
r = lease_parse_string(option, len, &lease->root_path);
if (r < 0)
}
int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
- uint32_t address;
+ struct in_addr address;
+ struct in_addr mask;
+ int r;
assert(lease);
- assert(lease->address != INADDR_ANY);
- address = be32toh(lease->address);
+ address.s_addr = lease->address;
/* fall back to the default subnet masks based on address class */
+ r = in_addr_default_subnet_mask(&address, &mask);
+ if (r < 0)
+ return r;
- if ((address >> 31) == 0x0)
- /* class A, leading bits: 0 */
- lease->subnet_mask = htobe32(0xff000000);
- else if ((address >> 30) == 0x2)
- /* class B, leading bits 10 */
- lease->subnet_mask = htobe32(0xffff0000);
- else if ((address >> 29) == 0x6)
- /* class C, leading bits 110 */
- lease->subnet_mask = htobe32(0xffffff00);
- else
- /* class D or E, no default mask. give up */
- return -ERANGE;
+ lease->subnet_mask = mask.s_addr;
return 0;
}