FAILED: patch "[PATCH] net: ipconfig: bound DHCP option construction" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x e47a1958e12abc3a17b5231a4f21c8f1bf662e08
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092952-division-doorbell-48be@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e47a1958e12abc3a17b5231a4f21c8f1bf662e08 Mon Sep 17 00:00:00 2001
From: Yuqi Xu <[email protected]>
Date: Sat, 19 Sep 2026 16:45:27 +0800
Subject: [PATCH] net: ipconfig: bound DHCP option construction
ic_dhcp_init_options() appends the hostname (option 12), vendor-class (option 60) and client-ID (option 61) options into the fixed 312-byte bootp_pkt.exten[] buffer. Only the client-ID branch checked the remaining space; the hostname and vendor-class writes were unbounded.
A 64-byte hostname together with the maximum 252-byte dhcpclass= identifier needs 18 + (2 + 64) + (2 + 252) = 338 of the 312 available bytes even before the terminating END marker, so the vendor-class memcpy runs past the end of exten[]. With CONFIG_FORTIFY_SOURCE this is reported as a field-spanning write and, when the kernel is booted with panic_on_warn=1, aborts boot with a panic.
Route the optional options through a common helper that makes sure the option, its 2-byte header and the END marker all fit and drops an option that would not. Configurations with short options keep sending exactly the same bytes as before.
net/ipv4/ipconfig.c +26 -19
@@ -676,6 +676,24 @@ static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 };#ifdef IPCONFIG_DHCP +static bool __init +ic_dhcp_add_option (u8 **options,const u8 *end,u8 type,const void *value, +int len) +{ +u8 *e = *options; + +/* leave room for the option header and the END marker */ +if (len >U8_MAX || end - e < len +3 ) +return false; + + *e++ = type; + *e++ = len; +memcpy (e, value, len); + *options = e + len; + +return true; +} +static void __init ic_dhcp_init_options (u8 *options,struct ic_device *d) {
@@ -691,6 +709,7 @@ ic_dhcp_init_options(u8 *options, struct ic_device *d) 42, /* NTP servers */ };u8 mt = (ic_servaddr ==NONE ) ?DHCPDISCOVER :DHCPREQUEST ; +u8 *end = options +sizeof (((struct bootp_pkt *)0 )->exten);u8 *e = options;int len;
@@ -721,31 +740,19 @@ ic_dhcp_init_options(u8 *options, struct ic_device *d) e +=sizeof (ic_req_params);if (ic_host_name_set) { - *e++ =12 ;/* host-name */ len =strlen (utsname ()->nodename); - *e++ = len; -memcpy (e,utsname ()->nodename, len); - e += len; +ic_dhcp_add_option (&e, end,12 ,utsname ()->nodename, len); }if (*vendor_class_identifier) { -pr_info ("DHCP: sending class identifier \"%s\"\n" , - vendor_class_identifier); - *e++ =60 ;/* Class-identifier */ len =strlen (vendor_class_identifier); - *e++ = len; -memcpy (e, vendor_class_identifier, len); - e += len; +if (ic_dhcp_add_option (&e, end,60 , vendor_class_identifier, len)) +pr_info ("DHCP: sending class identifier \"%s\"\n" , + vendor_class_identifier); } len =strlen (dhcp_client_identifier +1 ); -/* the minimum length of identifier is 2, include 1 byte type, -* and can not be larger than the length of options -*/ -if (len >=1 && len <312 - (e - options) -1 ) { - *e++ =61 ; - *e++ = len +1 ; -memcpy (e, dhcp_client_identifier, len +1 ); - e += len +1 ; - } +/* the minimum length of identifier is 2, include 1 byte type */ +if (len >=1 ) +ic_dhcp_add_option (&e, end,61 , dhcp_client_identifier, len +1 ); *e++ =255 ;/* End of the list */ }
Sasha Levin
maintainerPATCH 1/2 net: ipconfig: Remove outdated comment and indent code block
From: Thorsten Blum <[email protected]>
[ Upstream commit e405b3c9d4aaa10972525fe2ea5cf94224020561 ]
The comment has been around ever since commit 1da177e4c3f4 ("Linux-2.6.12-rc2") and can be removed. Remove it and indent the code block accordingly.
Stable-dep-of: e47a1958e12a ("net: ipconfig: bound DHCP option construction")
--- net/ipv4/ipconfig.c | 89 +++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 47 deletions(-)
net/ipv4/ipconfig.c +42 -47
@@ -679,8 +679,18 @@ static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 };static void __init ic_dhcp_init_options (u8 *options,struct ic_device *d) { -u8 mt = ((ic_servaddr ==NONE ) - ?DHCPDISCOVER :DHCPREQUEST ); +static const u8 ic_req_params[] = { +1 ,/* Subnet mask */ +3 ,/* Default gateway */ +6 ,/* DNS server */ +12 ,/* Host name */ +15 ,/* Domain name */ +17 ,/* Boot path */ +26 ,/* MTU */ +40 ,/* NIS domain name */ +42 ,/* NTP servers */ + }; +u8 mt = (ic_servaddr ==NONE ) ?DHCPDISCOVER :DHCPREQUEST ;u8 *e = options;int len;
@@ -705,51 +715,36 @@ ic_dhcp_init_options(u8 *options, struct ic_device *d) e +=4 ; } -/* always? */ - { -static const u8 ic_req_params[] = { -1 ,/* Subnet mask */ -3 ,/* Default gateway */ -6 ,/* DNS server */ -12 ,/* Host name */ -15 ,/* Domain name */ -17 ,/* Boot path */ -26 ,/* MTU */ -40 ,/* NIS domain name */ -42 ,/* NTP servers */ - }; - - *e++ =55 ;/* Parameter request list */ - *e++ =sizeof (ic_req_params); -memcpy (e, ic_req_params,sizeof (ic_req_params)); - e +=sizeof (ic_req_params); - -if (ic_host_name_set) { - *e++ =12 ;/* host-name */ - len =strlen (utsname ()->nodename); - *e++ = len; -memcpy (e,utsname ()->nodename, len); - e += len; - } -if (*vendor_class_identifier) { -pr_info ("DHCP: sending class identifier \"%s\"\n" , - vendor_class_identifier); - *e++ =60 ;/* Class-identifier */ - len =strlen (vendor_class_identifier); - *e++ = len; -memcpy (e, vendor_class_identifier, len); - e += len; - } - len =strlen (dhcp_client_identifier +1 ); -/* the minimum length of identifier is 2, include 1 byte type, -* and can not be larger than the length of options -*/ -if (len >=1 && len <312 - (e - options) -1 ) { - *e++ =61 ; - *e++ = len +1 ; -memcpy (e, dhcp_client_identifier, len +1 ); - e += len +1 ; - } + *e++ =55 ;/* Parameter request list */ + *e++ =sizeof (ic_req_params); +memcpy (e, ic_req_params,sizeof (ic_req_params)); + e +=sizeof (ic_req_params); + +if (ic_host_name_set) { + *e++ =12 ;/* host-name */ + len =strlen (utsname ()->nodename); + *e++ = len; +memcpy (e,utsname ()->nodename, len); + e += len; + } +if (*vendor_class_identifier) { +pr_info ("DHCP: sending class identifier \"%s\"\n" , + vendor_class_identifier); + *e++ =60 ;/* Class-identifier */ + len =strlen (vendor_class_identifier); + *e++ = len; +memcpy (e, vendor_class_identifier, len); + e += len; + } + len =strlen (dhcp_client_identifier +1 ); +/* the minimum length of identifier is 2, include 1 byte type, +* and can not be larger than the length of options +*/ +if (len >=1 && len <312 - (e - options) -1 ) { + *e++ =61 ; + *e++ = len +1 ; +memcpy (e, dhcp_client_identifier, len +1 ); + e += len +1 ; } *e++ =255 ;/* End of the list */
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 net: ipconfig: bound DHCP option construction
From: Yuqi Xu <[email protected]>
[ Upstream commit e47a1958e12abc3a17b5231a4f21c8f1bf662e08 ]
ic_dhcp_init_options() appends the hostname (option 12), vendor-class (option 60) and client-ID (option 61) options into the fixed 312-byte bootp_pkt.exten[] buffer. Only the client-ID branch checked the remaining space; the hostname and vendor-class writes were unbounded.
A 64-byte hostname together with the maximum 252-byte dhcpclass= identifier needs 18 + (2 + 64) + (2 + 252) = 338 of the 312 available bytes even before the terminating END marker, so the vendor-class memcpy runs past the end of exten[]. With CONFIG_FORTIFY_SOURCE this is reported as a field-spanning write and, when the kernel is booted with panic_on_warn=1, aborts boot with a panic.
Route the optional options through a common helper that makes sure the option, its 2-byte header and the END marker all fit and drops an option that would not. Configurations with short options keep sending exactly the same bytes as before.
--- net/ipv4/ipconfig.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-)
net/ipv4/ipconfig.c +26 -19
@@ -676,6 +676,24 @@ static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 };#ifdef IPCONFIG_DHCP +static bool __init +ic_dhcp_add_option (u8 **options,const u8 *end,u8 type,const void *value, +int len) +{ +u8 *e = *options; + +/* leave room for the option header and the END marker */ +if (len >U8_MAX || end - e < len +3 ) +return false; + + *e++ = type; + *e++ = len; +memcpy (e, value, len); + *options = e + len; + +return true; +} +static void __init ic_dhcp_init_options (u8 *options,struct ic_device *d) {
@@ -691,6 +709,7 @@ ic_dhcp_init_options(u8 *options, struct ic_device *d) 42, /* NTP servers */ };u8 mt = (ic_servaddr ==NONE ) ?DHCPDISCOVER :DHCPREQUEST ; +u8 *end = options +sizeof (((struct bootp_pkt *)0 )->exten);u8 *e = options;int len;
@@ -721,31 +740,19 @@ ic_dhcp_init_options(u8 *options, struct ic_device *d) e +=sizeof (ic_req_params);if (ic_host_name_set) { - *e++ =12 ;/* host-name */ len =strlen (utsname ()->nodename); - *e++ = len; -memcpy (e,utsname ()->nodename, len); - e += len; +ic_dhcp_add_option (&e, end,12 ,utsname ()->nodename, len); }if (*vendor_class_identifier) { -pr_info ("DHCP: sending class identifier \"%s\"\n" , - vendor_class_identifier); - *e++ =60 ;/* Class-identifier */ len =strlen (vendor_class_identifier); - *e++ = len; -memcpy (e, vendor_class_identifier, len); - e += len; +if (ic_dhcp_add_option (&e, end,60 , vendor_class_identifier, len)) +pr_info ("DHCP: sending class identifier \"%s\"\n" , + vendor_class_identifier); } len =strlen (dhcp_client_identifier +1 ); -/* the minimum length of identifier is 2, include 1 byte type, -* and can not be larger than the length of options -*/ -if (len >=1 && len <312 - (e - options) -1 ) { - *e++ =61 ; - *e++ = len +1 ; -memcpy (e, dhcp_client_identifier, len +1 ); - e += len +1 ; - } +/* the minimum length of identifier is 2, include 1 byte type */ +if (len >=1 ) +ic_dhcp_add_option (&e, end,61 , dhcp_client_identifier, len +1 ); *e++ =255 ;/* End of the list */ }
Signature · 1 line
2.53.0