if (!nand_cache) {
/* This memory never gets freed but 'cause
it's a bootloader, nobody cares */
- nand_cache = malloc(NAND_CACHE_SIZE);
- if (!nand_cache) {
+ nand_cache = malloc(NAND_CACHE_SIZE);
+ if (!nand_cache) {
printf("read_nand_cached: can't alloc cache size %d bytes\n",
NAND_CACHE_SIZE);
return -1;
return NULL;
}
if (read_nand_cached(off, size, buf) < 0) {
- free(buf);
+ if (!ext_buf)
+ free(buf);
return NULL;
}
return ret;
}
-static void put_fl_mem(void *buf)
+static void put_fl_mem(void *buf)
{
free(buf);
}
return (void*)off;
}
-static inline void put_fl_mem(void *buf)
+static inline void put_fl_mem(void *buf)
{
}
struct jffs2_raw_dirent ojOld;
struct jffs2_raw_dirent *jNew =
(struct jffs2_raw_dirent *)get_fl_mem(new->offset, sizeof(ojNew), &ojNew);
- struct jffs2_raw_dirent *jOld =
+ struct jffs2_raw_dirent *jOld =
(struct jffs2_raw_dirent *)get_fl_mem(old->offset, sizeof(ojOld), &ojOld);
int cmp;
* we will live with it.
*/
for (b = pL->frag.listHead; b != NULL; b = b->next) {
- jNode = (struct jffs2_raw_inode *) get_fl_mem(b->offset,
+ jNode = (struct jffs2_raw_inode *) get_fl_mem(b->offset,
sizeof(struct jffs2_raw_inode), NULL);
if ((inode == jNode->ino)) {
/* get actual file length from the newest node */
while (b2) {
jNode = (struct jffs2_raw_inode *)
get_fl_mem(b2->offset, sizeof(ojNode), &ojNode);
- if (jNode->ino == jDir->ino
- && jNode->version >= i_version)
- i = get_fl_mem(b2->offset, sizeof(*i), NULL);
+ if (jNode->ino == jDir->ino && jNode->version >= i_version) {
+ if (i)
+ put_fl_mem(i);
+
+ if (jDir->type == DT_LNK)
+ i = get_node_mem(b2->offset);
+ else
+ i = get_fl_mem(b2->offset, sizeof(*i), NULL);
+ }
b2 = b2->next;
}
while (b2) {
jNode = (struct jffs2_raw_inode *) get_node_mem(b2->offset);
if (jNode->ino == jDirFoundIno) {
- src = (unsigned char *) (b2->offset + sizeof(struct jffs2_raw_inode));
+ src = (unsigned char *)jNode + sizeof(struct jffs2_raw_inode);
#if 0
putLabeledWord("\t\t dsize = ", jNode->dsize);