freebsd-ports/archivers/zip/files/patch-negfseek
Andrey A. Chernov 6a41ea05ce Prevent negative fseek for old FreeBSD versions
PR:		33170
Submitted by:	"Vadim Mikhailov" <mvp@braz.ru> (partially)
2002-05-31 10:12:21 +00:00

59 lines
1.3 KiB
Text

--- zipfile.c.orig Sun Nov 7 13:30:11 1999
+++ zipfile.c Fri May 31 13:58:36 2002
@@ -14,6 +14,10 @@
#include "zip.h"
#include "revision.h"
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#endif
+
#ifdef VMS
# include <rms.h>
# include <starlet.h>
@@ -628,6 +632,18 @@
#endif /* !UTIL */
+#ifdef __FreeBSD__
+#if __FreeBSD_version < 500028
+local off_t fsize(FILE *f) {
+ struct stat s;
+
+ if (f == NULL) return 0;
+ if (fstat(fileno(f), &s) < 0) return 0;
+ return s.st_size;
+}
+#endif
+#endif
+
/*
* scanzipf_reg starts searching for the End Signature at the end of the file
* The End Signature points to the Central Directory Signature which points
@@ -667,7 +683,13 @@
t[1] = '\0';
t[2] = '\0';
t[3] = '\0';
- if (fseek(f, -4096L, SEEK_END) == 0) {
+ if (
+#ifdef __FreeBSD__
+#if __FreeBSD_version < 500028
+ fsize(f) >= 4096L &&
+#endif
+#endif
+ fseek(f, -4096L, SEEK_END) == 0) {
zipbeg = (ulg) (ftell(f) + 4096L);
while (!found && zipbeg >= 4096) {
zipbeg -= 4096L;
@@ -678,6 +700,11 @@
* XXX error check ??
*/
fread(buf, 1, 4096, f);
+#ifdef __FreeBSD__
+#if __FreeBSD_version < 500028
+ if (ftell(f) >= 8192L)
+#endif
+#endif
fseek(f, -8192L, SEEK_CUR);
t = &buf[4095];
/*