Skip to content

Commit 701c185

Browse files
committed
Fix attachment file API bugs
Reading was not working properly, thanks to C++'s horrific std::ifstream API. Next time I'm sticking to C APIs for I/O because yuck.
1 parent aa32593 commit 701c185

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/attachments.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ std::array<std::byte, ENCRYPT_KEY_SIZE> encrypt(
298298
bool allow_large) {
299299

300300
std::ifstream in;
301-
in.exceptions(std::ios::failbit | std::ios::badbit);
301+
in.exceptions(std::ios::badbit);
302302
in.open(file, std::ios::binary | std::ios::ate);
303303
size_t size = in.tellg();
304304
in.seekg(0, std::ios::beg);
@@ -315,18 +315,25 @@ std::array<std::byte, ENCRYPT_KEY_SIZE> encrypt(
315315

316316
size_t in_size = 0;
317317
std::array<std::byte, 4096> chunk;
318-
while (auto sz = in.readsome(reinterpret_cast<char*>(chunk.data()), chunk.size())) {
318+
while (in.read(reinterpret_cast<char*>(chunk.data()), chunk.size())) {
319319
crypto_generichash_blake2b_update(
320-
&b_st, reinterpret_cast<const unsigned char*>(chunk.data()), sz);
321-
in_size += sz;
320+
&b_st, reinterpret_cast<const unsigned char*>(chunk.data()), chunk.size());
321+
in_size += chunk.size();
322322
}
323+
if (in.gcount() > 0) {
324+
crypto_generichash_blake2b_update(
325+
&b_st, reinterpret_cast<const unsigned char*>(chunk.data()), in.gcount());
326+
in_size += in.gcount();
327+
}
328+
323329
crypto_generichash_blake2b_final(&b_st, nonce_key.data(), nonce_key.size());
324330

325331
std::array<std::byte, ENCRYPT_KEY_SIZE> key;
326332
std::memcpy(key.data(), nonce_key.data() + ENCRYPT_HEADER, ENCRYPT_KEY_SIZE);
327333

328-
in.seekg(0, std::ios::beg);
329334
in.clear();
335+
in.exceptions(std::ios::badbit | std::ios::failbit);
336+
in.seekg(0, std::ios::beg);
330337

331338
auto encrypted = make_buffer(size);
332339
if (encrypted.size() != size)
@@ -799,7 +806,7 @@ size_t decrypt(
799806
std::function<std::span<std::byte>(size_t dec_size)> make_buffer) {
800807

801808
std::ifstream in;
802-
in.exceptions(std::ios::failbit | std::ios::badbit);
809+
in.exceptions(std::ios::badbit);
803810
in.open(encrypted_file, std::ios::binary | std::ios::ate);
804811
size_t size = in.tellg();
805812
in.seekg(0, std::ios::beg);
@@ -825,8 +832,11 @@ size_t decrypt(
825832
}};
826833

827834
std::array<std::byte, 4096> chunk;
828-
while (auto sz = in.readsome(reinterpret_cast<char*>(chunk.data()), chunk.size()))
829-
d.update(std::span{chunk}.first(sz));
835+
while (in.read(reinterpret_cast<char*>(chunk.data()), chunk.size()))
836+
d.update(chunk);
837+
if (in.gcount() > 0)
838+
d.update(std::span{chunk}.first(in.gcount()));
839+
830840
d.finalize();
831841

832842
return decrypted - out.begin();
@@ -852,7 +862,7 @@ void decrypt(
852862

853863
try {
854864
std::ifstream in;
855-
in.exceptions(std::ios::failbit | std::ios::badbit);
865+
in.exceptions(std::ios::badbit);
856866
in.open(file_in, std::ios::binary | std::ios::ate);
857867
size_t size = in.tellg();
858868
in.seekg(0, std::ios::beg);
@@ -871,8 +881,10 @@ void decrypt(
871881
}};
872882

873883
std::array<std::byte, 4096> chunk;
874-
while (auto sz = in.readsome(reinterpret_cast<char*>(chunk.data()), chunk.size()))
875-
d.update(std::span{chunk}.first(sz));
884+
while (in.read(reinterpret_cast<char*>(chunk.data()), chunk.size()))
885+
d.update(chunk);
886+
if (in.gcount() > 0)
887+
d.update(std::span{chunk}.first(in.gcount()));
876888
d.finalize();
877889
} catch (const std::exception& e) {
878890
std::error_code ec;

0 commit comments

Comments
 (0)