env: Handle write-once ethaddr and serial# generically
Use the variable access flags to implement the protection for ethaddr and serial# instead of hard-coding them. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
9d8d661d7f
commit
1d6cd0a3f6
|
@ -503,25 +503,6 @@ int env_flags_validate(const ENTRY *item, const char *newval, enum env_op op,
|
||||||
/* Default value for NULL to protect string-manipulating functions */
|
/* Default value for NULL to protect string-manipulating functions */
|
||||||
newval = newval ? : "";
|
newval = newval ? : "";
|
||||||
|
|
||||||
#ifndef CONFIG_ENV_OVERWRITE
|
|
||||||
/*
|
|
||||||
* Some variables like "ethaddr" and "serial#" can be set only once and
|
|
||||||
* cannot be deleted, unless CONFIG_ENV_OVERWRITE is defined.
|
|
||||||
*/
|
|
||||||
if (op != env_op_create && /* variable exists */
|
|
||||||
(flag & H_FORCE) == 0) { /* and we are not forced */
|
|
||||||
if (strcmp(name, "serial#") == 0 ||
|
|
||||||
(strcmp(name, "ethaddr") == 0
|
|
||||||
#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
|
|
||||||
&& strcmp(oldval, __stringify(CONFIG_ETHADDR)) != 0
|
|
||||||
#endif /* CONFIG_OVERWRITE_ETHADDR_ONCE && CONFIG_ETHADDR */
|
|
||||||
)) {
|
|
||||||
printf("Can't overwrite \"%s\"\n", name);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* validate the value to match the variable type */
|
/* validate the value to match the variable type */
|
||||||
if (op != env_op_delete) {
|
if (op != env_op_delete) {
|
||||||
enum env_flags_vartype type = (enum env_flags_vartype)
|
enum env_flags_vartype type = (enum env_flags_vartype)
|
||||||
|
|
|
@ -53,7 +53,29 @@ enum env_flags_varaccess {
|
||||||
#define CONFIG_ENV_FLAGS_LIST_STATIC ""
|
#define CONFIG_ENV_FLAGS_LIST_STATIC ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_NET
|
||||||
|
#ifdef CONFIG_ENV_OVERWRITE
|
||||||
|
#define ETHADDR_FLAGS "ethaddr:ma,"
|
||||||
|
#else
|
||||||
|
#ifdef CONFIG_OVERWRITE_ETHADDR_ONCE
|
||||||
|
#define ETHADDR_FLAGS "ethaddr:mc,"
|
||||||
|
#else
|
||||||
|
#define ETHADDR_FLAGS "ethaddr:mo,"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define ETHADDR_FLAGS ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_ENV_OVERWRITE
|
||||||
|
#define SERIAL_FLAGS "serial#:so,"
|
||||||
|
#else
|
||||||
|
#define SERIAL_FLAGS ""
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ENV_FLAGS_LIST_STATIC \
|
#define ENV_FLAGS_LIST_STATIC \
|
||||||
|
ETHADDR_FLAGS \
|
||||||
|
SERIAL_FLAGS \
|
||||||
CONFIG_ENV_FLAGS_LIST_STATIC
|
CONFIG_ENV_FLAGS_LIST_STATIC
|
||||||
|
|
||||||
#ifdef CONFIG_CMD_ENV_FLAGS
|
#ifdef CONFIG_CMD_ENV_FLAGS
|
||||||
|
|
|
@ -369,23 +369,6 @@ int fw_env_write(char *name, char *value)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (deleting || overwriting) {
|
if (deleting || overwriting) {
|
||||||
#ifndef CONFIG_ENV_OVERWRITE
|
|
||||||
/*
|
|
||||||
* Ethernet Address and serial# can be set only once
|
|
||||||
*/
|
|
||||||
if (
|
|
||||||
(strcmp(name, "serial#") == 0) ||
|
|
||||||
((strcmp(name, "ethaddr") == 0)
|
|
||||||
#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
|
|
||||||
&& (strcmp(oldval, __stringify(CONFIG_ETHADDR)) != 0)
|
|
||||||
#endif /* CONFIG_OVERWRITE_ETHADDR_ONCE && CONFIG_ETHADDR */
|
|
||||||
) ) {
|
|
||||||
fprintf (stderr, "Can't overwrite \"%s\"\n", name);
|
|
||||||
errno = EROFS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_ENV_OVERWRITE */
|
|
||||||
|
|
||||||
if (*++nxt == '\0') {
|
if (*++nxt == '\0') {
|
||||||
*env = '\0';
|
*env = '\0';
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue