Changeset: a03593478ec0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a03593478ec0 Modified Files: common/stream/stream.c Branch: Jan2014 Log Message:
More checking. diffs (truncated from 656 to 300 lines): diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -194,7 +194,7 @@ mnstr_init(void) ssize_t mnstr_read(stream *s, void *buf, size_t elmsize, size_t cnt) { - if (s == NULL) + if (s == NULL || buf == NULL) return -1; #ifdef STREAM_DEBUG printf("read %s " SZFMT " " SZFMT "\n", s->name ? s->name : "<unnamed>", elmsize, cnt); @@ -213,7 +213,7 @@ mnstr_readline(stream *s, void *buf, siz { char *b = buf, *start = buf; - if (s == NULL) + if (s == NULL || buf == NULL) return -1; #ifdef STREAM_DEBUG printf("readline %s " SZFMT "\n", s->name ? s->name : "<unnamed>", maxcnt); @@ -358,7 +358,7 @@ mnstr_fsync(stream *s) int mnstr_fgetpos(stream *s, lng *p) { - if (s == NULL) + if (s == NULL || p == NULL) return -1; #ifdef STREAM_DEBUG printf("fgetpos %s\n", s->name ? s->name : "<unnamed>"); @@ -499,24 +499,25 @@ destroy(stream *s) { if (s->buf) free(s->buf); - free(s->name); + if (s->name) + free(s->name); free(s); } static char * error(stream *s) { - char buf[BUFSIZ]; + char buf[128]; switch (s->errnr) { case MNSTR_OPEN_ERROR: - snprintf(buf, BUFSIZ, "error could not open file %s\n", s->name); + snprintf(buf, sizeof(buf), "error could not open file %s\n", s->name); return strdup(buf); case MNSTR_READ_ERROR: - snprintf(buf, BUFSIZ, "error reading file %s\n", s->name); + snprintf(buf, sizeof(buf), "error reading file %s\n", s->name); return strdup(buf); case MNSTR_WRITE_ERROR: - snprintf(buf, BUFSIZ, "error writing file %s\n", s->name); + snprintf(buf, sizeof(buf), "error writing file %s\n", s->name); return strdup(buf); } return strdup("Unknown error"); @@ -568,6 +569,11 @@ file_read(stream *s, void *buf, size_t e FILE *fp = (FILE *) s->stream_data.p; size_t rc = 0; + if (fp == NULL) { + s->errnr = MNSTR_READ_ERROR; + return -1; + } + if (!feof(fp)) { if (ferror(fp) || ((rc = fread(buf, elmsize, cnt, fp)) == 0 && @@ -582,10 +588,17 @@ file_read(stream *s, void *buf, size_t e static ssize_t file_write(stream *s, const void *buf, size_t elmsize, size_t cnt) { + FILE *fp = (FILE *) s->stream_data.p; + + if (fp == NULL) { + s->errnr = MNSTR_WRITE_ERROR; + return -1; + } + if (elmsize && cnt) { - size_t rc = fwrite(buf, elmsize, cnt, (FILE *) s->stream_data.p); - - if (ferror((FILE *) s->stream_data.p)) { + size_t rc = fwrite(buf, elmsize, cnt, fp); + + if (ferror(fp)) { s->errnr = MNSTR_WRITE_ERROR; return -1; } @@ -616,7 +629,8 @@ file_clrerr(stream *s) { FILE *fp = (FILE *) s->stream_data.p; - clearerr(fp); + if (fp) + clearerr(fp); } static int @@ -624,7 +638,7 @@ file_flush(stream *s) { FILE *fp = (FILE *) s->stream_data.p; - if (s->access == ST_WRITE && fflush(fp) < 0) { + if (fp == NULL || (s->access == ST_WRITE && fflush(fp) < 0)) { s->errnr = MNSTR_WRITE_ERROR; return -1; } @@ -637,19 +651,20 @@ file_fsync(stream *s) FILE *fp = (FILE *) s->stream_data.p; - if (s->access == ST_WRITE + if (fp == NULL || + (s->access == ST_WRITE #ifdef NATIVE_WIN32 - && _commit(_fileno(fp)) < 0 + && _commit(_fileno(fp)) < 0 #else #ifdef HAVE_FDATASYNC - && fdatasync(fileno(fp)) < 0 + && fdatasync(fileno(fp)) < 0 #else #ifdef HAVE_FSYNC - && fsync(fileno(fp)) < 0 + && fsync(fileno(fp)) < 0 #endif #endif #endif - ) { + )) { s->errnr = MNSTR_WRITE_ERROR; return -1; } @@ -661,6 +676,8 @@ file_fgetpos(stream *s, lng *p) { FILE *fp = (FILE *) s->stream_data.p; + if (fp == NULL || p == NULL) + return -1; #if defined(NATIVE_WIN32) && _MSC_VER >= 1400 /* Visual Studio 2005 */ *p = (lng) _ftelli64(fp); /* returns __int64 */ #else @@ -679,6 +696,8 @@ file_fsetpos(stream *s, lng p) int res = 0; FILE *fp = (FILE *) s->stream_data.p; + if (fp == NULL) + return -1; #if defined(NATIVE_WIN32) && _MSC_VER >= 1400 /* Visual Studio 2005 */ res = _fseeki64(fp, (__int64) p, SEEK_SET); #else @@ -708,7 +727,7 @@ open_stream(const char *filename, const stream *s; FILE *fp; lng pos; - char buf[4]; + char buf[UTF8BOMLENGTH + 1]; if ((s = create_stream(filename)) == NULL) return NULL; @@ -730,7 +749,7 @@ open_stream(const char *filename, const * mark the stream as being a UTF-8 stream */ if (flags[0] == 'r' && file_fgetpos(s, &pos) == 0) { - if (file_read(s, buf, 1, UTF8BOMLENGTH) == 3 && + if (file_read(s, buf, 1, UTF8BOMLENGTH) == UTF8BOMLENGTH && strncmp(buf, UTF8BOM, UTF8BOMLENGTH) == 0) s->isutf8 = 1; else @@ -750,6 +769,11 @@ stream_gzread(stream *s, void *buf, size int size = (int) (elmsize * cnt); int err = 0; + if (fp == NULL) { + s->errnr = MNSTR_READ_ERROR; + return -1; + } + if (!gzeof(fp)) { size = gzread(fp, buf, size); if (gzerror(fp, &err) != NULL && err < 0) { @@ -768,6 +792,11 @@ stream_gzwrite(stream *s, const void *bu int size = (int) (elmsize * cnt); int err = 0; + if (fp == NULL) { + s->errnr = MNSTR_WRITE_ERROR; + return -1; + } + if (size) { size = gzwrite(fp, buf, size); if (gzerror(fp, &err) != NULL && err < 0) { @@ -790,6 +819,8 @@ stream_gzclose(stream *s) static int stream_gzflush(stream *s) { + if (s->stream_data.p == NULL) + return -1; if (s->access == ST_WRITE && gzflush((gzFile) s->stream_data.p, Z_SYNC_FLUSH) != Z_OK) return -1; @@ -937,32 +968,32 @@ stream_bzread(stream *s, void *buf, size void *punused; int nunused; char unused[BZ_MAX_UNUSED]; - - if (s->stream_data.p) { - size = BZ2_bzRead(&err, ((struct bz *) s->stream_data.p)->b, buf, size); - if (err == BZ_STREAM_END) { - /* end of stream, but not necessarily end of - * file: get unused bits, close stream, and - * open again with the saved unused bits */ - BZ2_bzReadGetUnused(&err, ((struct bz *) s->stream_data.p)->b, &punused, &nunused); - if (err == BZ_OK && - (nunused > 0 || - !feof(((struct bz *) s->stream_data.p)->f))) { - if (nunused > 0) - memcpy(unused, punused, nunused); - BZ2_bzReadClose(&err, ((struct bz *) s->stream_data.p)->b); - ((struct bz *) s->stream_data.p)->b = BZ2_bzReadOpen(&err, ((struct bz *) s->stream_data.p)->f, 0, 0, unused, nunused); - } else { - stream_bzclose(s); - } + struct bz *bzp = s->stream_data.p; + + if (bzp == NULL) { + s->errnr = MNSTR_READ_ERROR; + return -1; + } + size = BZ2_bzRead(&err, bzp->b, buf, size); + if (err == BZ_STREAM_END) { + /* end of stream, but not necessarily end of file: get + * unused bits, close stream, and open again with the + * saved unused bits */ + BZ2_bzReadGetUnused(&err, bzp->b, &punused, &nunused); + if (err == BZ_OK && (nunused > 0 || !feof(bzp->f))) { + if (nunused > 0) + memcpy(unused, punused, nunused); + BZ2_bzReadClose(&err, bzp->b); + bzp->b = BZ2_bzReadOpen(&err, bzp->f, 0, 0, unused, nunused); + } else { + stream_bzclose(s); } - if (err != BZ_OK) { - s->errnr = MNSTR_READ_ERROR; - return -1; - } - return size / elmsize; } - return 0; + if (err != BZ_OK) { + s->errnr = MNSTR_READ_ERROR; + return -1; + } + return size / elmsize; } static ssize_t @@ -970,9 +1001,14 @@ stream_bzwrite(stream *s, const void *bu { int size = (int) (elmsize * cnt); int err; - + struct bz *bzp = s->stream_data.p; + + if (bzp == NULL) { + s->errnr = MNSTR_WRITE_ERROR; + return -1; + } if (size) { - BZ2_bzWrite(&err, ((struct bz *) s->stream_data.p)->b, (void *) buf, size); + BZ2_bzWrite(&err, bzp->b, (void *) buf, size); if (err != BZ_OK) { s->errnr = MNSTR_WRITE_ERROR; return -1; @@ -1128,28 +1164,19 @@ open_rstream(const char *filename) #endif ext = get_extention(filename); - if (strcmp(ext, "gz") == 0) { -#ifdef HAVE_LIBZ + if (strcmp(ext, "gz") == 0) return open_gzrstream(filename); -#else - return NULL; /* not supported */ -#endif - } - if (strcmp(ext, "bz2") == 0) { -#ifdef HAVE_LIBBZ2 + if (strcmp(ext, "bz2") == 0) return open_bzrstream(filename); -#else - return NULL; /* not supported */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list