stdio/freopen.c: fill __iotab table with stream pointer
- lets fclose()d and then freopen()ed streams be fclose()d again without error
This commit is contained in:
parent
09569d399f
commit
51d9144e9f
1 changed files with 17 additions and 6 deletions
|
@ -39,6 +39,22 @@ freopen(const char *name, const char *mode, FILE *stream)
|
||||||
(void) fflush(stream); /* ignore errors */
|
(void) fflush(stream); /* ignore errors */
|
||||||
(void) _close(fileno(stream));
|
(void) _close(fileno(stream));
|
||||||
|
|
||||||
|
/* Find the slot the stream had, if any. */
|
||||||
|
for(i = 0; i < FOPEN_MAX; i++)
|
||||||
|
if (stream == __iotab[i])
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* If none, it might've been fclose()d; find a new slot for it. */
|
||||||
|
if(i >= FOPEN_MAX) {
|
||||||
|
for (i = 0; __iotab[i] != 0 ; i++) {
|
||||||
|
if ( i >= FOPEN_MAX-1 )
|
||||||
|
return (FILE *)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If it was valid, it isn't any more until the freopen() succeeds. */
|
||||||
|
__iotab[i] = 0;
|
||||||
|
|
||||||
switch(*mode++) {
|
switch(*mode++) {
|
||||||
case 'r':
|
case 'r':
|
||||||
flags |= _IOREAD;
|
flags |= _IOREAD;
|
||||||
|
@ -95,15 +111,10 @@ freopen(const char *name, const char *mode, FILE *stream)
|
||||||
stream->_count = 0;
|
stream->_count = 0;
|
||||||
stream->_fd = fd;
|
stream->_fd = fd;
|
||||||
stream->_flags = flags;
|
stream->_flags = flags;
|
||||||
|
__iotab[i] = stream;
|
||||||
return stream;
|
return stream;
|
||||||
|
|
||||||
loser:
|
loser:
|
||||||
for( i = 0; i < FOPEN_MAX; i++) {
|
|
||||||
if (stream == __iotab[i]) {
|
|
||||||
__iotab[i] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (stream != stdin && stream != stdout && stream != stderr)
|
if (stream != stdin && stream != stdout && stream != stderr)
|
||||||
free((void *)stream);
|
free((void *)stream);
|
||||||
return (FILE *)NULL;
|
return (FILE *)NULL;
|
||||||
|
|
Loading…
Reference in a new issue