diff options
author | Tom Gundersen <teg@jklm.no> | 2014-05-20 13:07:19 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-05-20 23:31:22 +0200 |
commit | 32008a9636b3781112d349e77ee9e3279104b01c (patch) | |
tree | e514e89f89c5fb43151fbc746c67cc6ff5577a85 | |
parent | 20b958bf157dfb2f521b191ef7158035bcaa3003 (diff) |
sd-dhcp: refactor parse_options
Similar to the previous patch, exchange a length and a pointer with only one offset variable.
Also fix the type of the options to be uint8_t[], rather than uint8_t*.
-rw-r--r-- | src/libsystemd-network/dhcp-option.c | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/src/libsystemd-network/dhcp-option.c b/src/libsystemd-network/dhcp-option.c index 7bf8812676..68950923dd 100644 --- a/src/libsystemd-network/dhcp-option.c +++ b/src/libsystemd-network/dhcp-option.c @@ -60,86 +60,86 @@ int dhcp_option_append(uint8_t options[], size_t size, size_t *offset, return 0; } -static int parse_options(const uint8_t *buf, size_t buflen, uint8_t *overload, +static int parse_options(const uint8_t options[], size_t buflen, uint8_t *overload, uint8_t *message_type, dhcp_option_cb_t cb, - void *user_data) -{ - const uint8_t *code = buf; - const uint8_t *len; + void *user_data) { + uint8_t code, len; + size_t offset = 0; - while (buflen > 0) { - switch (*code) { + while (offset < buflen) { + switch (options[offset]) { case DHCP_OPTION_PAD: - buflen -= 1; - code++; + offset++; + break; case DHCP_OPTION_END: return 0; case DHCP_OPTION_MESSAGE_TYPE: - if (buflen < 3) + if (buflen < offset + 3) return -ENOBUFS; - buflen -= 3; - len = code + 1; - if (*len != 1) + len = options[++offset]; + if (len != 1) return -EINVAL; if (message_type) - *message_type = *(len + 1); + *message_type = options[++offset]; + else + offset++; - code += 3; + offset++; break; case DHCP_OPTION_OVERLOAD: - if (buflen < 3) + if (buflen < offset + 3) return -ENOBUFS; - buflen -= 3; - len = code + 1; - if (*len != 1) + len = options[++offset]; + if (len != 1) return -EINVAL; if (overload) - *overload = *(len + 1); + *overload = options[++offset]; + else + offset++; - code += 3; + offset++; break; default: - if (buflen < 3) + if (buflen < offset + 3) return -ENOBUFS; - len = code + 1; + code = options[offset]; + len = options[++offset]; - if (buflen < (size_t)*len + 2) + if (buflen < ++offset + len) return -EINVAL; - buflen -= *len + 2; if (cb) - cb(*code, *len, len + 1, user_data); + cb(code, len, &options[offset], user_data); - code += *len + 2; + offset += len; break; } } - if (buflen) + if (offset < buflen) return -EINVAL; return 0; } int dhcp_option_parse(DHCPMessage *message, size_t len, - dhcp_option_cb_t cb, void *user_data) -{ + dhcp_option_cb_t cb, void *user_data) { uint8_t overload = 0; uint8_t message_type = 0; - int res; + int r; if (!message) return -EINVAL; @@ -149,23 +149,23 @@ int dhcp_option_parse(DHCPMessage *message, size_t len, len -= sizeof(DHCPMessage); - res = parse_options(message->options, len, &overload, &message_type, - cb, user_data); - if (res < 0) - return res; + r = parse_options(message->options, len, &overload, &message_type, + cb, user_data); + if (r < 0) + return r; if (overload & DHCP_OVERLOAD_FILE) { - res = parse_options(message->file, sizeof(message->file), + r = parse_options(message->file, sizeof(message->file), NULL, &message_type, cb, user_data); - if (res < 0) - return res; + if (r < 0) + return r; } if (overload & DHCP_OVERLOAD_SNAME) { - res = parse_options(message->sname, sizeof(message->sname), + r = parse_options(message->sname, sizeof(message->sname), NULL, &message_type, cb, user_data); - if (res < 0) - return res; + if (r < 0) + return r; } if (message_type) |