Skip to content

Commit 5a40e9a

Browse files
committed
Fix use of async_mutex guard to avoid coroutine RAII bug on GCC 15, remove macos-14 (EOL)
1 parent 80d2a9c commit 5a40e9a

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

.github/compilers.json

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,12 @@
130130
"version": "*",
131131
"cxxstd": "20,23",
132132
"latest_cxxstd": "23",
133-
"runs_on": "macos-14",
133+
"runs_on": "macos-15",
134134
"cxx": "clang++",
135135
"cc": "clang",
136136
"b2_toolset": "clang",
137137
"is_earliest": true
138138
},
139-
{
140-
"version": "*",
141-
"cxxstd": "20,23",
142-
"latest_cxxstd": "23",
143-
"runs_on": "macos-15",
144-
"cxx": "clang++",
145-
"cc": "clang",
146-
"b2_toolset": "clang"
147-
},
148139
{
149140
"version": "*",
150141
"cxxstd": "20,23",

src/openssl/src/openssl_stream.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,10 @@ struct openssl_stream::impl
374374
break;
375375

376376
{
377-
auto [lec, guard] = co_await io_cm_.scoped_lock();
377+
auto [lec] = co_await io_cm_.lock();
378378
if (lec)
379379
co_return lec;
380+
capy::async_mutex::lock_guard io_guard(&io_cm_);
380381
auto [ec, n] = co_await capy::write(
381382
s_, capy::const_buffer(out_buf_.data(), got));
382383
if (ec)
@@ -388,9 +389,10 @@ struct openssl_stream::impl
388389

389390
capy::task<std::error_code> read_input()
390391
{
391-
auto [lec, guard] = co_await io_cm_.scoped_lock();
392+
auto [lec] = co_await io_cm_.lock();
392393
if (lec)
393394
co_return lec;
395+
capy::async_mutex::lock_guard io_guard(&io_cm_);
394396
auto [ec, n] = co_await s_.read_some(
395397
capy::mutable_buffer(in_buf_.data(), in_buf_.size()));
396398
if (ec)

src/wolfssl/src/wolfssl_stream.cpp

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -494,12 +494,13 @@ struct wolfssl_stream::impl
494494
read_in_buf_.data() + read_in_len_,
495495
read_in_buf_.size() - read_in_len_);
496496

497-
auto [lec, guard] = co_await io_cm_.scoped_lock();
497+
auto [lec] = co_await io_cm_.lock();
498498
if (lec)
499499
{
500500
current_op_ = nullptr;
501501
co_return {lec, total_read};
502502
}
503+
capy::async_mutex::lock_guard io_guard(&io_cm_);
503504
auto [rec, rn] = co_await s_.read_some(rbuf);
504505
if (rec)
505506
{
@@ -526,12 +527,13 @@ struct wolfssl_stream::impl
526527
// Renegotiation
527528
if (read_out_len_ > 0)
528529
{
529-
auto [lec, guard] = co_await io_cm_.scoped_lock();
530+
auto [lec] = co_await io_cm_.lock();
530531
if (lec)
531532
{
532533
current_op_ = nullptr;
533534
co_return {lec, total_read};
534535
}
536+
capy::async_mutex::lock_guard io_guard(&io_cm_);
535537
auto [wec, wn] = co_await capy::write(
536538
s_,
537539
capy::const_buffer(
@@ -604,12 +606,13 @@ struct wolfssl_stream::impl
604606
// Flush any pending output
605607
if (write_out_len_ > 0)
606608
{
607-
auto [lec, guard] = co_await io_cm_.scoped_lock();
609+
auto [lec] = co_await io_cm_.lock();
608610
if (lec)
609611
{
610612
current_op_ = nullptr;
611613
co_return {lec, total_written};
612614
}
615+
capy::async_mutex::lock_guard io_guard(&io_cm_);
613616
auto [wec, wn] = co_await capy::write(
614617
s_,
615618
capy::const_buffer(
@@ -633,12 +636,13 @@ struct wolfssl_stream::impl
633636
{
634637
if (write_out_len_ > 0)
635638
{
636-
auto [lec, guard] = co_await io_cm_.scoped_lock();
639+
auto [lec] = co_await io_cm_.lock();
637640
if (lec)
638641
{
639642
current_op_ = nullptr;
640643
co_return {lec, total_written};
641644
}
645+
capy::async_mutex::lock_guard io_guard(&io_cm_);
642646
auto [wec, wn] = co_await capy::write(
643647
s_,
644648
capy::const_buffer(
@@ -662,12 +666,13 @@ struct wolfssl_stream::impl
662666
capy::mutable_buffer rbuf(
663667
write_in_buf_.data() + write_in_len_,
664668
write_in_buf_.size() - write_in_len_);
665-
auto [lec, guard] = co_await io_cm_.scoped_lock();
669+
auto [lec] = co_await io_cm_.lock();
666670
if (lec)
667671
{
668672
current_op_ = nullptr;
669673
co_return {lec, total_written};
670674
}
675+
capy::async_mutex::lock_guard io_guard(&io_cm_);
671676
auto [rec, rn] = co_await s_.read_some(rbuf);
672677
if (rec)
673678
{
@@ -729,12 +734,13 @@ struct wolfssl_stream::impl
729734
// Flush any remaining output
730735
if (read_out_len_ > 0)
731736
{
732-
auto [lec, guard] = co_await io_cm_.scoped_lock();
737+
auto [lec] = co_await io_cm_.lock();
733738
if (lec)
734739
{
735740
ec = lec;
736741
break;
737742
}
743+
capy::async_mutex::lock_guard io_guard(&io_cm_);
738744
auto [wec, wn] = co_await capy::write(
739745
s_,
740746
capy::const_buffer(
@@ -754,12 +760,13 @@ struct wolfssl_stream::impl
754760
// Must flush (e.g. ClientHello) before reading ServerHello
755761
if (read_out_len_ > 0)
756762
{
757-
auto [lec, guard] = co_await io_cm_.scoped_lock();
763+
auto [lec] = co_await io_cm_.lock();
758764
if (lec)
759765
{
760766
ec = lec;
761767
break;
762768
}
769+
capy::async_mutex::lock_guard io_guard(&io_cm_);
763770
auto [wec, wn] = co_await capy::write(
764771
s_,
765772
capy::const_buffer(
@@ -780,12 +787,13 @@ struct wolfssl_stream::impl
780787
capy::mutable_buffer rbuf(
781788
read_in_buf_.data() + read_in_len_,
782789
read_in_buf_.size() - read_in_len_);
783-
auto [lec, guard] = co_await io_cm_.scoped_lock();
790+
auto [lec] = co_await io_cm_.lock();
784791
if (lec)
785792
{
786793
ec = lec;
787794
break;
788795
}
796+
capy::async_mutex::lock_guard io_guard(&io_cm_);
789797
auto [rec, rn] = co_await s_.read_some(rbuf);
790798
if (rec)
791799
{
@@ -798,12 +806,13 @@ struct wolfssl_stream::impl
798806
{
799807
if (read_out_len_ > 0)
800808
{
801-
auto [lec, guard] = co_await io_cm_.scoped_lock();
809+
auto [lec] = co_await io_cm_.lock();
802810
if (lec)
803811
{
804812
ec = lec;
805813
break;
806814
}
815+
capy::async_mutex::lock_guard io_guard(&io_cm_);
807816
auto [wec, wn] = co_await capy::write(
808817
s_,
809818
capy::const_buffer(
@@ -853,12 +862,13 @@ struct wolfssl_stream::impl
853862
// Bidirectional shutdown complete - flush any remaining output
854863
if (read_out_len_ > 0)
855864
{
856-
auto [lec, guard] = co_await io_cm_.scoped_lock();
865+
auto [lec] = co_await io_cm_.lock();
857866
if (lec)
858867
{
859868
ec = lec;
860869
break;
861870
}
871+
capy::async_mutex::lock_guard io_guard(&io_cm_);
862872
auto [wec, wn] = co_await capy::write(
863873
s_,
864874
capy::const_buffer(
@@ -874,9 +884,13 @@ struct wolfssl_stream::impl
874884
// First, flush any pending output (sends our close_notify)
875885
if (read_out_len_ > 0)
876886
{
877-
auto [lec, guard] = co_await io_cm_.scoped_lock();
887+
auto [lec] = co_await io_cm_.lock();
878888
if (lec)
889+
{
890+
ec = lec;
879891
break;
892+
}
893+
capy::async_mutex::lock_guard io_guard(&io_cm_);
880894
auto [wec, wn] = co_await capy::write(
881895
s_,
882896
capy::const_buffer(
@@ -897,9 +911,13 @@ struct wolfssl_stream::impl
897911
capy::mutable_buffer rbuf(
898912
read_in_buf_.data() + read_in_len_,
899913
read_in_buf_.size() - read_in_len_);
900-
auto [lec, guard] = co_await io_cm_.scoped_lock();
914+
auto [lec] = co_await io_cm_.lock();
901915
if (lec)
916+
{
917+
ec = lec;
902918
break;
919+
}
920+
capy::async_mutex::lock_guard io_guard(&io_cm_);
903921
auto [rec, rn] = co_await s_.read_some(rbuf);
904922
if (rec)
905923
break; // EOF or socket error during shutdown read - acceptable

0 commit comments

Comments
 (0)