clear error_code on successful file operations

Fixes #3035
This commit is contained in:
Mohammad Nejati
2026-06-25 13:23:59 +00:00
committed by Mohammad Nejati
parent bb6cf79a7c
commit 56a7c3af49
5 changed files with 93 additions and 1 deletions
@@ -29,6 +29,7 @@ class win32_unicode_path
public:
win32_unicode_path(const char* utf8_path, error_code& ec) {
ec = {};
int ret = mb2wide(utf8_path, static_buf_.data(),
static_buf_.size());
if (ret == 0)
+3 -1
View File
@@ -288,12 +288,13 @@ read(void* buffer, std::size_t n, error_code& ec) const
if(result == 0)
{
// short read
return nread;
break;
}
n -= result;
nread += result;
buffer = static_cast<char*>(buffer) + result;
}
ec = {};
return nread;
}
@@ -328,6 +329,7 @@ write(void const* buffer, std::size_t n, error_code& ec)
nwritten += result;
buffer = static_cast<char const*>(buffer) + result;
}
ec = {};
return nwritten;
}
@@ -300,6 +300,7 @@ read(void* buffer, std::size_t n, error_code& ec) const
ec.assign(errno, generic_category());
return 0;
}
ec = {};
return nread;
}
@@ -318,6 +319,7 @@ write(void const* buffer, std::size_t n, error_code& ec)
ec.assign(errno, generic_category());
return 0;
}
ec = {};
return nwritten;
}
@@ -317,7 +317,10 @@ read(void* buffer, std::size_t n, error_code& ec)
return nread;
}
if(bytesRead == 0)
{
ec = {};
return nread;
}
n -= bytesRead;
nread += bytesRead;
buffer = static_cast<char*>(buffer) + bytesRead;
@@ -357,7 +360,10 @@ write(void const* buffer, std::size_t n, error_code& ec)
return nwritten;
}
if(bytesWritten == 0)
{
ec = {};
return nwritten;
}
n -= bytesWritten;
nwritten += bytesWritten;
buffer = static_cast<char const*>(buffer) + bytesWritten;
+81
View File
@@ -444,6 +444,87 @@ test_file()
remove(path);
}
// https://github.com/boostorg/beast/issues/3035
//
// A successful operation must clear `ec`.
{
string_view const s = "Hello, world!";
// write
{
File f;
{
error_code ec = error::timeout;
f.open(path, file_mode::write, ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
error_code ec = error::timeout;
f.write(s.data(), s.size(), ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
error_code ec = error::timeout;
f.write(s.data(), 0, ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
error_code ec = error::timeout;
auto n = f.size(ec);
BEAST_EXPECTS(! ec, ec.message());
BEAST_EXPECT(n == s.size());
}
{
error_code ec = error::timeout;
f.pos(ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
error_code ec = error::timeout;
f.seek(0, ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
error_code ec = error::timeout;
f.close(ec);
BEAST_EXPECTS(! ec, ec.message());
}
}
// read
{
File f;
{
error_code ec = error::timeout;
f.open(path, file_mode::read, ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
std::string buf;
buf.resize(s.size());
error_code ec = error::timeout;
auto n = f.read(&buf[0], buf.size(), ec);
BEAST_EXPECTS(! ec, ec.message());
BEAST_EXPECT(n == s.size());
BEAST_EXPECT(buf == s);
}
{
char c;
error_code ec = error::timeout;
f.read(&c, 0, ec);
BEAST_EXPECTS(! ec, ec.message());
}
{
char c;
error_code ec = error::timeout;
auto n = f.read(&c, 1, ec);
BEAST_EXPECTS(! ec, ec.message());
BEAST_EXPECT(n == 0);
}
}
remove(path);
}
BEAST_EXPECT(! fs::exists(path));
}