summaryrefslogtreecommitdiff
path: root/ext/zip/lib/zip_fdopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/zip/lib/zip_fdopen.c')
-rw-r--r--ext/zip/lib/zip_fdopen.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/ext/zip/lib/zip_fdopen.c b/ext/zip/lib/zip_fdopen.c
index df70f27561..bda9aabac4 100644
--- a/ext/zip/lib/zip_fdopen.c
+++ b/ext/zip/lib/zip_fdopen.c
@@ -37,11 +37,24 @@
-ZIP_EXTERN(struct zip *)
-zip_fdopen(int fd_orig, int flags, int *zep)
+ZIP_EXTERN struct zip *
+zip_fdopen(int fd_orig, int _flags, int *zep)
{
int fd;
FILE *fp;
+ unsigned int flags;
+
+ if (_flags < 0) {
+ if (zep)
+ *zep = ZIP_ER_INVAL;
+ return NULL;
+ }
+ flags = (unsigned int)_flags;
+
+ if (flags & ZIP_TRUNCATE) {
+ *zep = ZIP_ER_INVAL;
+ return NULL;
+ }
/* We dup() here to avoid messing with the passed in fd.
We could not restore it to the original state in case of error. */
@@ -58,5 +71,5 @@ zip_fdopen(int fd_orig, int flags, int *zep)
}
close(fd_orig);
- return _zip_open(NULL, fp, flags, ZIP_AFL_RDONLY, zep);
+ return _zip_open(NULL, fp, flags, zep);
}