From ab94d7014fdc6219e4ed0083c3ff798db2ce1ad6 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Tue, 16 Jan 2024 08:24:37 +0100 Subject: [PATCH] stream: cleanup Signed-off-by: Simon Rozman --- include/stdex/stream.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/stdex/stream.hpp b/include/stdex/stream.hpp index 4174268c1..bd3453867 100644 --- a/include/stdex/stream.hpp +++ b/include/stdex/stream.hpp @@ -540,11 +540,11 @@ namespace stdex /// size_t write_sa(_In_ LPSAFEARRAY sa) { - safearray_accessor a(sa); long ubound, lbound; if (FAILED(SafeArrayGetUBound(sa, 1, &ubound)) || FAILED(SafeArrayGetLBound(sa, 1, &lbound))) throw std::invalid_argument("SafeArrayGet[UL]Bound failed"); + safearray_accessor a(sa); return write(a.data(), static_cast(ubound) - lbound + 1); } #endif @@ -954,13 +954,15 @@ namespace stdex LPSAFEARRAY read_sa() { _Assume_(size() <= SIZE_MAX); - size_t length = static_cast(size()); - std::unique_ptr sa(SafeArrayCreateVector(VT_UI1, 0, (ULONG)length)); + if (size() > ULONG_MAX) + throw std::range_error("data too big"); + ULONG length = static_cast(size()); + std::unique_ptr sa(SafeArrayCreateVector(VT_UI1, 0, length)); if (!sa) _Unlikely_ throw std::runtime_error("SafeArrayCreateVector failed"); - safearray_accessor a(sa.get()); if (seek(0) != 0) _Unlikely_ throw std::system_error(sys_error(), std::system_category(), "failed to seek"); + safearray_accessor a(sa.get()); if (read_array(a.data(), 1, length) != length) throw std::system_error(sys_error(), std::system_category(), "failed to read"); return sa.release();