This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

JFFS file truncation


I'm using the JFFS file system and I'm having problems with files being
truncated during garbage collection. I believe I've tracked down the
problem. I'm hoping someone can give me positive feedback on my fix. The
problem is in this snippet of code below:





Jffs2_gc_fetch_page reads 4K of data into a static buffer. The static buffer
is hidden in the jffs2_gc_fetch_page function. The problem is when the
writebuf pointer is calculated. The offset is used again to reference into
the pg_ptr. You can image when start is equal to 4K that writebuf will
extend beyond the end of the pg_ptr valid memory. Offset is set to start
just before the while loop.



I made a comment below with what I think the fix should be.

Am I missing something?

            pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg);



            if (IS_ERR(pg_ptr)) {

printk(KERN_WARNING "read_cache_page() returned error: %ld\n",
PTR_ERR(pg_ptr));

                        return PTR_ERR(pg_ptr);

            }



            offset = start;

            while(offset < orig_end) {

                        uint32_t datalen;

                        uint32_t cdatalen;

                        char comprtype = JFFS2_COMPR_NONE;



ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &phys_ofs,
&alloclen);



                        if (ret) {

printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for
garbage_collect_dnode failed: %d\n",

                                           sizeof(ri)+ JFFS2_MIN_DATA_LEN,
ret);

                                    break;

                        }

                        cdatalen = min_t(uint32_t, alloclen - sizeof(ri),
end - offset);

                        datalen = end - offset;

                        // This looks to be wrong.

                        writebuf = pg_ptr + (offset & (PAGE_CACHE_SIZE -1));

                        // I think it should be.

                        writebuf = pg_ptr + ((offset -start) &
(PAGE_CACHE_SIZE -1));



-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]