[PATCH] common: nvedit to protect additional ethernet addresses

Stefan Althoefer stefan.althoefer at web.de
Sun Dec 7 14:17:08 CET 2008


This adds "eth[0-9]+addr" to the protected
environment variables that can only be written once.

Code for detecting protected variables was restructured.

Signed-off-by: Stefan Althoefer <stefan.althoefer at web.de>
---
This time I left god comments ;-)

Also, as "grep -r sscanf u-boot" did not match, I hand-crafted
the expression matching (hoping to not have overseen the u-boot
regexp library).

eth0addr will also match.

I found no globally available MAX_ETH_ADDRS, so I dropped this
idea. If one defines eth666addr, he will just find that he cannot
delete it anymore. No more harm.

 common/cmd_nvedit.c |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index d280cb0..18ac349 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -143,6 +143,11 @@ int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 int _do_setenv (int flag, int argc, char *argv[])
 {
 	int   i, len, oldval;
+#ifndef CONFIG_ENV_OVERWRITE
+	int   protected;
+	int   ethnum;
+	char  *s;
+#endif
 	int   console = -1;
 	uchar *env, *nxt = NULL;
 	char *name;
@@ -181,18 +186,31 @@ int _do_setenv (int flag, int argc, char *argv[])
 		 * Ethernet Address and serial# can be set only once,
 		 * ver is readonly.
 		 */
-		if (
+		protected = 0;
 #ifdef CONFIG_HAS_UID
 		/* Allow serial# forced overwrite with 0xdeaf4add flag */
-		    ((strcmp (name, "serial#") == 0) && (flag != 0xdeaf4add)) ||
+		if ((strcmp (name, "serial#") == 0) && (flag != 0xdeaf4add))
 #else
-		    (strcmp (name, "serial#") == 0) ||
+		if (strcmp (name, "serial#") == 0)
 #endif
-		    ((strcmp (name, "ethaddr") == 0)
+			protected = 1;
+
+		if (strcmp (name, "ethaddr") == 0)
 #if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
-		     && (strcmp ((char *)env_get_addr(oldval),MK_STR(CONFIG_ETHADDR)) != 0)
+			/* Allow "ethaddr" overwrite to change pre-configured address */
+			if (strcmp ((char *)env_get_addr(oldval),MK_STR(CONFIG_ETHADDR)) != 0)
 #endif	/* CONFIG_OVERWRITE_ETHADDR_ONCE && CONFIG_ETHADDR */
-		    ) ) {
+				protected = 1;
+
+		/* "eth[0-9]+addr" is always protected */
+		if (strncmp (name, "eth", 3) == 0) {
+			ethnum = simple_strtoul (name+3, &s, 10);
+			if (s != name + 3)
+				if (strcmp (s, "addr") == 0)
+					protected = 1;
+		}
+
+		if (protected) {
 			printf ("Can't overwrite \"%s\"\n", name);
 			return 1;
 		}
-- 
1.5.4.5




More information about the U-Boot mailing list