@ -278,6 +278,7 @@ int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts)
printf ( " %s \n " , env ) ;
}
fw_env_close ( opts ) ;
return 0 ;
}
@ -300,10 +301,12 @@ int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts)
printf ( " %s=%s \n " , name , val ) ;
}
fw_env_close ( opts ) ;
return rc ;
}
int fw_env_close ( struct env_opts * opts )
int fw_env_flush ( struct env_opts * opts )
{
int ret ;
@ -472,6 +475,7 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts)
char * name , * * valv ;
char * value = NULL ;
int valc ;
int ret ;
if ( ! opts )
opts = & default_opts ;
@ -491,8 +495,10 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts)
valv = argv + 1 ;
valc = argc - 1 ;
if ( env_flags_validate_env_set_params ( name , valv , valc ) < 0 )
if ( env_flags_validate_env_set_params ( name , valv , valc ) < 0 ) {
fw_env_close ( opts ) ;
return - 1 ;
}
len = 0 ;
for ( i = 0 ; i < valc ; + + i ) {
@ -518,7 +524,10 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts)
free ( value ) ;
return fw_env_close ( opts ) ;
ret = fw_env_flush ( opts ) ;
fw_env_close ( opts ) ;
return ret ;
}
/*
@ -639,7 +648,9 @@ int fw_parse_script(char *fname, struct env_opts *opts)
if ( strcmp ( fname , " - " ) ! = 0 )
fclose ( fp ) ;
ret | = fw_env_close ( opts ) ;
ret | = fw_env_flush ( opts ) ;
fw_env_close ( opts ) ;
return ret ;
}
@ -1105,11 +1116,11 @@ int fw_env_open(struct env_opts *opts)
{
int crc0 , crc0_ok ;
unsigned char flag0 ;
void * addr0 ;
void * addr0 = NULL ;
int crc1 , crc1_ok ;
unsigned char flag1 ;
void * addr1 ;
void * addr1 = NULL ;
int ret ;
@ -1120,14 +1131,15 @@ int fw_env_open(struct env_opts *opts)
opts = & default_opts ;
if ( parse_config ( opts ) ) /* should fill envdevices */
return - 1 ;
return - EINVAL ;
addr0 = calloc ( 1 , CUR_ENVSIZE ) ;
if ( addr0 = = NULL ) {
fprintf ( stderr ,
" Not enough memory for environment (%ld bytes) \n " ,
CUR_ENVSIZE ) ;
return - 1 ;
ret = - ENOMEM ;
goto open_cleanup ;
}
/* read environment from FLASH to local buffer */
@ -1146,8 +1158,10 @@ int fw_env_open(struct env_opts *opts)
}
dev_current = 0 ;
if ( flash_io ( O_RDONLY ) )
return - 1 ;
if ( flash_io ( O_RDONLY ) ) {
ret = - EIO ;
goto open_cleanup ;
}
crc0 = crc32 ( 0 , ( uint8_t * ) environment . data , ENV_SIZE ) ;
@ -1155,7 +1169,7 @@ int fw_env_open(struct env_opts *opts)
ret = env_aes_cbc_crypt ( environment . data , 0 ,
opts - > aes_key ) ;
if ( ret )
return ret ;
goto open_cleanup ;
}
crc0_ok = ( crc0 = = * environment . crc ) ;
@ -1174,7 +1188,8 @@ int fw_env_open(struct env_opts *opts)
fprintf ( stderr ,
" Not enough memory for environment (%ld bytes) \n " ,
CUR_ENVSIZE ) ;
return - 1 ;
ret = - ENOMEM ;
goto open_cleanup ;
}
redundant = addr1 ;
@ -1183,8 +1198,10 @@ int fw_env_open(struct env_opts *opts)
* other pointers in environment still point inside addr0
*/
environment . image = addr1 ;
if ( flash_io ( O_RDONLY ) )
return - 1 ;
if ( flash_io ( O_RDONLY ) ) {
ret = - EIO ;
goto open_cleanup ;
}
/* Check flag scheme compatibility */
if ( DEVTYPE ( dev_current ) = = MTD_NORFLASH & &
@ -1204,7 +1221,8 @@ int fw_env_open(struct env_opts *opts)
environment . flag_scheme = FLAG_INCREMENTAL ;
} else {
fprintf ( stderr , " Incompatible flash types! \n " ) ;
return - 1 ;
ret = - EINVAL ;
goto open_cleanup ;
}
crc1 = crc32 ( 0 , ( uint8_t * ) redundant - > data , ENV_SIZE ) ;
@ -1213,7 +1231,7 @@ int fw_env_open(struct env_opts *opts)
ret = env_aes_cbc_crypt ( redundant - > data , 0 ,
opts - > aes_key ) ;
if ( ret )
return ret ;
goto open_cleanup ;
}
crc1_ok = ( crc1 = = redundant - > crc ) ;
@ -1285,6 +1303,28 @@ int fw_env_open(struct env_opts *opts)
# endif
}
return 0 ;
open_cleanup :
if ( addr0 )
free ( addr0 ) ;
if ( addr1 )
free ( addr0 ) ;
return ret ;
}
/*
* Simply free allocated buffer with environment
*/
int fw_env_close ( struct env_opts * opts )
{
if ( environment . image )
free ( environment . image ) ;
environment . image = NULL ;
return 0 ;
}
static int check_device_config ( int dev )