From 09ad57ec8fa24e40b2364d1d67218c65acedaf4d Mon Sep 17 00:00:00 2001
From: Janne Blomqvist <jb@gcc.gnu.org>
Date: Sat, 11 Jun 2011 13:52:18 +0300
Subject: [PATCH] Return error when trying to seek a non-seekable buffered file

From-SVN: r174947
---
 libgfortran/ChangeLog | 5 +++++
 libgfortran/io/unix.c | 7 ++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index d54878b189fb..9d5337513e2d 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2011-06-11  Janne Blomqvist  <jb@gcc.gnu.org>
+
+	* io/unix.c (buf_seek): Return error if file is not seekable.
+	(buf_tell): Call buf_seek.
+
 2011-06-11  Janne Blomqvist  <jb@gcc.gnu.org>
 
 	* io/unix.c (fd_to_stream): Figure out if a fd is seekable by
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index e3ae60722903..25cb559db014 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -560,6 +560,11 @@ buf_write (unix_stream * s, const void * buf, ssize_t nbyte)
 static gfc_offset
 buf_seek (unix_stream * s, gfc_offset offset, int whence)
 {
+  if (s->file_length == -1)
+    {
+      errno = ESPIPE;
+      return -1;
+    }
   switch (whence)
     {
     case SEEK_SET:
@@ -585,7 +590,7 @@ buf_seek (unix_stream * s, gfc_offset offset, int whence)
 static gfc_offset
 buf_tell (unix_stream * s)
 {
-  return s->logical_offset;
+  return buf_seek (s, 0, SEEK_CUR);
 }
 
 static int
-- 
GitLab