Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
2002-02-25  Jakub Jelinek  <jakub@redhat.com>

	* libio/iofopen.c (__fopen_maybe_mmap): Set the initial
	position to fp->_offset if it is set.
	* stdio-common/Makefile (tests): Add tst-fdopen.
	* stdio-common/tst-fdopen.c: New test.

2002-02-25  Jakub Jelinek  <jakub@redhat.com>

	* libio/fileops.c (_IO_file_xsgetn_mmap): Handle reading from backup.
	* stdio-common/tst-ungetc.c (main): Add another test.
  • Loading branch information
Ulrich Drepper committed Feb 26, 2002
1 parent 77fe0b9 commit b39d571
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 13 deletions.
12 changes: 12 additions & 0 deletions ChangeLog
@@ -1,3 +1,15 @@
2002-02-25 Jakub Jelinek <jakub@redhat.com>

* libio/iofopen.c (__fopen_maybe_mmap): Set the initial
position to fp->_offset if it is set.
* stdio-common/Makefile (tests): Add tst-fdopen.
* stdio-common/tst-fdopen.c: New test.

2002-02-25 Jakub Jelinek <jakub@redhat.com>

* libio/fileops.c (_IO_file_xsgetn_mmap): Handle reading from backup.
* stdio-common/tst-ungetc.c (main): Add another test.

2002-02-25 Ulrich Drepper <drepper@redhat.com>

* assert/assert-perr.c: Use INTUSE to reference functions and variables
Expand Down
42 changes: 34 additions & 8 deletions libio/fileops.c
Expand Up @@ -1197,28 +1197,54 @@ _IO_file_xsgetn_mmap (fp, data, n)
{
register _IO_size_t have;
char *read_ptr = fp->_IO_read_ptr;
register char *s = (char *) data;

have = fp->_IO_read_end - fp->_IO_read_ptr;

if (have < n)
{
/* Maybe the read buffer is not yet fully set up. */
fp->_IO_read_ptr = fp->_IO_read_end;
if (fp->_IO_read_end < fp->_IO_buf_end
&& _IO_file_underflow_mmap (fp) != EOF)
have = fp->_IO_read_end - read_ptr;
if (__builtin_expect (_IO_in_backup (fp), 0))
{
#ifdef _LIBC
s = __mempcpy (s, read_ptr, have);
#else
memcpy (s, read_ptr, have);
s += have;
#endif
n -= have;
_IO_switch_to_main_get_area (fp);
read_ptr = fp->_IO_read_ptr;
have = fp->_IO_read_end - fp->_IO_read_ptr;
}

if (have < n)
{
/* Maybe the read buffer is not yet fully set up. */
fp->_IO_read_ptr = fp->_IO_read_end;
if (fp->_IO_read_end < fp->_IO_buf_end
&& _IO_file_underflow_mmap (fp) != EOF)
have = fp->_IO_read_end - read_ptr;
}
}

if (have == 0)
fp->_flags |= _IO_EOF_SEEN;
{
if (s == (char *) data)
fp->_flags |= _IO_EOF_SEEN;
}
else
{
have = MIN (have, n);
memcpy (data, read_ptr, have);
#ifdef _LIBC
s = __mempcpy (s, read_ptr, have);
#else
memcpy (s, read_ptr, have);
s += have;
#endif
fp->_IO_read_ptr = read_ptr + have;
}

return have;
return s - (char *) data;
}

struct _IO_jump_t _IO_file_jumps =
Expand Down
12 changes: 8 additions & 4 deletions libio/iofopen.c
Expand Up @@ -53,7 +53,9 @@ __fopen_maybe_mmap (fp)
if (_IO_SYSSTAT (fp, &st) == 0
&& S_ISREG (st.st_mode) && st.st_size != 0
/* Limit the file size to 1MB for 32-bit machines. */
&& (sizeof (ptrdiff_t) > 4 || st.st_size < 1*1024*1024))
&& (sizeof (ptrdiff_t) > 4 || st.st_size < 1*1024*1024)
/* Sanity check. */
&& (fp->_offset == _IO_pos_BAD || fp->_offset <= st.st_size))
{
/* Try to map the file. */
void *p;
Expand All @@ -72,15 +74,17 @@ __fopen_maybe_mmap (fp)
underflow functions which never tries to read
anything from the file. */
INTUSE(_IO_setb) (fp, p, (char *) p + st.st_size, 0);
_IO_setg (fp, p, p, p);

if (fp->_offset == _IO_pos_BAD)
fp->_offset = 0;

_IO_setg (fp, p, p + fp->_offset, p + fp->_offset);

if (fp->_mode <= 0)
_IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps_mmap;
else
_IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps_mmap;
fp->_wide_data->_wide_vtable = &_IO_wfile_jumps_mmap;

fp->_offset = 0;
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion stdio-common/Makefile
Expand Up @@ -56,7 +56,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 \
scanf11 scanf12 tst-tmpnam tst-cookie tst-obprintf tst-sscanf \
tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \
tst-perror tst-sprintf tst-rndseek
tst-perror tst-sprintf tst-rndseek tst-fdopen

test-srcs = tst-unbputc tst-printf

Expand Down
49 changes: 49 additions & 0 deletions stdio-common/tst-fdopen.c
@@ -0,0 +1,49 @@
/* Test for fdopen bugs. */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define assert(x) \
if (!(x)) \
{ \
fputs ("test failed: " #x "\n", stderr); \
retval = 1; \
goto the_end; \
}

char buffer[256];

int
main (int argc, char *argv[])
{
char *name;
FILE *fp = NULL;
int retval = 0;
int c, fd;

name = tmpnam (NULL);
fp = fopen (name, "w");
assert (fp != NULL)
fputs ("foobar and baz", fp);
fclose (fp);
fp = NULL;

fd = open (name, O_RDONLY);
assert (fd != -1);
assert (lseek (fd, 5, SEEK_SET) == 5);
/* The file position indicator associated with the new stream is set to
the position indicated by the file offset associated with the file
descriptor. */
fp = fdopen (fd, "r");
assert (fp != NULL);
assert (getc (fp) == 'r');
assert (getc (fp) == ' ');

the_end:
if (fp != NULL)
fclose (fp);
unlink (name);

return retval;
}
12 changes: 12 additions & 0 deletions stdio-common/tst-ungetc.c
Expand Up @@ -18,6 +18,7 @@ main (int argc, char *argv[])
FILE *fp = NULL;
int retval = 0;
int c;
char buffer[64];

name = tmpnam (NULL);
fp = fopen (name, "w");
Expand All @@ -40,6 +41,17 @@ main (int argc, char *argv[])
assert (feof (fp) == 0);
assert (getc (fp) == c);
assert (getc (fp) == EOF);
fclose (fp);
fp = NULL;

fp = fopen (name, "r");
assert (fp != NULL);
assert (getc (fp) == 'b');
assert (getc (fp) == 'l');
assert (ungetc ('b', fp) == 'b');
assert (fread (buffer, 1, 64, fp) == 2);
assert (buffer[0] == 'b');
assert (buffer[1] == 'a');

the_end:
if (fp != NULL)
Expand Down

0 comments on commit b39d571

Please sign in to comment.