static nvram_tuple_t * _nvram_realloc( nvram_handle_t *h, nvram_tuple_t *t,
const char *name, const char *value )
{
- if ((strlen(value) + 1) > NVRAM_SPACE)
+ if ((strlen(value) + 1) > h->length - h->offset)
return NULL;
if (!t) {
/* Clear data area */
ptr = (char *) header + sizeof(nvram_header_t);
- memset(ptr, 0xFF, NVRAM_SPACE - sizeof(nvram_header_t));
+ memset(ptr, 0xFF, nvram_part_size - h->offset - sizeof(nvram_header_t));
memset(&tmp, 0, sizeof(nvram_header_t));
/* Leave space for a double NUL at the end */
- end = (char *) header + NVRAM_SPACE - 2;
+ end = (char *) header + nvram_part_size - h->offset - 2;
/* Write out all tuples */
for (i = 0; i < NVRAM_ARRAYSIZE(h->nvram_hash); i++) {
if( mmap_area != MAP_FAILED )
{
- for( i = 0; i <= ((nvram_part_size - NVRAM_SPACE) / sizeof(uint32_t)); i++ )
+ /*
+ * Start looking for NVRAM_MAGIC at beginning of MTD
+ * partition. Stop if there is less than NVRAM_MIN_SPACE
+ * to check, that was the lowest used size.
+ */
+ for( i = 0; i <= ((nvram_part_size - NVRAM_MIN_SPACE) / sizeof(uint32_t)); i++ )
{
if( ((uint32_t *)mmap_area)[i] == NVRAM_MAGIC )
{
if( offset < 0 )
{
+ munmap(mmap_area, nvram_part_size);
free(mtd);
+ close(fd);
return NULL;
}
else if( (h = malloc(sizeof(nvram_handle_t))) != NULL )
header = nvram_header(h);
- if( header->magic == NVRAM_MAGIC )
- {
+ if (header->magic == NVRAM_MAGIC &&
+ (rdonly || header->len < h->length - h->offset)) {
_nvram_rehash(h);
free(mtd);
return h;
}
free(mtd);
+ close(fd);
return NULL;
}
char dev[PATH_MAX];
char *path = NULL;
struct stat s;
- int supported = 1;
-
- /* Refuse any operation on the WGT634U */
- if( (fp = fopen("/proc/diag/model", "r")) )
- {
- if( fgets(dev, sizeof(dev), fp) && !strncmp(dev, "Netgear WGT634U", 15) )
- supported = 0;
-
- fclose(fp);
- }
- if( supported && (fp = fopen("/proc/mtd", "r")) )
+ if ((fp = fopen("/proc/mtd", "r")))
{
while( fgets(dev, sizeof(dev), fp) )
{