From 0fcb8655b042e4e2ffad208201186aa8865ffba1 Mon Sep 17 00:00:00 2001 From: Gerd von Egidy Date: Wed, 10 Mar 2010 18:41:55 +0100 Subject: [PATCH] prevent working on unlinked files --- src/tmpfstream.hpp | 6 +++++- src/tmpfstream_impl.hpp | 14 +++++++++++--- test/test_tmpfstream.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/tmpfstream.hpp b/src/tmpfstream.hpp index 024b0e5..17f9736 100644 --- a/src/tmpfstream.hpp +++ b/src/tmpfstream.hpp @@ -39,6 +39,7 @@ class tmpfstreamTempl : public bio::stream { private: std::string filename; + bool unlinked; public: tmpfstreamTempl() @@ -64,7 +65,10 @@ public: bool unlink(); - bool move(const std::string& targetpath, bool overwrite); + bool is_unlinked() + { return unlinked; } + + bool move(const std::string& targetpath, bool overwrite=false); }; typedef tmpfstreamTempl tmpofstream; diff --git a/src/tmpfstream_impl.hpp b/src/tmpfstream_impl.hpp index be4dceb..f00bb3f 100644 --- a/src/tmpfstream_impl.hpp +++ b/src/tmpfstream_impl.hpp @@ -71,7 +71,7 @@ bool tmpfstreamTempl::open(const std::string& tmpnametemplate, template< typename Device, typename Tr, typename Alloc > bool tmpfstreamTempl::set_file_mode(int mode) { - if (!get_tmp_filename().empty()) + if (!get_tmp_filename().empty() && !is_unlinked()) return I2n::chmod(get_tmp_filename(),mode); else return false; @@ -81,7 +81,15 @@ template< typename Device, typename Tr, typename Alloc > bool tmpfstreamTempl::unlink() { if (!get_tmp_filename().empty()) - return I2n::unlink(get_tmp_filename()); + { + if (I2n::unlink(get_tmp_filename())) + { + unlinked=true; + return true; + } + else + return false; + } else return false; } @@ -90,7 +98,7 @@ template< typename Device, typename Tr, typename Alloc > bool tmpfstreamTempl::move(const std::string& targetpath, bool overwrite) { - if (get_tmp_filename().empty()) + if (get_tmp_filename().empty() || is_unlinked()) return false; if (overwrite) diff --git a/test/test_tmpfstream.cpp b/test/test_tmpfstream.cpp index 5180401..1d61719 100644 --- a/test/test_tmpfstream.cpp +++ b/test/test_tmpfstream.cpp @@ -194,6 +194,31 @@ BOOST_AUTO_TEST_CASE(TmpofstreamMoveOverwrite) unlink(".foobar"); } +BOOST_AUTO_TEST_CASE(TmpofstreamMoveAfterUnlink) +{ + // just to be sure + unlink(".foobar"); + + tmpofstream tmpf("./tmp.XXXXXX"); + + BOOST_CHECK_EQUAL( true, tmpf.is_open() ); + + Stat stat(tmpf.get_tmp_filename()); + BOOST_CHECK_EQUAL( true, (bool)stat ); + BOOST_CHECK_EQUAL( true, stat.is_regular_file() ); + + tmpf << "hello world" << endl; + tmpf.flush(); + + BOOST_CHECK_EQUAL( true, tmpf.unlink() ); + + BOOST_CHECK_EQUAL( true, tmpf.is_unlinked() ); + + BOOST_CHECK_EQUAL( false, tmpf.move(".foobar") ); + + unlink(".foobar"); +} + BOOST_AUTO_TEST_CASE(TmpfstreamReadWrite) { tmpfstream tmpf("./tmp.XXXXXX",std::ios_base::out | std::ios_base::in ); -- 1.7.1