When the value length of an option exceeds 255 bytes, split it into a second option with same option id, following rfc3396.
Signed-off-by: Peter Kaestle <peter.kaes...@nokia.com> --- src/dhcp-protocol.h | 5 ++++- src/rfc2131.c | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/dhcp-protocol.h b/src/dhcp-protocol.h index 3dde354..faf1b2b 100644 --- a/src/dhcp-protocol.h +++ b/src/dhcp-protocol.h @@ -92,11 +92,14 @@ #define DHCP_CHADDR_MAX 16 +#define MAX_OPTION_BUFF_SIZE 3000 +#define MAX_OPTION_SIZE 255 + struct dhcp_packet { u8 op, htype, hlen, hops; u32 xid; u16 secs, flags; struct in_addr ciaddr, yiaddr, siaddr, giaddr; u8 chaddr[DHCP_CHADDR_MAX], sname[64], file[128]; - u8 options[312]; + u8 options[MAX_OPTION_BUFF_SIZE]; }; diff --git a/src/rfc2131.c b/src/rfc2131.c index 68834ea..b428c40 100644 --- a/src/rfc2131.c +++ b/src/rfc2131.c @@ -1979,13 +1979,25 @@ static void option_put_string(struct dhcp_packet *mess, unsigned char *end, int const char *string, int null_term) { unsigned char *p; - size_t len = strlen(string); - - if (null_term && len != 255) + /* using signed int here to detect if length is shorter than MAX_OPTION_SIZE */ + int len = strlen(string); + + /* + * if string is not terminated, add one byte for termination + * - don't do that in case data fits exactly in 255 bytes of one option + */ + if (null_term && len % MAX_OPTION_SIZE) len++; - if ((p = free_space(mess, end, opt, len))) - memcpy(p, string, len); + /* if option data length is bigger than 255, split it like specified in rfc3396 */ + for (; len > 0; len -= MAX_OPTION_SIZE, string += MAX_OPTION_SIZE) { + size_t l = len >= MAX_OPTION_SIZE ? MAX_OPTION_SIZE : len; + + if ((p = free_space(mess, end, opt, l))) + memcpy(p, string, l); + else + break; + } } /* return length, note this only does the data part */ -- 2.45.0 _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss