[RFC] basic_file_stdio.cc changes for 9425 and 9439

Paolo Carlini pcarlini@unitus.it
Mon Feb 3 21:27:00 GMT 2003


Hi everyone...

Yes, I'm trying to fix both those reports at the same time ;) ...

Seriously, I think I have nailed down the underlying problem,
and, if you all agree with my analysis, the final patch is really
pretty close...

In a nutshell, I propose changing basic_file_stdio.cc in this way:

===================================
--- basic_file_stdio.cc.orig    2003-02-03 22:06:52.000000000 +0100
+++ basic_file_stdio.cc 2003-02-03 22:08:52.000000000 +0100
@@ -203,15 +203,19 @@
   __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way,
                              ios_base::openmode /*__mode*/)
   {
-    fseek(_M_cfile, __off, __way);
-    return ftell(_M_cfile);
+    if (!fseek(_M_cfile, __off, __way))
+      return ftell(_M_cfile);
+    else
+      return -1L;
   }

   streamoff
   __basic_file<char>::seekpos(streamoff __pos, ios_base::openmode 
/*__mode*/)
   {
-    fseek(_M_cfile, __pos, ios_base::beg);
-    return ftell(_M_cfile);
+    if (!fseek(_M_cfile, __pos, ios_base::beg))
+      return ftell(_M_cfile);
+    else
+      return -1L;
   }
===================================

This would allow returning -1L not only in case of failure of ftell,
but also in the _interesting_ case of failure of fseek, which, I
briefly recall you all, does _not_ lead by itself to the failure
of a next ftell!

If we agree about this, then it's easy to implement strict tests on the
return value of seekoff (which calls __basic_file<char>::seekoff)
inside pbackfail (and, if needed, elsewhere for it and seekpos) thus
fixing rather easily both 9425 and 9439.

What do you think?

Thanks,
Paolo.



More information about the Libstdc++ mailing list