[PATCH] Completely ignore character and block devices in tar(1)

From: sin <sin_AT_2f30.org>
Date: Thu, 30 Jan 2014 14:51:21 +0000

Support for character and block devices is optional in POSIX.
We cannot guarantee that this will work correctly and it is not
portable, so just drop support for it in tar(1).
---
 tar.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/tar.c b/tar.c
index 1ecf8bd..dc82888 100644
--- a/tar.c
+++ b/tar.c
_AT_@ -166,6 +166,13 @@ archive(const char* path)
 		fprintf(stderr, "ignoring '%s'\n", path);
 		return 0;
 	}
+	mode = st.st_mode;
+	/* return early for character and block devices */
+	if(S_ISCHR(mode) || S_ISBLK(mode)) {
+		weprintf("ignoring character or block device\n");
+		return 0;
+	}
+
 	pw = getpwuid(st.st_uid);
 	gr = getgrgid(st.st_gid);
 
_AT_@ -191,10 +198,6 @@ archive(const char* path)
 	} else if(S_ISLNK(mode)) {
 		h->type = SYMLINK;
 		readlink(path, h->link, (sizeof h->link)-1);
-	} else if(S_ISCHR(mode) || S_ISBLK(mode)) {
-		h->type = S_ISCHR(mode) ? CHARDEV : BLOCKDEV;
-		putoctal(h->major, (unsigned)major(st.st_dev), sizeof h->major);
-		putoctal(h->minor, (unsigned)minor(st.st_dev), sizeof h->minor);
 	} else if(S_ISFIFO(mode)) {
 		h->type = FIFO;
 	}
_AT_@ -221,7 +224,7 @@ unarchive(char *fname, int l, char b[Blksiz])
 {
 	char lname[101];
 	FILE *f = NULL;
-	unsigned long  mode, major, minor, type;
+	unsigned long  mode;
 	Header *h = (void*)b;
 
 	unlink(fname);
_AT_@ -244,15 +247,8 @@ unarchive(char *fname, int l, char b[Blksiz])
 		break;
 	case CHARDEV:
 	case BLOCKDEV:
-#ifdef makedev
-		mode = strtoul(h->mode, 0, 8);
-		major = strtoul(h->major, 0, 8);
-		minor = strtoul(h->mode, 0, 8);
-		type = (h->type == CHARDEV) ? S_IFCHR : S_IFBLK;
-		if(mknod(fname, type | mode, makedev(major, minor)))
-			perror(fname);
-#endif
-		break;
+		weprintf("ignoring character or block device\n");
+		goto out;
 	case FIFO:
 		mode = strtoul(h->mode, 0, 8);
 		if(mknod(fname, S_IFIFO | mode, 0))
_AT_@ -265,6 +261,7 @@ unarchive(char *fname, int l, char b[Blksiz])
 	                                 strtoul(h->gid, 0, 8)))
 		perror(fname);
 
+out:
 	for(; l > 0; l -= Blksiz) {
 		fread(b, Blksiz, 1, tarfile);
 		if(f)
-- 
1.8.5.3
--MGYHOYXEY6WxJCY8--
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Thu Jan 30 2014 - 16:48:03 CET