aboutsummaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-10-04 18:55:45 +0200
committerGitHub <noreply@github.com>2016-10-04 18:55:45 +0200
commit42d90e9394c8f4e06b46a65f1e3f932a1e4fc3d1 (patch)
treea1c278f4d18496efbbcaf21dc541e09c588710a3 /sys
parente73ddfcb3ac418fc690b982f70da15b898096fa5 (diff)
parentf2d77726c8e7d2662bda0414d55073cd51742ff3 (diff)
Merge pull request #77 from xairy/array_as_blob
Emit BufferBlob for array[int8]
Diffstat (limited to 'sys')
-rw-r--r--sys/align.go7
-rw-r--r--sys/decl.go12
-rw-r--r--sys/test.txt13
3 files changed, 29 insertions, 3 deletions
diff --git a/sys/align.go b/sys/align.go
index 6e8563da4..055a433f8 100644
--- a/sys/align.go
+++ b/sys/align.go
@@ -48,14 +48,19 @@ func addAlignment(t *StructType) {
off += pad
fields = append(fields, makePad(pad))
}
- off += f.Size()
fields = append(fields, f)
if at, ok := f.(ArrayType); ok && (at.Kind == ArrayRandLen || (at.Kind == ArrayRangeLen && at.RangeBegin != at.RangeEnd)) {
varLen = true
}
+ if at, ok := f.(BufferType); ok && (at.Kind == BufferBlobRand || (at.Kind == BufferBlobRange && at.RangeBegin != at.RangeEnd)) {
+ varLen = true
+ }
if varLen && i != len(t.Fields)-1 {
panic("embed array in middle of a struct")
}
+ if !varLen {
+ off += f.Size()
+ }
}
if align != 0 && off%align != 0 && !varLen {
pad := align - off%align
diff --git a/sys/decl.go b/sys/decl.go
index f792f541c..275bbb380 100644
--- a/sys/decl.go
+++ b/sys/decl.go
@@ -100,7 +100,8 @@ func (t FileoffType) Align() uintptr {
type BufferKind int
const (
- BufferBlob BufferKind = iota
+ BufferBlobRand BufferKind = iota
+ BufferBlobRange
BufferString
BufferSockaddr
BufferFilesystem
@@ -110,7 +111,9 @@ const (
type BufferType struct {
TypeCommon
- Kind BufferKind
+ Kind BufferKind
+ RangeBegin uintptr // for BufferBlobRange kind
+ RangeEnd uintptr // for BufferBlobRange kind
}
func (t BufferType) Size() uintptr {
@@ -119,6 +122,11 @@ func (t BufferType) Size() uintptr {
return 14
case BufferAlgName:
return 64
+ case BufferBlobRange:
+ if t.RangeBegin == t.RangeEnd {
+ return t.RangeBegin
+ }
+ fallthrough
default:
panic(fmt.Sprintf("buffer size is not statically known: %v", t.Name()))
}
diff --git a/sys/test.txt b/sys/test.txt
index a01c6b3c2..6420ed54c 100644
--- a/sys/test.txt
+++ b/sys/test.txt
@@ -51,6 +51,8 @@ syz_union0 [
# Arrays.
syz_test$array0(a0 ptr[in, syz_array_struct])
+syz_test$array1(a0 ptr[in, syz_array_trailing])
+syz_test$array2(a0 ptr[in, syz_array_blob])
# Struct with a variable-length array or variable-length unions.
syz_array_struct {
@@ -63,3 +65,14 @@ syz_array_union [
f0 int16
f1 int64
] [varlen]
+
+syz_array_trailing {
+ f0 int8
+ f1 array[int8, 4:8]
+}
+
+syz_array_blob {
+ f0 int16
+ f1 array[int8, 16]
+ f2 int16
+}