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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list