[malware t-online de: Bug#324755: mc: tar archives greater than 2GB not supported]



Hi Pavel,
Michael, a Debian GNU/Linux user, reported this bug and suggested the
following patch for the same.
I soon would like to infor you and the `mc-devel` list about this.
Thank you in advance

Cheers

SteX

----- Forwarded message from Michael Mueller <malware t-online de> -----

Date: Tue, 23 Aug 2005 21:50:35 +0200
From: Michael Mueller <malware t-online de>
To: Stefano Melchior <stefano melchior openlabs it>, submit bugs debian org
Subject: Bug#324755: mc: tar archives greater than 2GB not supported
Reply-To: Michael Mueller <malware t-online de>, 324755 bugs debian org
Resent-From: Michael Mueller <malware t-online de>
Resent-To: debian-bugs-dist lists debian org
Resent-Cc: Stefano Melchior <stefano melchior openlabs it>
Resent-Date: Tue, 23 Aug 2005 20:03:10 UTC
Resent-Message-ID: <handler 324755 B 112482669119962 bugs debian org>
X-Debian-PR-Message: report 324755
X-Debian-PR-Package: mc
X-Debian-PR-Keywords: 
X-ID: TEOJF2ZOreDY-47VoI3b39kQg+akK-GT4Fbt0Cbg0aubvSIGkeH3rO
X-TOI-MSGID: dc04d4ea-64e3-4bab-bace-072c7e66b82e
X-Spam-Checker-Version: SpamAssassin 2.60-bugs.debian.org_2005_01_02 
	(1.212-2003-09-23-exp) on spohr.debian.org
X-Spam-Level: 
X-Spam-Status: No, hits=-8.0 required=4.0 tests=BAYES_00,HAS_PACKAGE 
	autolearn=no version=2.60-bugs.debian.org_2005_01_02
Resent-Sender: Debian BTS <debbugs bugs debian org>

Package: mc
Version: 4.6.0-4.6.1-pre4-2

Midnight Commander does handle tar archives bigger than the magic 2GB 
size incorrectly.

I appended a patch fixing the problem. Since it includes changes in the 
VFS of the Midnight Commander, changes made to other virtual filesystems 
are included too. Those however are not tested and mostly will not make 
them bypassing the limit.


With best regards
Michael M?ller

diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/cpio.c mc-4.6.1-pre4/vfs/cpio.c
--- mc-4.6.1-pre4.debian/vfs/cpio.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/cpio.c	2005-08-23 21:32:39.306219927 +0200
@@ -83,7 +83,7 @@
     struct vfs_s_inode *inode;
 };
 
-static int cpio_position;
+static off_t cpio_position;
 
 static int cpio_find_head(struct vfs_class *me, struct vfs_s_super *super);
 static int cpio_read_bin_head(struct vfs_class *me, struct vfs_s_super *super);
@@ -107,7 +107,7 @@
     return l;
 }
 
