Commit 0eb135ee authored by Chris Novakovic's avatar Chris Novakovic Committed by Greg Kroah-Hartman

ipconfig: Correctly initialise ic_nameservers

[ Upstream commit 300eec7c ]

ic_nameservers, which stores the list of name servers discovered by
ipconfig, is initialised (i.e. has all of its elements set to NONE, or
0xffffffff) by ic_nameservers_predef() in the following scenarios:

 - before the "ip=" and "nfsaddrs=" kernel command line parameters are
   parsed (in ip_auto_config_setup());
 - before autoconfiguring via DHCP or BOOTP (in ic_bootp_init()), in
   order to clear any values that may have been set after parsing "ip="
   or "nfsaddrs=" and are no longer needed.

This means that ic_nameservers_predef() is not called when neither "ip="
nor "nfsaddrs=" is specified on the kernel command line. In this
scenario, every element in ic_nameservers remains set to 0x00000000,
which is indistinguishable from ANY and causes pnp_seq_show() to write
the following (bogus) information to /proc/net/pnp:

  #MANUAL
  nameserver 0.0.0.0
  nameserver 0.0.0.0
  nameserver 0.0.0.0

This is potentially problematic for systems that blindly link
/etc/resolv.conf to /proc/net/pnp.

Ensure that ic_nameservers is also initialised when neither "ip=" nor
"nfsaddrs=" are specified by calling ic_nameservers_predef() in
ip_auto_config(), but only when ip_auto_config_setup() was not called
earlier. This causes the following to be written to /proc/net/pnp, and
is consistent with what gets written when ipconfig is configured
manually but no name servers are specified on the kernel command line:

  #MANUAL
Signed-off-by: default avatarChris Novakovic <chris@chrisn.me.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent aa919040
...@@ -790,6 +790,11 @@ static void __init ic_bootp_init_ext(u8 *e) ...@@ -790,6 +790,11 @@ static void __init ic_bootp_init_ext(u8 *e)
*/ */
static inline void __init ic_bootp_init(void) static inline void __init ic_bootp_init(void)
{ {
/* Re-initialise all name servers to NONE, in case any were set via the
* "ip=" or "nfsaddrs=" kernel command line parameters: any IP addresses
* specified there will already have been decoded but are no longer
* needed
*/
ic_nameservers_predef(); ic_nameservers_predef();
dev_add_pack(&bootp_packet_type); dev_add_pack(&bootp_packet_type);
...@@ -1423,6 +1428,13 @@ static int __init ip_auto_config(void) ...@@ -1423,6 +1428,13 @@ static int __init ip_auto_config(void)
int err; int err;
unsigned int i; unsigned int i;
/* Initialise all name servers to NONE (but only if the "ip=" or
* "nfsaddrs=" kernel command line parameters weren't decoded, otherwise
* we'll overwrite the IP addresses specified there)
*/
if (ic_set_manually == 0)
ic_nameservers_predef();
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
proc_create("pnp", S_IRUGO, init_net.proc_net, &pnp_seq_fops); proc_create("pnp", S_IRUGO, init_net.proc_net, &pnp_seq_fops);
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
...@@ -1640,6 +1652,7 @@ static int __init ip_auto_config_setup(char *addrs) ...@@ -1640,6 +1652,7 @@ static int __init ip_auto_config_setup(char *addrs)
return 1; return 1;
} }
/* Initialise all name servers to NONE */
ic_nameservers_predef(); ic_nameservers_predef();
/* Parse string for static IP assignment. */ /* Parse string for static IP assignment. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment