Skip to content

Commit 7ebda4a

Browse files
authored
Safely error in generic Base.seekend if in write mode (#179)
1 parent 0a46abf commit 7ebda4a

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/stream.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ end
310310

311311
function Base.seekend(stream::TranscodingStream)
312312
mode = stream.state.mode
313-
@checkmode (:idle, :read, :write)
314-
if mode == :read || mode == :write
313+
@checkmode (:idle, :read)
314+
if mode == :read
315315
callstartproc(stream, mode)
316316
emptybuffer!(stream.buffer1)
317317
emptybuffer!(stream.buffer2)

test/codecquadruple.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,25 @@ end
142142
end
143143
end
144144

145+
@testset "seekend doesn't delete data" begin
146+
for n in 0:3
147+
sink = IOBuffer()
148+
# wrap stream in NoopStream n times.
149+
stream = foldl(
150+
(s,_) -> NoopStream(s),
151+
1:n;
152+
init=TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
153+
)
154+
write(stream, "x")
155+
# seekend must not delete user data even if it errors.
156+
@test_throws Exception seekend(stream)
157+
write(stream, TranscodingStreams.TOKEN_END)
158+
flush(stream)
159+
@test take!(sink) == b"xxxx"
160+
close(stream)
161+
end
162+
end
163+
145164
@testset "eof is true after write" begin
146165
sink = IOBuffer()
147166
stream = TranscodingStream(QuadrupleCodec(), sink, bufsize=16)

0 commit comments

Comments
 (0)