std::basic_filebuf<>: sync() after close() calls __rw_fseek() on closed file
----------------------------------------------------------------------------

                 Key: STDCXX-969
                 URL: https://issues.apache.org/jira/browse/STDCXX-969
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 27. Input/Output
    Affects Versions: 4.2.1, 4.2.0, 4.1.4, 4.1.3, 4.1.2
         Environment: All
            Reporter: Farid Zaripov
             Fix For: 4.2.2


{code:title=test.cpp}
#include <fstream>

int main (int argc, char* argv[])
{
    std::ifstream fs (argv [0], std::ios::binary);
    char c;
    fs.get (c);
    fs.close ();
    fs.sync ();

    return 0;
}
{code}

In the test above the fs.sync() calls __rw_fseek(0, ...), that leads to lseek 
(-1, ...).

The proposed patch:
{code:title=fstream.cc.diff}
Index: include/fstream.cc
===================================================================
--- include/fstream.cc  (revision 667432)
+++ include/fstream.cc  (working copy)
@@ -106,6 +106,8 @@
             _C_file    = 0;
             _C_cur_pos = _C_beg_pos = pos_type (off_type (-1));
 
+            this->setg(0, 0, 0);
+            this->setp(0, 0);
         }
 
         // rethrow the caught exception
@@ -119,6 +121,9 @@
         // zero out the file pointer except when detaching fd
         _C_file    = 0;
         _C_cur_pos = _C_beg_pos = pos_type (off_type (-1));
+
+        this->setg(0, 0, 0);
+        this->setp(0, 0);
     }
 
     return __retval;
{code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to