sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit f636ac791bd87faa9556e0c6ed858777dd8295c6
parent c1730c78de68b99c0e93a7a88612ddaaf7c35454
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat, 20 Jul 2013 18:08:58 +0200

Avoid infinite loop in tar

When the tar file is written in one directory archived by tar
the function archive enters in an infinite loop due to de
tar file written. This patch avoid this case checking the
inode of the tar file before of adding it to the archive.

Diffstat:
Mtar.c | 10++++++++++
1 file changed, 10 insertions(+), 0 deletions(-)

diff --git a/tar.c b/tar.c @@ -47,6 +47,7 @@ static void c(char *); static void xt(int (*)(char*, int, char[Blksiz])); static FILE *tarfile; +static ino_t tarinode; static void usage(void) @@ -117,9 +118,14 @@ main(int argc, char *argv[]) usage(); if(file) { + struct stat st; + tarfile = fopen(file, (mode == 'c') ? "wb" : "rb"); if(!tarfile) eprintf("tar: open '%s':", file); + if (lstat(file, &st) < 0) + eprintf("tar: stat '%s':", file); + tarinode = st.st_ino; } else { tarfile = (mode == 'c') ? stdout : stdin; } @@ -155,6 +161,10 @@ archive(const char* path, const struct stat* sta, int type) mode_t mode; lstat(path, &st); + if (st.st_ino == tarinode) { + fprintf(stderr, "ignoring '%s'\n", path); + return 0; + } pw = getpwuid(st.st_uid); gr = getgrgid(st.st_gid);