bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bash truncates HISTFILE when disk is full


From: chkno
Subject: Bash truncates HISTFILE when disk is full
Date: Sun, 20 Mar 2011 19:37:40 -0700
User-agent: Mutt/1.5.20 (2009-06-14)

Configuration Information [Automatically generated, do not change]:
Machine: i686
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='i686' 
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu' 
-DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL 
-DHAVE_CONFIG_H   -I.  -I../bash -I../bash/include -I../bash/lib   -g -O2 -Wall
uname output: Linux dragonfly 2.6.35-27-generic #48-Ubuntu SMP Tue Feb 22 
20:25:29 UTC 2011 i686 GNU/Linux
Machine Type: i686-pc-linux-gnu

Bash Version: 4.1
Patch Level: 5
Release Status: release

Description:
        Bash truncates HISTFILE (~/.bash_history) to zero bytes when the
        filesystem is full.

Repeat-By:
        Use bash with a full HISTFILE (ie, one that has HISTFILESIZE lines
        in it) and a full disk.  The HISTFILE is empty afterwords.

        Long, drawn out, concrete example including making a new test
        user with a home directory on a separate filesystem so it can
        be easily and harmlessly filled up:

        $ # Create a new user with a home dir on a small temporary filesystem
        $ sudo adduser bashbug
        Adding user `bashbug' ...
        Adding new group `bashbug' (1002) ...
        Adding new user `bashbug' (1002) with group `bashbug' ...
        Creating home directory `/home/bashbug' ...
        Copying files from `/etc/skel' ...
        Enter new UNIX password:
        Retype new UNIX password:
        passwd: password updated successfully
        Changing the user information for bashbug
        Enter the new value, or press ENTER for the default
                Full Name []:
                Room Number []:
                Work Phone []:
                Home Phone []:
                Other []:
        Is the information correct? [Y/n]
        $ dd if=/dev/zero of=/dev/shm/bashbug-home bs=1M count=10
        10+0 records in
        10+0 records out
        10485760 bytes (10 MB) copied, 0.0332525 s, 315 MB/s
        $ mke2fs /dev/shm/bashbug-home
        mke2fs 1.41.12 (17-May-2010)
        /dev/shm/bashbug-home is not a block special device.
        Proceed anyway? (y,n) y
        Filesystem label=
        OS type: Linux
        Block size=1024 (log=0)
        Fragment size=1024 (log=0)
        Stride=0 blocks, Stripe width=0 blocks
        2560 inodes, 10240 blocks
        512 blocks (5.00%) reserved for the super user
        First data block=1
        Maximum filesystem blocks=10485760
        2 block groups
        8192 blocks per group, 8192 fragments per group
        1280 inodes per group
        Superblock backups stored on blocks:
                8193

        Writing inode tables: done
        Writing superblocks and filesystem accounting information: done

        This filesystem will be automatically checked every 31 mounts or
        180 days, whichever comes first.  Use tune2fs -c or -i to override.
        $ sudo mount -o loop /dev/shm/bashbug-home /dev/shm/bashbug-home-mnt
        $ sudo mv -v /home/bashbug/* /home/bashbug/.??* 
/dev/shm/bashbug-home-mnt/
        `/home/bashbug/examples.desktop' -> 
`/dev/shm/bashbug-home-mnt/examples.desktop'
        removed `/home/bashbug/examples.desktop'
        `/home/bashbug/.bash_logout' -> `/dev/shm/bashbug-home-mnt/.bash_logout'
        removed `/home/bashbug/.bash_logout'
        `/home/bashbug/.bashrc' -> `/dev/shm/bashbug-home-mnt/.bashrc'
        removed `/home/bashbug/.bashrc'
        `/home/bashbug/.profile' -> `/dev/shm/bashbug-home-mnt/.profile'
        removed `/home/bashbug/.profile'
        $ sudo chown bashbug:bashbug /dev/shm/bashbug-home-mnt
        $ sudo umount /dev/shm/bashbug-home-mnt
        $ sudo mount -o loop /dev/shm/bashbug-home /home/bashbug
        $ df
        Filesystem           1K-blocks      Used Available Use% Mounted on
        ...
        /dev/loop0                9911        99      9300   2% /home/bashbug
        $
        $
        $
        $
        $ # Fill up .bash_history and let bash trim it to HISTFILESIZE
        $ sudo -u bashbug -i
        bashbug$ yes | head -n 3000 > .bash_history
        bashbug$ echo $HISTFILE $HISTSIZE $HISTFILESIZE  # The defaults
        /home/bashbug/.bash_history 1000 2000
        bashbug$ wc -l .bash_history
        3000 .bash_history
        bashbug$ logout
        $ wc -l /home/bashbug/.bash_history
        2000 /home/bashbug/.bash_history
        $
        $
        $
        $
        $ # Fill up the filesystem
        $ sudo bash -c 'yes > /home/bashbug/full'
        yes: standard output: No space left on device
        yes: write error
        $
        $
        $
        $
        $ # On next use, .bash_history becomes empty:
        $ sudo -u bashbug -i
        bashbug$ whoami  # Any command
        bashbug
        bashbug$ logout
        $ ls -l /home/bashbug/.bash_history
        -rw-r--r-- 1 bashbug bashbug 0 2011-03-20 17:08 
/home/bashbug/.bash_history

Fix:
        Bash should write out the new HISTFILE before destroying the
        existing one.  That way, if writing the new one fails, the old
        one can be left intact.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]