From 1c3e1c03eed0fd378b0b8f7933a3f898a1c25189 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Wed, 6 Oct 2010 23:41:20 +0000 Subject: [PATCH] * sim/cris/c/seek3.c, sim/cris/c/seek4.c: New tests. --- sim/testsuite/ChangeLog | 4 +++ sim/testsuite/sim/cris/c/seek3.c | 49 ++++++++++++++++++++++++++++++++ sim/testsuite/sim/cris/c/seek4.c | 44 ++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 sim/testsuite/sim/cris/c/seek3.c create mode 100644 sim/testsuite/sim/cris/c/seek4.c diff --git a/sim/testsuite/ChangeLog b/sim/testsuite/ChangeLog index 36e3addd553..9a94cc5c2a5 100644 --- a/sim/testsuite/ChangeLog +++ b/sim/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-10-07 Hans-Peter Nilsson + + * sim/cris/c/seek3.c, sim/cris/c/seek4.c: New tests. + 2010-08-24 Hans-Peter Nilsson * sim/cris/asm/nonvcv32.ms: Neutralize changed &&-in-macro gas syntax. diff --git a/sim/testsuite/sim/cris/c/seek3.c b/sim/testsuite/sim/cris/c/seek3.c new file mode 100644 index 00000000000..5e7b5784d0e --- /dev/null +++ b/sim/testsuite/sim/cris/c/seek3.c @@ -0,0 +1,49 @@ +/* Check for a sim bug, whereby the position was always unsigned + (truncation instead of sign-extension for 64-bit hosts). */ +#include +#include +#include +#include +#include +#include +#include + +int +main (void) +{ + FILE *f; + const char fname[] = "sk1test.dat"; + const char tsttxt[] + = "A random line of text, used to test correct read, write and seek.\n"; + char buf[sizeof tsttxt] = ""; + const char correct[] = "correct"; + char buf2[sizeof correct] = {0}; + int fd; + + f = fopen (fname, "wb"); + if (f == NULL + || fwrite (tsttxt, 1, strlen (tsttxt), f) != strlen (tsttxt) + || fclose (f) != 0) + { + printf ("fail\n"); + exit (1); + } + + /* We have to use file-descriptor calls instead of stream calls to + provoke the bug (for stream calls, the lseek call is canonicalized + to use SEEK_SET). */ + fd = open (fname, O_RDONLY); + if (fd < 0 + || read (fd, buf, strlen (tsttxt)) != strlen (tsttxt) + || strcmp (buf, tsttxt) != 0 + || lseek (fd, -30L, SEEK_CUR) != 36 + || read (fd, buf2, strlen (correct)) != strlen (correct) + || strcmp (buf2, correct) != 0) + { + printf ("fail\n"); + exit (1); + } + + printf ("pass\n"); + exit (0); +} diff --git a/sim/testsuite/sim/cris/c/seek4.c b/sim/testsuite/sim/cris/c/seek4.c new file mode 100644 index 00000000000..16f3bb0b0cd --- /dev/null +++ b/sim/testsuite/sim/cris/c/seek4.c @@ -0,0 +1,44 @@ +/* Check for a sim bug, whereby an invalid seek (to a negative offset) + did not return an error. */ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main (void) +{ + FILE *f; + const char fname[] = "sk1test.dat"; + const char tsttxt[] + = "A random line of text, used to test correct read, write and seek.\n"; + char buf[sizeof tsttxt] = ""; + int fd; + + f = fopen (fname, "wb"); + if (f == NULL + || fwrite (tsttxt, 1, strlen (tsttxt), f) != strlen (tsttxt) + || fclose (f) != 0) + { + printf ("fail\n"); + exit (1); + } + + fd = open (fname, O_RDONLY); + if (fd < 0 + || lseek (fd, -1L, SEEK_CUR) != -1 + || errno != EINVAL + || read (fd, buf, strlen (tsttxt)) != strlen (tsttxt) + || strcmp (buf, tsttxt) != 0) + { + printf ("fail\n"); + exit (1); + } + + printf ("pass\n"); + exit (0); +} -- 2.30.2