Boost logo

Boost Users :

From: EMalenfant_at_[hidden]
Date: 2006-04-27 15:38:39


Hi,
 
The following causes an assertion failure (in
iostreams::detail::optional::operator*()) when destroying the
filtering_stream:
 
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/code_converter.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <windows.h>

namespace io = boost::iostreams;

int main (void)
{

  io::wfiltering_stream<io::output> out;

  HANDLE h = CreateFileW(L"test.txt",

                        GENERIC_WRITE | GENERIC_READ,

                        FILE_SHARE_READ,

                        NULL,

                        OPEN_ALWAYS,

                        0,

                        NULL );

  out.push(

    io::code_converter<io::file_descriptor_sink>(

       io::file_descriptor_sink(h, true)

    )
  );

  out << L"Hello world!";

 

  return 0;

}

If I add "out.pop()" before returning, there is no assertion.
Looking deeper, it turns out that iostreams::chain's dtor calls close(); and
reset();, and both end up calling close() on the code_converter. And
code_converter is not "multi-closable". IOW, I get the same assertion
failure with:

HANDLE h = CreateFile(/*...*/);

io::code_converter<io::file_descriptor_sink> cvt(io::file_descriptor_sink(h,
true));

cvt.close();

cvt.close(); //<< Asserts here

To fix this, I made it possible to call code_converter::close() multiple
times by simply adding:

if (!(this->is_open())){
    return;
}

right at the beginning of code_converter::close().

 

Am I right in assuming that it should be possible to close() a Device or
Filter multiple times ?

Anyone has comments on this proposed fix?

 

-----------------------------
Éric
Quidquid latine dictum sit, altum viditur.

 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net