Don't crash after a buffered file failed to close.
[INTERPRETER] * BUG: Don't crash after a buffered file failed to close.
This commit is contained in:
parent
901b84a36c
commit
ad8ea52b64
2 changed files with 32 additions and 11 deletions
|
@ -87,20 +87,23 @@ static int stream_open(STREAM *stream, const char *path, int mode)
|
||||||
|
|
||||||
static int stream_close(STREAM *stream)
|
static int stream_close(STREAM *stream)
|
||||||
{
|
{
|
||||||
if (FD == NULL)
|
FILE *f = FD;
|
||||||
return FALSE;
|
|
||||||
|
if (!f)
|
||||||
if (fclose(FD) < 0)
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
FD = NULL;
|
FD = NULL;
|
||||||
return FALSE;
|
|
||||||
|
return fclose(f) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int stream_read(STREAM *stream, char *buffer, int len)
|
static int stream_read(STREAM *stream, char *buffer, int len)
|
||||||
{
|
{
|
||||||
int eff;
|
int eff;
|
||||||
|
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
eff = (int)fread(buffer, 1, len, FD);
|
eff = (int)fread(buffer, 1, len, FD);
|
||||||
if (eff < len)
|
if (eff < len)
|
||||||
|
@ -143,12 +146,18 @@ static int stream_read(STREAM *stream, char *buffer, int len)
|
||||||
|
|
||||||
static int stream_flush(STREAM *stream)
|
static int stream_flush(STREAM *stream)
|
||||||
{
|
{
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
return (fflush(FD) != 0);
|
return (fflush(FD) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int stream_write(STREAM *stream, char *buffer, int len)
|
static int stream_write(STREAM *stream, char *buffer, int len)
|
||||||
{
|
{
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
return fwrite(buffer, 1, len, FD);
|
return fwrite(buffer, 1, len, FD);
|
||||||
|
|
||||||
/*while (len > 0)
|
/*while (len > 0)
|
||||||
|
@ -175,12 +184,18 @@ static int stream_write(STREAM *stream, char *buffer, int len)
|
||||||
|
|
||||||
static int stream_seek(STREAM *stream, int64_t pos, int whence)
|
static int stream_seek(STREAM *stream, int64_t pos, int whence)
|
||||||
{
|
{
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
return (fseek(FD, (off_t)pos, whence) != 0);
|
return (fseek(FD, (off_t)pos, whence) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int stream_tell(STREAM *stream, int64_t *pos)
|
static int stream_tell(STREAM *stream, int64_t *pos)
|
||||||
{
|
{
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
*pos = (int64_t)ftell(FD);
|
*pos = (int64_t)ftell(FD);
|
||||||
return (*pos < 0);
|
return (*pos < 0);
|
||||||
}
|
}
|
||||||
|
@ -190,6 +205,9 @@ static int stream_eof(STREAM *stream)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
|
if (!FD)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
c = fgetc(FD);
|
c = fgetc(FD);
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -206,7 +224,7 @@ static int stream_lof(STREAM *stream, int64_t *len)
|
||||||
if (!stream->common.available_now)
|
if (!stream->common.available_now)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (fstat(fileno(FD), &info) < 0)
|
if (!FD || fstat(fileno(FD), &info) < 0)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
*len = info.st_size;
|
*len = info.st_size;
|
||||||
|
@ -216,7 +234,10 @@ static int stream_lof(STREAM *stream, int64_t *len)
|
||||||
|
|
||||||
static int stream_handle(STREAM *stream)
|
static int stream_handle(STREAM *stream)
|
||||||
{
|
{
|
||||||
return fileno(FD);
|
if (FD)
|
||||||
|
return fileno(FD);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,10 +52,10 @@ typedef
|
||||||
#define GB_STAT_GROUP 1
|
#define GB_STAT_GROUP 1
|
||||||
#define GB_STAT_OTHER 2
|
#define GB_STAT_OTHER 2
|
||||||
|
|
||||||
#define FILE_TEMP_PREFIX "/tmp/gambas.%d"
|
#define FILE_TEMP_PREFIX "/tmp/gambas.%d"
|
||||||
#define FILE_TEMP_DIR "/tmp/gambas.%d/%d"
|
#define FILE_TEMP_DIR FILE_TEMP_PREFIX "/%d"
|
||||||
#define FILE_TEMP_FILE "/tmp/gambas.%d/%d/%d.tmp"
|
#define FILE_TEMP_FILE FILE_TEMP_DIR "/%d.tmp"
|
||||||
#define FILE_TEMP_PATTERN "/tmp/gambas.%d/%d/%s.tmp"
|
#define FILE_TEMP_PATTERN FILE_TEMP_DIR "/%s.tmp"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue