[BusyBox 0005124]: vi in busybox always writes files with length 0

bugs at busybox.net bugs at busybox.net
Fri Sep 26 10:43:31 UTC 2008


A NOTE has been added to this issue. 
====================================================================== 
http://busybox.net/bugs/view.php?id=5124 
====================================================================== 
Reported By:                DanLiang
Assigned To:                BusyBox
====================================================================== 
Project:                    BusyBox
Issue ID:                   5124
Category:                   Documentation
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     assigned
====================================================================== 
Date Submitted:             09-23-2008 20:43 PDT
Last Modified:              09-26-2008 03:43 PDT
====================================================================== 
Summary:                    vi in busybox always writes files with length 0
Description: 
I use buildroot to create a rootfs and test it.

My configuration is
uclibc-0.9.29
gcc-4.2.4
busybox-1.12.0

When I try to modify a existing file or create a new one with vi, after I
save the contents and exit from vi, the file length is always 0 and all
the contents are lost.

In file vi.c, I find if I comment out the line "ftruncate(fd, charcnt);"
in function "static int file_write(char *fn, char *first, char *last)",
everything is OK.
====================================================================== 

---------------------------------------------------------------------- 
 vda - 09-24-08 04:14  
---------------------------------------------------------------------- 
Please add this debugging code:

        charcnt = full_write(fd, first, cnt);
bb_error_msg("file_write: cnt:%d charcnt:%d", cnt, charcnt);
sleep(5);
        ftruncate(fd, charcnt);

and let me know what do you see when you try to save a file. 

---------------------------------------------------------------------- 
 DanLiang - 09-24-08 19:20  
---------------------------------------------------------------------- 
Hi vda

when I try to save a file, a message is printed out like this:
vi: file_write: cnt:10 charcnt:10. 
Variable 'cnt' always has the same value with 'charcnt'.
which means no matter what value I pass to ftruncate(), it will truncate
the file length to 0.

But it's very strange when I wrote a small program:
---------------------------------------------------
#include <unistd.h>
#include <fcntl.h>

int main()
{
        char buf[] = "test";
        int fd, cnt, charcnt;

        fd = open("test.txt", (O_RDWR | O_CREAT), 0666);
        if (fd < 0)
                return -1;
        cnt = sizeof(buf);
        buf[cnt-1] = 0x0A;
        charcnt = write(fd, buf, cnt);
        ftruncate(fd, charcnt);
        if (charcnt == cnt) {
        // good write
        //file_modified = FALSE;
        } else {
                charcnt = 0;
        }
        close(fd);
        return charcnt;
}
---------------------------------------------------
I tested it on my ARM board, and it's ok with string "test" in that file. 

---------------------------------------------------------------------- 
 vda - 09-25-08 14:30  
---------------------------------------------------------------------- 
Can you strace vi? "strace -o s.log vi ..."
Do the same with your test program.
Look how ftruncate's are different in the logs.
If you can't figure it out, just attach strace logs to this bug. 

---------------------------------------------------------------------- 
 DanLiang - 09-26-08 00:35  
---------------------------------------------------------------------- 
Hi vda,

trace_vi.log is logged when I tried to write string "abcd" into file
abc.txt.

trace_test.log is logged when the samll program is run.

In trace_vi.log, ftruncate64 is called, while in trace_test.log, ftruncate
is called.

In source code "vi.c" ftruncate() is called.

If I rewrite the samll test program to explicitly use ftruncate64, a weird
file size 21474836485 is seen.

 

---------------------------------------------------------------------- 
 vda - 09-26-08 02:41  
---------------------------------------------------------------------- 
Does it help if you replace

ftruncate(fd, charcnt);

with

ftruncate(fd, (off_t)charcnt);

? 

---------------------------------------------------------------------- 
 DanLiang - 09-26-08 03:04  
---------------------------------------------------------------------- 
It has the same result. :-( 

---------------------------------------------------------------------- 
 vda - 09-26-08 03:43  
---------------------------------------------------------------------- 
Looks like your libc or kernel mishandle ftruncate64(). Which version of
kernel is it? 

Issue History 
Date Modified   Username       Field                    Change               
====================================================================== 
09-23-08 20:43  DanLiang       New Issue                                    
09-23-08 20:43  DanLiang       Status                   new => assigned     
09-23-08 20:43  DanLiang       Assigned To               => BusyBox         
09-24-08 01:14  DanLiang       Issue Monitored: DanLiang                    
09-24-08 04:14  vda            Note Added: 0011854                          
09-24-08 19:20  DanLiang       Note Added: 0011934                          
09-25-08 14:30  vda            Note Added: 0012084                          
09-25-08 23:36  DanLiang       File Added: trace_vi.log                     
09-25-08 23:36  DanLiang       File Added: trace_test.log                    
09-25-08 23:39  DanLiang       Note Added: 0012124                          
09-26-08 00:28  DanLiang       Note Edited: 0012124                         
09-26-08 00:35  DanLiang       Note Edited: 0012124                         
09-26-08 02:41  vda            Note Added: 0012134                          
09-26-08 03:04  DanLiang       Note Added: 0012144                          
09-26-08 03:43  vda            Note Added: 0012154                          
======================================================================




More information about the busybox-cvs mailing list