-static int cpio_skip_padding(struct vfs_s_super *super)
+static off_t cpio_skip_padding(struct vfs_s_super *super)
 {
     switch(super->u.arch.type) {
     case CPIO_BIN:
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/direntry.c mc-4.6.1-pre4/vfs/direntry.c
--- mc-4.6.1-pre4.debian/vfs/direntry.c	2004-11-29 19:44:49.000000000 +0100
+++ mc-4.6.1-pre4/vfs/direntry.c	2005-08-23 21:32:39.307219773 +0200
@@ -836,13 +836,13 @@
     return 0;
 }
 
-static int
+static off_t
 vfs_s_lseek (void *fh, off_t offset, int whence)
 {
     off_t size = FH->ino->st.st_size;
 
     if (FH->handle != -1){	/* If we have local file opened, we want to work with it */
-	int retval = lseek (FH->handle, offset, whence);
+	off_t retval = lseek (FH->handle, offset, whence);
 	if (retval == -1)
 	    FH->ino->super->me->verrno = errno;
 	return retval;
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/extfs.c mc-4.6.1-pre4/vfs/extfs.c
--- mc-4.6.1-pre4.debian/vfs/extfs.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/extfs.c	2005-08-23 21:32:39.309219464 +0200
@@ -1125,7 +1125,7 @@
     return 0;
 }
 
-static int extfs_lseek (void *data, off_t offset, int whence)
+static off_t extfs_lseek (void *data, off_t offset, int whence)
 {
     struct pseudofile *file = (struct pseudofile *) data;
 
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/local.c mc-4.6.1-pre4/vfs/local.c
--- mc-4.6.1-pre4.debian/vfs/local.c	2004-09-25 01:00:18.000000000 +0200
+++ mc-4.6.1-pre4/vfs/local.c	2005-08-23 21:32:39.310219310 +0200
@@ -197,7 +197,7 @@
     return chdir (path);
 }
 
-int
+off_t
 local_lseek (void *data, off_t offset, int whence)
 {
     int fd = * (int *) data;
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/local.h mc-4.6.1-pre4/vfs/local.h
--- mc-4.6.1-pre4.debian/vfs/local.h	2004-08-17 11:17:43.000000000 +0200
+++ mc-4.6.1-pre4/vfs/local.h	2005-08-23 21:32:39.318218076 +0200
@@ -11,7 +11,7 @@
 extern int local_read (void *data, char *buffer, int count);
 extern int local_fstat (void *data, struct stat *buf);
 extern int local_errno (struct vfs_class *me);
-extern int local_lseek (void *data, off_t offset, int whence);
+extern off_t local_lseek (void *data, off_t offset, int whence);
 #ifdef HAVE_MMAP
 extern caddr_t local_mmap (struct vfs_class *me, caddr_t addr, size_t len,
                            int prot, int flags, void *data, off_t offset);
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/mcfs.c mc-4.6.1-pre4/vfs/mcfs.c
--- mc-4.6.1-pre4.debian/vfs/mcfs.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/mcfs.c	2005-08-23 21:32:39.315218539 +0200
@@ -1037,7 +1037,7 @@
     return 0;
 }
 
-static int
+static off_t
 mcfs_lseek (void *data, off_t offset, int whence)
 {
     mcfs_handle *info = (mcfs_handle *) data;
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/smbfs.c mc-4.6.1-pre4/vfs/smbfs.c
--- mc-4.6.1-pre4.debian/vfs/smbfs.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/smbfs.c	2005-08-23 21:32:39.317218231 +0200
@@ -1585,7 +1585,7 @@
 
 #define smbfs_lstat smbfs_stat	/* no symlinks on smb filesystem? */
 
-static int
+static off_t
 smbfs_lseek (void *data, off_t offset, int whence)
 {
     smbfs_handle *info = (smbfs_handle *) data;
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/tar.c mc-4.6.1-pre4/vfs/tar.c
--- mc-4.6.1-pre4.debian/vfs/tar.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/tar.c	2005-08-23 21:32:39.311219156 +0200
@@ -194,7 +194,7 @@
 }
 
 /* As we open one archive at a time, it is safe to have this static */
-static int current_tar_position = 0;
+static off_t current_tar_position = 0;
 
 /* Returns fd of the open tar file */
 static int
@@ -457,7 +457,7 @@
 	struct stat st;
 	struct vfs_s_entry *entry;
 	struct vfs_s_inode *inode, *parent;
-	long data_position;
+	off_t data_position;
 	char *q;
 	int len;
 	char *current_file_name, *current_link_name;
@@ -642,8 +642,9 @@
     int fd = FH_SUPER->u.arch.fd;
     struct vfs_class *me = FH_SUPER->me;
 
-    if (mc_lseek (fd, begin + FH->pos, SEEK_SET) != 
-        begin + FH->pos) ERRNOR (EIO, -1);
+
+    off_t o = mc_lseek(fd, begin + FH->pos, SEEK_SET);
+    if ( o != begin + FH->pos) ERRNOR (EIO, -1);
 
     count = MIN(count, FH->ino->st.st_size - FH->pos);
 
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/undelfs.c mc-4.6.1-pre4/vfs/undelfs.c
--- mc-4.6.1-pre4.debian/vfs/undelfs.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/undelfs.c	2005-08-23 21:32:39.313218847 +0200
@@ -645,7 +645,7 @@
 }
 
 /* this has to stay here for now: vfs layer does not know how to emulate it */
-static int
+static off_t
 undelfs_lseek(void *vfs_info, off_t offset, int whence)
 {
     return -1;
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/vfs-impl.h mc-4.6.1-pre4/vfs/vfs-impl.h
--- mc-4.6.1-pre4.debian/vfs/vfs-impl.h	2004-09-02 15:57:59.000000000 +0200
+++ mc-4.6.1-pre4/vfs/vfs-impl.h	2005-08-23 21:32:39.318218076 +0200
@@ -53,7 +53,7 @@
     int (*rename) (struct vfs_class *me, const char *p1, const char *p2);
     int (*chdir) (struct vfs_class *me, const char *path);
     int (*ferrno) (struct vfs_class *me);
-    int (*lseek) (void *vfs_info, off_t offset, int whence);
+    off_t (*lseek) (void *vfs_info, off_t offset, int whence);
     int (*mknod) (struct vfs_class *me, const char *path, int mode, int dev);
 
     vfsid (*getid) (struct vfs_class *me, const char *path);
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/vfs.c mc-4.6.1-pre4/vfs/vfs.c
--- mc-4.6.1-pre4.debian/vfs/vfs.c	2005-05-27 16:19:19.000000000 +0200
+++ mc-4.6.1-pre4/vfs/vfs.c	2005-08-23 21:32:39.312219002 +0200
@@ -623,14 +623,14 @@
 off_t mc_lseek (int fd, off_t offset, int whence)
 {
     struct vfs_class *vfs;
-    int result;
+    off_t result;
 
     if (fd == -1)
 	return -1;
 
     vfs = vfs_op (fd);
     result = vfs->lseek ? (*vfs->lseek)(vfs_info (fd), offset, whence) : -1;
-    if (result == -1)
+    if (result == (off_t)-1)
         errno = vfs->lseek ? ferrno (vfs) : E_NOTSUPP;
     return result;
 }
diff -N -r -u -x config.log mc-4.6.1-pre4.debian/vfs/xdirentry.h mc-4.6.1-pre4/vfs/xdirentry.h
--- mc-4.6.1-pre4.debian/vfs/xdirentry.h	2004-10-06 20:04:15.000000000 +0200
+++ mc-4.6.1-pre4/vfs/xdirentry.h	2005-08-23 21:32:39.326216843 +0200
@@ -90,7 +90,7 @@
     char *linkname;		/* Symlink's contents */
     char *localname;		/* Filename of local file, if we have one */
     struct timeval timestamp;	/* Subclass specific */
-    long data_offset;		/* Subclass specific */
+    off_t data_offset;		/* Subclass specific */
 };
 
 /* Data associated with an open file */


----- End forwarded message -----

-- 
GPG key = D52DF829    --    SteX    --    <stefano melchior openlabs it>
Keyserver: http://keyserver.kjsl.com, User#324592, http://counter.li.org
http://www.openlabs.it/~stex          --            http://www.stex.name

Attachment: signature.asc
Description: Digital signature



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