Skip to content

Commit

Permalink
fix: check size and len(src) match to avoid partial or truncated writes
Browse files Browse the repository at this point in the history
  • Loading branch information
agparadiso committed Jan 9, 2025
1 parent 2ebd63b commit 0ae96d5
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
4 changes: 4 additions & 0 deletions pkg/workflows/wasm/host/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,10 @@ func write(memory, src []byte, ptr, size int32) int64 {
return -1
}

if len(src) != int(size) {
return -1
}

if int32(len(memory)) < ptr+size {
return -1
}
Expand Down
26 changes: 20 additions & 6 deletions pkg/workflows/wasm/host/module_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -553,29 +553,43 @@ func Test_read(t *testing.T) {
}

func Test_write(t *testing.T) {
t.Run("successfully write to slice", func(t *testing.T) {
t.Run("OK-successfully_write_to_slice", func(t *testing.T) {
giveSrc := []byte("hello, world")
memory := make([]byte, 12)
n := write(memory, giveSrc, 0, int32(len(giveSrc)))
assert.Equal(t, n, int64(len(giveSrc)))
assert.Equal(t, []byte("hello, world"), memory[:len(giveSrc)])
})

t.Run("cannot write to slice because memory too small", func(t *testing.T) {
t.Run("NOK-cannot_write_to_slice_because_memory_too_small", func(t *testing.T) {
giveSrc := []byte("hello, world")
memory := make([]byte, len(giveSrc)-1)
n := write(memory, giveSrc, 0, int32(len(giveSrc)))
assert.Equal(t, n, int64(-1))
assert.Equal(t, int64(-1), n)
})

t.Run("fails to write to invalid access", func(t *testing.T) {
t.Run("NOK-fails_to_write_to_invalid_access", func(t *testing.T) {
giveSrc := []byte("hello, world")
memory := make([]byte, len(giveSrc))
n := write(memory, giveSrc, 0, -1)
assert.Equal(t, n, int64(-1))
assert.Equal(t, int64(-1), n)

n = write(memory, giveSrc, -1, 1)
assert.Equal(t, n, int64(-1))
assert.Equal(t, int64(-1), n)
})

t.Run("NOK-truncated_write_due_to_size_being_smaller_than_len", func(t *testing.T) {
giveSrc := []byte("hello, world")
memory := make([]byte, 12)
n := write(memory, giveSrc, 0, int32(len(giveSrc)-2))
assert.Equal(t, int64(-1), n)
})

t.Run("NOK-unwanted_data_when_size_exceeds_written_data", func(t *testing.T) {
giveSrc := []byte("hello, world")
memory := make([]byte, 20)
n := write(memory, giveSrc, 0, 20)
assert.Equal(t, int64(-1), n)
})
}

Expand Down

0 comments on commit 0ae96d5

Please sign in to comment.