1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-08-31 09:50:11 +03:00

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*.
This commit is contained in:
Tom Gundersen
2014-05-20 13:07:19 +02:00
parent 20b958bf15
commit 32008a9636

View File

@ -60,86 +60,86 @@ int dhcp_option_append(uint8_t options[], size_t size, size_t *offset,
return 0; 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, uint8_t *message_type, dhcp_option_cb_t cb,
void *user_data) void *user_data) {
{ uint8_t code, len;
const uint8_t *code = buf; size_t offset = 0;
const uint8_t *len;
while (buflen > 0) { while (offset < buflen) {
switch (*code) { switch (options[offset]) {
case DHCP_OPTION_PAD: case DHCP_OPTION_PAD:
buflen -= 1; offset++;
code++;
break; break;
case DHCP_OPTION_END: case DHCP_OPTION_END:
return 0; return 0;
case DHCP_OPTION_MESSAGE_TYPE: case DHCP_OPTION_MESSAGE_TYPE:
if (buflen < 3) if (buflen < offset + 3)
return -ENOBUFS; return -ENOBUFS;
buflen -= 3;
len = code + 1; len = options[++offset];
if (*len != 1) if (len != 1)
return -EINVAL; return -EINVAL;
if (message_type) if (message_type)
*message_type = *(len + 1); *message_type = options[++offset];
else
offset++;
code += 3; offset++;
break; break;
case DHCP_OPTION_OVERLOAD: case DHCP_OPTION_OVERLOAD:
if (buflen < 3) if (buflen < offset + 3)
return -ENOBUFS; return -ENOBUFS;
buflen -= 3;
len = code + 1; len = options[++offset];
if (*len != 1) if (len != 1)
return -EINVAL; return -EINVAL;
if (overload) if (overload)
*overload = *(len + 1); *overload = options[++offset];
else
offset++;
code += 3; offset++;
break; break;
default: default:
if (buflen < 3) if (buflen < offset + 3)
return -ENOBUFS; return -ENOBUFS;
len = code + 1; code = options[offset];
len = options[++offset];
if (buflen < (size_t)*len + 2) if (buflen < ++offset + len)
return -EINVAL; return -EINVAL;
buflen -= *len + 2;
if (cb) if (cb)
cb(*code, *len, len + 1, user_data); cb(code, len, &options[offset], user_data);
code += *len + 2; offset += len;
break; break;
} }
} }
if (buflen) if (offset < buflen)
return -EINVAL; return -EINVAL;
return 0; return 0;
} }
int dhcp_option_parse(DHCPMessage *message, size_t len, 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 overload = 0;
uint8_t message_type = 0; uint8_t message_type = 0;
int res; int r;
if (!message) if (!message)
return -EINVAL; return -EINVAL;
@ -149,23 +149,23 @@ int dhcp_option_parse(DHCPMessage *message, size_t len,
len -= sizeof(DHCPMessage); len -= sizeof(DHCPMessage);
res = parse_options(message->options, len, &overload, &message_type, r = parse_options(message->options, len, &overload, &message_type,
cb, user_data); cb, user_data);
if (res < 0) if (r < 0)
return res; return r;
if (overload & DHCP_OVERLOAD_FILE) { 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); NULL, &message_type, cb, user_data);
if (res < 0) if (r < 0)
return res; return r;
} }
if (overload & DHCP_OVERLOAD_SNAME) { 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); NULL, &message_type, cb, user_data);
if (res < 0) if (r < 0)
return res; return r;
} }
if (message_type) if (message_type)