You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/06/13 01:13:28 UTC
arrow git commit: ARROW-742: [C++] std::wstring_convert exceptions
handling
Repository: arrow
Updated Branches:
refs/heads/master ac6485390 -> 2a2b1094e
ARROW-742: [C++] std::wstring_convert exceptions handling
Author: Max Risuhin <ri...@gmail.com>
Closes #749 from MaxRis/ARROW-742 and squashes the following commits:
5479b3f4 [Max Risuhin] ARROW-742: [C++] std::wstring_convert exceptions handling
Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/2a2b1094
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/2a2b1094
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/2a2b1094
Branch: refs/heads/master
Commit: 2a2b1094e5370956917351ed49cf914ee2d5301f
Parents: ac64853
Author: Max Risuhin <ri...@gmail.com>
Authored: Mon Jun 12 21:13:22 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Mon Jun 12 21:13:22 2017 -0400
----------------------------------------------------------------------
cpp/src/arrow/io/file.cc | 14 +++++++++++---
cpp/src/arrow/io/io-file-test.cc | 12 ++++++++++++
2 files changed, 23 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/arrow/blob/2a2b1094/cpp/src/arrow/io/file.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/file.cc b/cpp/src/arrow/io/file.cc
index c4c797c..b2b8801 100644
--- a/cpp/src/arrow/io/file.cc
+++ b/cpp/src/arrow/io/file.cc
@@ -117,6 +117,10 @@ namespace io {
// ----------------------------------------------------------------------
// Cross-platform file compatability layer
+#if defined(_MSC_VER)
+constexpr const char* kRangeExceptionError =
+ "Range exception during wide-char string conversion";
+#endif
static inline Status CheckOpenResult(
int ret, int errno_actual, const char* filename, size_t filename_length) {
@@ -131,8 +135,10 @@ static inline Status CheckOpenResult(
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
std::wstring wide_string(
reinterpret_cast<const wchar_t*>(filename), filename_length / sizeof(wchar_t));
- std::string byte_string = converter.to_bytes(wide_string);
- ss << byte_string;
+ try {
+ std::string byte_string = converter.to_bytes(wide_string);
+ ss << byte_string;
+ } catch (const std::range_error&) { ss << kRangeExceptionError; }
#else
ss << filename;
#endif
@@ -162,7 +168,9 @@ static inline Status ConvertToUtf16(const std::string& input, std::wstring* resu
}
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> utf16_converter;
- *result = utf16_converter.from_bytes(input);
+ try {
+ *result = utf16_converter.from_bytes(input);
+ } catch (const std::range_error&) { return Status::Invalid(kRangeExceptionError); }
return Status::OK();
}
#endif
http://git-wip-us.apache.org/repos/asf/arrow/blob/2a2b1094/cpp/src/arrow/io/io-file-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/io-file-test.cc b/cpp/src/arrow/io/io-file-test.cc
index 3450bae..1b7e052 100644
--- a/cpp/src/arrow/io/io-file-test.cc
+++ b/cpp/src/arrow/io/io-file-test.cc
@@ -96,6 +96,18 @@ class TestFileOutputStream : public FileTestFixture {
std::shared_ptr<FileOutputStream> file_;
};
+#if defined(_MSC_VER)
+TEST_F(TestFileOutputStream, FileNameWideCharConversionRangeException) {
+ std::shared_ptr<FileOutputStream> file;
+ // Form literal string with non-ASCII symbol(127 + 1)
+ std::string file_name = "\x80";
+ ASSERT_RAISES(Invalid, FileOutputStream::Open(file_name, &file));
+
+ std::shared_ptr<ReadableFile> rd_file;
+ ASSERT_RAISES(Invalid, ReadableFile::Open(file_name, &rd_file));
+}
+#endif
+
TEST_F(TestFileOutputStream, DestructorClosesFile) {
int fd;
{