Skip to content

Commit 34be0ef

Browse files
committed
Add GC-safe regions around ssl_read and ssl_write
1 parent e84f973 commit 34be0ef

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

src/ssl.jl

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -701,11 +701,23 @@ closed.
701701
https://tls.mbed.org/api/ssl_8h.html#aa2c29eeb1deaf5ad9f01a7515006ede5
702702
"""
703703
function ssl_read(ctx::SSLContext, ptr, n)::Int
704+
ret = 0
704705
@lockdata ctx begin
705-
return ccall((:mbedtls_ssl_read, libmbedtls), Cint,
706-
(Ptr{Cvoid}, Ptr{Cvoid}, Csize_t),
707-
ctx.data, ptr, n)
706+
ccd = Base.cconvert(Ptr{Cvoid}, ctx.data)
707+
cptr = Base.cconvert(Ptr{Cvoid}, ptr)
708+
GC.@preserve ccd cptr begin
709+
# Allow Julia to GC while reading/decrypting
710+
gc_state = @ccall(jl_gc_safe_enter()::Int8)
711+
ret = ccall((:mbedtls_ssl_read, libmbedtls), Cint,
712+
(Ptr{Cvoid}, Ptr{Cvoid}, Csize_t),
713+
Base.unsafe_convert(Ptr{Cvoid}, ccd)::Ptr{Cvoid},
714+
Base.unsafe_convert(Ptr{Cvoid}, cptr)::Ptr{Cvoid},
715+
n)
716+
# Leave GC-safe region, waiting for GC to complete if it's running
717+
@ccall(jl_gc_safe_leave(gc_state::Int8)::Cvoid)
718+
end
708719
end
720+
return ret
709721
end
710722

711723
"""
@@ -726,11 +738,23 @@ connection; the current connection must be closed.
726738
https://tls.mbed.org/api/ssl_8h.html#a5bbda87d484de82df730758b475f32e5
727739
"""
728740
function ssl_write(ctx::SSLContext, ptr, n)::Int
741+
ret = 0
729742
@lockdata ctx begin
730-
return ccall((:mbedtls_ssl_write, libmbedtls), Cint,
731-
(Ptr{Cvoid}, Ptr{Cvoid}, Csize_t),
732-
ctx.data, ptr, n)
743+
ccd = Base.cconvert(Ptr{Cvoid}, ctx.data)
744+
cptr = Base.cconvert(Ptr{Cvoid}, ptr)
745+
GC.@preserve ccd cptr begin
746+
# Allow Julia to GC while writing/encrypting
747+
gc_state = @ccall(jl_gc_safe_enter()::Int8)
748+
ret = ccall((:mbedtls_ssl_write, libmbedtls), Cint,
749+
(Ptr{Cvoid}, Ptr{Cvoid}, Csize_t),
750+
Base.unsafe_convert(Ptr{Cvoid}, ccd)::Ptr{Cvoid},
751+
Base.unsafe_convert(Ptr{Cvoid}, cptr)::Ptr{Cvoid},
752+
n)
753+
# Leave GC-safe region, waiting for GC to complete if it's running
754+
@ccall(jl_gc_safe_leave(gc_state::Int8)::Cvoid)
755+
end
733756
end
757+
return ret
734758
end
735759

736760
"""

0 commit comments

Comments
 (0)