summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorLeonid Iziumtsev <leonid.iziumtsev@gmail.com>2018-05-08 15:55:50 +0200
committerJoe Hershberger <joe.hershberger@ni.com>2018-06-13 13:54:16 -0500
commit60177b26171a8f13be1b2d061db36784fc86a861 (patch)
tree87969872714b7b73deba1551e68b9d207608a047 /net
parent552e7c57d035792c8939d86f276624e2614b936b (diff)
downloadu-boot-60177b26171a8f13be1b2d061db36784fc86a861.tar.gz
net: Protect net_state from reentrant net_loop()
Global variable "net_state" is used in net_loop() state-machine. But it happens that some times the net_loop() can be called multiple times in the same call stack. For example when the netconsole is enabled and we print the message while some other net protocol is in action. Netconsole will overwrite the "net_state" and that will break the logic for earlier started protocol. To protect the state save and restore "net_state" variable each time when we enter and exit net_loop(). Signed-off-by: Leonid Iziumtsev <leonid.iziumtsev@se.atlascopco.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'net')
-rw-r--r--net/net.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/net.c b/net/net.c
index a4932f46d9..b4563a4cab 100644
--- a/net/net.c
+++ b/net/net.c
@@ -393,6 +393,7 @@ void net_init(void)
int net_loop(enum proto_t protocol)
{
int ret = -EINVAL;
+ enum net_loop_state prev_net_state = net_state;
net_restarted = 0;
net_dev_exists = 0;
@@ -430,6 +431,7 @@ restart:
case 1:
/* network not configured */
eth_halt();
+ net_set_state(prev_net_state);
return -ENODEV;
case 2:
@@ -655,6 +657,7 @@ done:
net_set_udp_handler(NULL);
net_set_icmp_handler(NULL);
#endif
+ net_set_state(prev_net_state);
return ret;
}