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

Reply via email to