From f636ac791bd87faa9556e0c6ed858777dd8295c6 Mon Sep 17 00:00:00 2001 From: "Roberto E. Vargas Caballero" Date: Sat, 20 Jul 2013 18:08:58 +0200 Subject: [PATCH] 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. --- tar.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tar.c b/tar.c index 87b7236..0f3ce33 100644 --- 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);