Skip to content

Commit 4b6ab68

Browse files
Jan SulmontKristofferC
Jan Sulmont
authored andcommitted
bug fixed in read_to_buffer (#32457)
* bug fixed in read_to_buffer * added test for #32397. * switch back to original case * added torture test for long encoded string randomly laced with spaced
1 parent 07af3d2 commit 4b6ab68

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

stdlib/Base64/src/buffer.jl

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

2929
function read_to_buffer(io::IO, buffer::Buffer)
3030
offset = buffer.ptr - pointer(buffer.data)
31-
copyto!(buffer.data, 1, buffer.data, offset, buffer.size)
32-
buffer.ptr = pointer(buffer.data) + buffer.size
31+
copyto!(buffer.data, 1, buffer.data, offset + 1, buffer.size)
32+
buffer.ptr = pointer(buffer.data)
3333
if !eof(io)
3434
n = min(bytesavailable(io), capacity(buffer) - buffer.size)
3535
unsafe_read(io, buffer.ptr + buffer.size, n)

stdlib/Base64/test/runtests.jl

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
1616
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
1717
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="""
1818

19+
const longEncodedText = "bmFtZSA9ICJHZW5pZSIKdXVpZCA9ICJjNDNjNzM2ZS1hMmQxLTExZTgtMTYx\nZi1hZjk1MTE3ZmJkMWUiCmF1dGhvcnMgPSBbIkFkcmlhbiBTYWxjZWFudSA8\nZUBlc3NlbmNpYXJ5LmNvbT4iXQp2ZXJzaW9uID0gIjAuOS40IgoKW2RlcHNd\nCkFyZ1BhcnNlID0gImM3ZTQ2MGM2LTJmYjktNTNhOS04YzViLTE2ZjUzNTg1\nMWM2MyIKRGF0ZXMgPSAiYWRlMmNhNzAtMzg5MS01OTQ1LTk4ZmItZGMwOTk0\nMzJlMDZhIgpEaXN0cmlidXRlZCA9ICI4YmE4OWUyMC0yODVjLTViNmYtOTM1\nNy05NDcwMDUyMGVlMWIiCkd1bWJvID0gIjcwOGVjMzc1LWIzZDYtNWE1Ny1h\nN2NlLTgyNTdiZjk4NjU3YSIKSFRUUCA9ICJjZDNlYjAxNi0zNWZiLTUwOTQt\nOTI5Yi01NThhOTZmYWQ2ZjMiCkh0dHBDb21tb24gPSAiNzcxNzJjMWItMjAz\nZi01NGFjLWFhNTQtM2YxMTk4ZmU5ZjkwIgpKU09OID0gIjY4MmMwNmEwLWRl\nNmEtNTRhYi1hMTQyLWM4YjFjZjc5Y2RlNiIKTWFya2Rvd24gPSAiZDZmNDM3\nNmUtYWVmNS01MDVhLTk2YzEtOWMwMjczOTQ2MDdhIgpNYmVkVExTID0gIjcz\nOWJlNDI5LWJlYTgtNTE0MS05OTEzLWNjNzBlN2YzNzM2ZCIKTWlsbGJvYXJk\nID0gIjM5ZWMxNDQ3LWRmNDQtNWY0Yy1iZWFhLTg2NmYzMGI0ZDNiMiIKTWlu\naUxvZ2dpbmcgPSAiZjU5NDAyZWMtMDI2Mi01NzA3LWE1NjEtNzcwYWY5NGJj\nNWE2IgpOZXR0bGUgPSAiNDlkZWExZWUtZjZmYS01YWE2LTlhMTEtODgxNmNl\nZTdkNGI5IgpOdWxsYWJsZXMgPSAiNGQxZTFkNzctNjI1ZS01YjQwLTkxMTMt\nYTU2MGVjN2E4ZWNkIgpPcmRlcmVkQ29sbGVjdGlvbnMgPSAiYmFjNTU4ZTEt\nNWU3Mi01ZWJjLThmZWUtYWJlOGE0NjlmNTVkIgpQa2cgPSAiNDRjZmU5NWEt\nMWViMi01MmVhLWI2NzItZTJhZmRmNjliNzhmIgpSZWV4cG9ydCA9ICIxODlh\nMzg2Ny0zMDUwLTUyZGEtYTgzNi1lNjMwYmE5MGFiNjkiClJldmlzZSA9ICIy\nOTVhZjMwZi1lNGFkLTUzN2ItODk4My0wMDEyNmMyYTNhYmUiClNIQSA9ICJl\nYThlOTE5Yy0yNDNjLTUxYWYtODgyNS1hYWE2M2NkNzIxY2UiClNlcmlhbGl6\nYXRpb24gPSAiOWU4OGI0MmEtZjgyOS01YjBjLWJiZTktOWU5MjMxOTgxNjZi\nIgpTb2NrZXRzID0gIjY0NjJmZTBiLTI0ZGUtNTYzMS04Njk3LWRkOTQxZjkw\nZGVjYyIKVVJJUGFyc2VyID0gIjMwNTc4YjQ1LTlhZGMtNTk0Ni1iMjgzLTY0\nNWVjNDIwYWY2NyIKVW5pY29kZSA9ICI0ZWMwYTgzZS00OTNlLTUwZTItYjlh\nYy04ZjcyYWNmNWE4ZjUiCllBTUwgPSAiZGRiNmQ5MjgtMjg2OC01NzBmLWJk\nZGYtYWIzZjljZjk5ZWI2IgoKW2NvbXBhdF0KanVsaWEgPSAiMSIK"
20+
const longDecodedText = "name = \"Genie\"\nuuid = \"c43c736e-a2d1-11e8-161f-af95117fbd1e\"\nauthors = [\"Adrian Salceanu <[email protected]>\"]\nversion = \"0.9.4\"\n\n[deps]\nArgParse = \"c7e460c6-2fb9-53a9-8c5b-16f535851c63\"\nDates = \"ade2ca70-3891-5945-98fb-dc099432e06a\"\nDistributed = \"8ba89e20-285c-5b6f-9357-94700520ee1b\"\nGumbo = \"708ec375-b3d6-5a57-a7ce-8257bf98657a\"\nHTTP = \"cd3eb016-35fb-5094-929b-558a96fad6f3\"\nHttpCommon = \"77172c1b-203f-54ac-aa54-3f1198fe9f90\"\nJSON = \"682c06a0-de6a-54ab-a142-c8b1cf79cde6\"\nMarkdown = \"d6f4376e-aef5-505a-96c1-9c027394607a\"\nMbedTLS = \"739be429-bea8-5141-9913-cc70e7f3736d\"\nMillboard = \"39ec1447-df44-5f4c-beaa-866f30b4d3b2\"\nMiniLogging = \"f59402ec-0262-5707-a561-770af94bc5a6\"\nNettle = \"49dea1ee-f6fa-5aa6-9a11-8816cee7d4b9\"\nNullables = \"4d1e1d77-625e-5b40-9113-a560ec7a8ecd\"\nOrderedCollections = \"bac558e1-5e72-5ebc-8fee-abe8a469f55d\"\nPkg = \"44cfe95a-1eb2-52ea-b672-e2afdf69b78f\"\nReexport = \"189a3867-3050-52da-a836-e630ba90ab69\"\nRevise = \"295af30f-e4ad-537b-8983-00126c2a3abe\"\nSHA = \"ea8e919c-243c-51af-8825-aaa63cd721ce\"\nSerialization = \"9e88b42a-f829-5b0c-bbe9-9e923198166b\"\nSockets = \"6462fe0b-24de-5631-8697-dd941f90decc\"\nURIParser = \"30578b45-9adc-5946-b283-645ec420af67\"\nUnicode = \"4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5\"\nYAML = \"ddb6d928-2868-570f-bddf-ab3f9cf99eb6\"\n\n[compat]\njulia = \"1\"\n"
21+
1922
@testset "Examples" begin
2023
# Encode and decode
2124
fname = tempname()
2225
open(fname, "w") do f
2326
opipe = Base64EncodePipe(f)
24-
write(opipe,inputText)
27+
write(opipe, inputText)
2528
@test close(opipe) === nothing
2629
end
2730

@@ -58,15 +61,18 @@ ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="""
5861
#@test read(ipipe, String) == inputText
5962

6063
# Decode with two padding characters ("==")
61-
ipipe = Base64DecodePipe(IOBuffer(string(encodedMaxLine76[1:end-2],"==")))
62-
@test read(ipipe, String) == inputText[1:end-1]
64+
ipipe = Base64DecodePipe(IOBuffer(string(encodedMaxLine76[1:end - 2], "==")))
65+
@test read(ipipe, String) == inputText[1:end - 1]
6366

6467
# Test incorrect format
65-
ipipe = Base64DecodePipe(IOBuffer(encodedMaxLine76[1:end-3]))
68+
ipipe = Base64DecodePipe(IOBuffer(encodedMaxLine76[1:end - 3]))
6669
@test_throws ArgumentError read(ipipe, String)
6770

6871
# issue #21314
6972
@test base64decode(chomp("test")) == base64decode("test")
73+
74+
# issue #32397
75+
@test String(base64decode(longEncodedText)) == longDecodedText;
7076
end
7177

7278
@testset "Random data" begin
@@ -85,6 +91,25 @@ Base.show(io::IO, ::MIME"image/png", ::PNG) = print(io, "PNG")
8591
@test stringmime("text/html", "raw html data") == "raw html data"
8692
@test stringmime("text/plain", "string") == "\"string\""
8793
@test stringmime("image/png", UInt8[2,3,4,7]) == "AgMEBw=="
88-
@test stringmime("text/plain", 3.141592653589793, context=:compact=>true) == "3.14159"
94+
@test stringmime("text/plain", 3.141592653589793, context = :compact => true) == "3.14159"
8995
@test stringmime("image/png", PNG()) == stringmime(MIME("image/png"), PNG()) == "UE5H"
9096
end
97+
98+
function splace(in::String, p = 0.3)
99+
spaces = ["\n"," "]
100+
len = length(in)
101+
len == 0 && return in
102+
rc::String = ""
103+
i = 1
104+
for (x, v) in enumerate(sort(randsubseq(collect(1:len), p)))
105+
rc = rc * in[i:v] * rand(spaces)^rand(Int.(1:10))
106+
i = v + 1
107+
end
108+
return rc * in[i:len] * rand(spaces)^rand(Int.(1:10))
109+
end
110+
111+
@testset "lstrsplaced" begin
112+
for _ in 1:1000
113+
@test String(base64decode(splace(longEncodedText))) == longDecodedText
114+
end
115+
end

0 commit comments

Comments
 (0)