/* {{{ php_zip_ops_read */ static size_t php_zip_ops_read(php_stream *stream, char *buf, size_t count) { ssize_t n = 0; STREAM_DATA_FROM_STREAM(); if (self->za && self->zf) { n = zip_fread(self->zf, buf, count); if (n < 0) { #if LIBZIP_VERSION_MAJOR < 1 int ze, se; zip_file_error_get(self->zf, &ze, &se); stream->eof = 1; php_error_docref(NULL, E_WARNING, "Zip stream error: %s", zip_file_strerror(self->zf)); #else zip_error_t *err; err = zip_file_get_error(self->zf); stream->eof = 1; php_error_docref(NULL, E_WARNING, "Zip stream error: %s", zip_error_strerror(err)); zip_error_fini(err); #endif return 0; } /* cast count to signed value to avoid possibly negative n * being cast to unsigned value */ if (n == 0 || n < (ssize_t)count) { stream->eof = 1; } else { self->cursor += n; } } return (n < 1 ? 0 : (size_t)n); }
static int do_read(struct zip *z, const char *name, int flags, enum when when_ex, int ze_ex, int se_ex) { struct zip_file *zf; enum when when_got; int err, ze_got, se_got; char b[8192]; zip_int64_t n; char expected[80]; char got[80]; when_got = WHEN_NEVER; ze_got = se_got = 0; if ((zf=zip_fopen(z, name, flags)) == NULL) { when_got = WHEN_OPEN; zip_error_get(z, &ze_got, &se_got); } else { while ((n=zip_fread(zf, b, sizeof(b))) > 0) ; if (n < 0) { when_got = WHEN_READ; zip_file_error_get(zf, &ze_got, &se_got); } err = zip_fclose(zf); if (when_got == WHEN_NEVER && err != 0) { when_got = WHEN_CLOSE; ze_got = err; se_got = 0; } } if (when_got != when_ex || ze_got != ze_ex || se_got != se_ex) { zip_error_to_str(expected, sizeof(expected), ze_ex, se_ex); zip_error_to_str(got, sizeof(got), ze_got, se_got); printf("%s: %s: got %s error (%s), expected %s error (%s)\n", prg, name, when_name[when_got], got, when_name[when_ex], expected); return 1; } else if (verbose) printf("%s: %s: passed\n", prg, name); return 0; }
/* {{{ php_zip_ops_read */ static size_t php_zip_ops_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) { int n = 0; STREAM_DATA_FROM_STREAM(); if (self->za && self->zf) { n = (size_t)zip_fread(self->zf, buf, (int)count); if (n < 0) { int ze, se; zip_file_error_get(self->zf, &ze, &se); stream->eof = 1; php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zip stream error: %s", zip_file_strerror(self->zf)); return 0; } if (n == 0 || n < count) { stream->eof = 1; } else { self->cursor += n; } } return n<1 ? 0 : n; }
/* {{{ php_zip_ops_read */ static size_t php_zip_ops_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) { ssize_t n = 0; STREAM_DATA_FROM_STREAM(); if (self->za && self->zf) { n = zip_fread(self->zf, buf, count); if (n < 0) { int ze, se; zip_file_error_get(self->zf, &ze, &se); stream->eof = 1; php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zip stream error: %s", zip_file_strerror(self->zf)); return 0; } /* cast count to signed value to avoid possibly negative n * being cast to unsigned value */ if (n == 0 || n < (ssize_t)count) { stream->eof = 1; } else { self->cursor += n; } } return (n < 1 ? 0 : (size_t)n); }
static jstatus_t __stdcall read( struct judgefs *fs, struct judgefs_file *file, char *buffer, uint32_t size, /* out */ uint32_t *actual_size) { struct zipfs *zipfs = (struct zipfs *)fs; struct zip_file *zip_file = (struct zip_file *)file; zip_int64_t result; int zep; EnterCriticalSection(&zipfs->zip_cs); result = zip_fread(zip_file, buffer, size); if (result >= 0) { LeaveCriticalSection(&zipfs->zip_cs); *actual_size = (uint32_t)result; return JSTATUS_SUCCESS; } else { zip_file_error_get(zip_file, &zep, NULL); LeaveCriticalSection(&zipfs->zip_cs); return zep_to_jstatus(zep); } }
static ssize_t read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd) { struct read_zip *z; char b[8192], *buf; int i, n; z = (struct read_zip *)state; buf = (char *)data; switch (cmd) { case ZIP_SOURCE_OPEN: for (n=0; n<z->off; n+= i) { i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); if ((i=zip_fread(z->zf, b, i)) < 0) { zip_fclose(z->zf); z->zf = NULL; return -1; } } return 0; case ZIP_SOURCE_READ: if (z->len != -1) n = len > z->len ? z->len : len; else n = len; if ((i=zip_fread(z->zf, buf, n)) < 0) return -1; if (z->len != -1) z->len -= i; return i; case ZIP_SOURCE_CLOSE: return 0; case ZIP_SOURCE_STAT: if (len < sizeof(z->st)) return -1; len = sizeof(z->st); memcpy(data, &z->st, len); return len; case ZIP_SOURCE_ERROR: { int *e; if (len < sizeof(int)*2) return -1; e = (int *)data; zip_file_error_get(z->zf, e, e+1); } return sizeof(int)*2; case ZIP_SOURCE_FREE: zip_fclose(z->zf); free(z); return 0; default: ; } return -1; }