mirror of
https://github.com/odin-lang/Odin.git
synced 2026-10-12 19:19:53 -04:00
Fix #7763: Fix base64 decoder edge case
This commit is contained in:
1 parent
d630587dd7
commit
ea224d0f7e
4 files changed
+213
-1
No files matched your search
@@ -533,5 +533,5 @@ decoded_len :: proc(data: string) -> int {
|
||||
}
|
||||
}
|
||||
|
||||
return ((length * 6) >> 3) - padding
|
||||
return max(0, ((length * 6) >> 3) - padding)
|
||||
}
|
||||
@@ -102,6 +102,7 @@ clang -c ..\test_issue_sysv_abi.c -o test_issue_sysv_abi_c.o || exit /b
|
||||
..\..\..\odin test ..\test_issue_equal_proc_dependencies.odin %COMMON% -build-mode:obj 2>&1 | find /i /c "missing procedure" | findstr /x "0" || exit /b
|
||||
..\..\..\odin test ..\test_issue_7779.odin %COMMON% || exit /b
|
||||
..\..\..\odin run ..\test_issue_7798.odin %COMMON% || exit /b
|
||||
..\..\..\odin test ..\test_issue_7763.odin %COMMON% || exit /b
|
||||
|
||||
@echo off
|
||||
|
||||
|
||||
@@ -264,6 +264,7 @@ $ODIN test ../test_issue_7547.odin $COMMON
|
||||
$ODIN test ../test_issue_7490.odin $COMMON
|
||||
$ODIN test ../test_issue_7779.odin $COMMON
|
||||
$ODIN run ../test_issue_7798.odin $COMMON
|
||||
$ODIN test ../test_issue_7763.odin $COMMON
|
||||
|
||||
set +x
|
||||
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
package test_issues
|
||||
|
||||
import "core:testing"
|
||||
import "core:encoding/base64"
|
||||
import "core:slice"
|
||||
|
||||
main :: proc() {
|
||||
t: testing.T
|
||||
test_issue_7763__1eq(&t)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__nothing :: proc(t: ^testing.T) {
|
||||
input := ""
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__1eq :: proc(t: ^testing.T) {
|
||||
input := "="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__2eq :: proc(t: ^testing.T) {
|
||||
input := "=="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__3eq :: proc(t: ^testing.T) {
|
||||
input := "==="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__4eq :: proc(t: ^testing.T) {
|
||||
input := "===="
|
||||
decoded, err := base64.decode(input)
|
||||
// TODO: Either this should just work, or we should get Invalid_Padding, no? Currently gives Invalid_Character.
|
||||
// TODO: Same for 5+ padding chars.
|
||||
testing.expect(t, err != nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__Aeq :: proc(t: ^testing.T) {
|
||||
input := "A="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ :: proc(t: ^testing.T) {
|
||||
input := "QQ"
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, slice.equal(decoded, { 'A' }))
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ1eq :: proc(t: ^testing.T) {
|
||||
input := "QQ="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, slice.equal(decoded, { 'A' }))
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ2eq :: proc(t: ^testing.T) {
|
||||
input := "QQ=="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, slice.equal(decoded, { 'A' }))
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ3eq :: proc(t: ^testing.T) {
|
||||
input := "QQ==="
|
||||
decoded, err := base64.decode(input)
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, slice.equal(decoded, { 'A' }))
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ4eq :: proc(t: ^testing.T) {
|
||||
input := "QQ===="
|
||||
decoded, err := base64.decode(input)
|
||||
// TODO: Either this should just work, or we should get Invalid_Padding, no? Currently gives Invalid_Character.
|
||||
testing.expect(t, err != nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__QQ6eq :: proc(t: ^testing.T) {
|
||||
input := "QQ======"
|
||||
decoded, err := base64.decode(input)
|
||||
// TODO: Either this should just work, or we should get Invalid_Padding, no? Currently gives Invalid_Character.
|
||||
testing.expect(t, err != nil)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
// Strict
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_1eq :: proc(t: ^testing.T) {
|
||||
input := "="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_2eq :: proc(t: ^testing.T) {
|
||||
input := "=="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_3eq :: proc(t: ^testing.T) {
|
||||
input := "==="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_4eq :: proc(t: ^testing.T) {
|
||||
input := "===="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_Aeq :: proc(t: ^testing.T) {
|
||||
input := "A="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
defer delete(decoded)
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ :: proc(t: ^testing.T) {
|
||||
input := "QQ"
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ1eq :: proc(t: ^testing.T) {
|
||||
input := "QQ="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ2eq :: proc(t: ^testing.T) {
|
||||
input := "QQ=="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect(t, err == nil)
|
||||
testing.expect(t, slice.equal(decoded, { 'A' }))
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ3eq :: proc(t: ^testing.T) {
|
||||
input := "QQ==="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ4eq :: proc(t: ^testing.T) {
|
||||
input := "QQ===="
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
delete(decoded)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_issue_7763__strict_QQ6eq :: proc(t: ^testing.T) {
|
||||
input := "QQ======"
|
||||
decoded, err := base64.decode(input, options = { .Strict })
|
||||
testing.expect_value(t, err, .Invalid_Padding)
|
||||
testing.expect(t, decoded == nil)
|
||||
delete(decoded)
|
||||
}
|
||||
Reference in new issue
Block a user