Documentation ¶
Index ¶
- Constants
- func CallSet(data []byte) (map[string]struct{}, error)
- func ForeachArgArray(args *[]Arg, ret Arg, f func(arg, base Arg, parent *[]Arg))
- func ForeachType(meta *Syscall, f func(Type))
- func IsPad(t Type) bool
- func RegisterTarget(target *Target, initArch func(target *Target))
- func RequiresBitmasks(p *Prog) bool
- func RequiresChecksums(p *Prog) bool
- type Arg
- type ArgCommon
- type ArgUsed
- type ArgUser
- type Args
- type ArrayKind
- type ArrayType
- type BufferKind
- type BufferType
- type ByPhysicalAddr
- type Call
- type ChoiceTable
- type CompMap
- type ConstArg
- type ConstType
- type ConstValue
- type CsumChunk
- type CsumChunkKind
- type CsumInfo
- type CsumKind
- type CsumType
- type DataArg
- type Dir
- type FlagsType
- type Gen
- type GroupArg
- type IntKind
- type IntType
- type IntTypeCommon
- type KeyedStruct
- type LenType
- type LogEntry
- type PointerArg
- type ProcType
- type Prog
- func (p *Prog) Clone() *Prog
- func (p *Prog) Mutate(rs rand.Source, ncalls int, ct *ChoiceTable, corpus []*Prog)
- func (p *Prog) MutateWithHints(compMaps []CompMap, exec func(newP *Prog))
- func (p *Prog) Serialize() []byte
- func (p *Prog) SerializeForExec(buffer []byte, pid int) error
- func (p *Prog) String() string
- func (p *Prog) StripDependencies()
- func (p *Prog) TrimAfter(idx int)
- func (p *Prog) Validate() error
- type PtrType
- type ResourceDesc
- type ResourceType
- type ResultArg
- type ReturnArg
- type StructDesc
- type StructKey
- type StructType
- type Syscall
- type Target
- func (target *Target) BuildChoiceTable(prios [][]float32, enabled map[*Syscall]bool) *ChoiceTable
- func (target *Target) CalculatePriorities(corpus []*Prog) [][]float32
- func (target *Target) Deserialize(data []byte) (prog *Prog, err error)
- func (target *Target) Generate(rs rand.Source, ncalls int, ct *ChoiceTable) *Prog
- func (target *Target) GenerateAllSyzProg(rs rand.Source) *Prog
- func (target *Target) ParseLog(data []byte) []*LogEntry
- func (target *Target) TransitivelyEnabledCalls(enabled map[*Syscall]bool) map[*Syscall]bool
- type TextKind
- type Type
- type TypeCommon
- func (t *TypeCommon) BitfieldLength() uint64
- func (t *TypeCommon) BitfieldMiddle() bool
- func (t *TypeCommon) BitfieldOffset() uint64
- func (t *TypeCommon) Default() uint64
- func (t TypeCommon) Dir() Dir
- func (t *TypeCommon) FieldName() string
- func (t *TypeCommon) Name() string
- func (t *TypeCommon) Optional() bool
- func (t *TypeCommon) Size() uint64
- func (t *TypeCommon) Varlen() bool
- type UnionArg
- type UnionType
- type VmaType
Constants ¶
const ( ExecInstrEOF = ^uint64(iota) ExecInstrCopyin ExecInstrCopyout )
const ( ExecArgConst = uint64(iota) ExecArgResult ExecArgData ExecArgCsum )
const ( ExecArgCsumChunkData = uint64(iota) ExecArgCsumChunkConst )
const (
ExecArgCsumInet = uint64(iota)
)
const (
ExecBufferSize = 2 << 20
)
Variables ¶
This section is empty.
Functions ¶
func CallSet ¶
CallSet returns a set of all calls in the program. It does very conservative parsing and is intended to parse paste/future serialization formats.
func ForeachArgArray ¶
func ForeachType ¶
func RegisterTarget ¶
func RequiresBitmasks ¶
func RequiresChecksums ¶
Types ¶
type ArrayType ¶
type ArrayType struct { TypeCommon Type Type Kind ArrayKind RangeBegin uint64 RangeEnd uint64 }
type BufferKind ¶
type BufferKind int
const ( BufferBlobRand BufferKind = iota BufferBlobRange BufferString BufferFilename BufferText )
type BufferType ¶
type BufferType struct { TypeCommon Kind BufferKind RangeBegin uint64 // for BufferBlobRange kind RangeEnd uint64 // for BufferBlobRange kind Text TextKind // for BufferText SubKind string Values []string // possible values for BufferString kind }
type ByPhysicalAddr ¶
type ByPhysicalAddr struct { Args Context *execContext }
func (ByPhysicalAddr) Less ¶
func (s ByPhysicalAddr) Less(i, j int) bool
type ChoiceTable ¶
type ChoiceTable struct {
// contains filtered or unexported fields
}
ChooseTable allows to do a weighted choice of a syscall for a given syscall based on call-to-call priorities and a set of enabled syscalls.
type CompMap ¶
type CompMap map[uint64]uint64Set
Example: for comparisons {(op1, op2), (op1, op3), (op1, op4), (op2, op1)} this map will store the following:
m = { op1: {map[op2]: true, map[op3]: true, map[op4]: true}, op2: {map[op1]: true} }.
type ConstType ¶
type ConstType struct { IntTypeCommon Val uint64 IsPad bool }
type ConstValue ¶
type CsumChunk ¶
type CsumChunk struct { Kind CsumChunkKind Arg Arg // for CsumChunkArg Value uint64 // for CsumChunkConst Size uint64 // for CsumChunkConst }
type CsumChunkKind ¶
type CsumChunkKind int
const ( CsumChunkArg CsumChunkKind = iota CsumChunkConst )
type CsumType ¶
type CsumType struct { IntTypeCommon Kind CsumKind Buf string Protocol uint64 // for CsumPseudo }
type FlagsType ¶
type FlagsType struct { IntTypeCommon Vals []uint64 }
type IntTypeCommon ¶
type IntTypeCommon struct { TypeCommon BitfieldOff uint64 BitfieldLen uint64 BigEndian bool BitfieldMdl bool }
func (*IntTypeCommon) BitfieldLength ¶
func (t *IntTypeCommon) BitfieldLength() uint64
func (*IntTypeCommon) BitfieldMiddle ¶
func (t *IntTypeCommon) BitfieldMiddle() bool
func (*IntTypeCommon) BitfieldOffset ¶
func (t *IntTypeCommon) BitfieldOffset() uint64
type KeyedStruct ¶
type KeyedStruct struct { Key StructKey Desc *StructDesc }
type LenType ¶
type LenType struct { IntTypeCommon ByteSize uint64 // want size in multiple of bytes instead of array size Buf string }
type LogEntry ¶
type LogEntry struct { P *Prog Proc int // index of parallel proc Start int // start offset in log End int // end offset in log Fault bool // program was executed with fault injection in FaultCall/FaultNth FaultCall int FaultNth int }
LogEntry describes one program in execution log.
type PointerArg ¶
type PointerArg struct { ArgCommon PageIndex uint64 PageOffset int // offset within a page PagesNum uint64 // number of available pages Res Arg // pointee }
Used for PtrType and VmaType. Even if these are always constant (for reproducibility), we use a separate type because they are represented in an abstract (base+page+offset) form.
func (*PointerArg) Size ¶
func (arg *PointerArg) Size() uint64
type ProcType ¶
type ProcType struct { IntTypeCommon ValuesStart uint64 ValuesPerProc uint64 }
type Prog ¶
func Minimize ¶
Minimize minimizes program p into an equivalent program using the equivalence predicate pred. It iteratively generates simpler programs and asks pred whether it is equal to the orginal program or not. If it is equivalent then the simplification attempt is committed and the process continues.
func (*Prog) MutateWithHints ¶
Mutates the program using the comparison operands stored in compMaps. For each of the mutants executes the exec callback.
func (*Prog) SerializeForExec ¶
SerializeForExec serializes program p for execution by process pid into the provided buffer. If the provided buffer is too small for the program an error is returned.
func (*Prog) String ¶
String generates a very compact program description (mostly for debug output).
func (*Prog) StripDependencies ¶
func (p *Prog) StripDependencies()
type PtrType ¶
type PtrType struct { TypeCommon Type Type }
type ResourceDesc ¶
type ResourceType ¶
type ResourceType struct { TypeCommon Desc *ResourceDesc }
func (*ResourceType) Default ¶
func (t *ResourceType) Default() uint64
func (*ResourceType) SpecialValues ¶
func (t *ResourceType) SpecialValues() []uint64
type ResultArg ¶
type ResultArg struct { ArgCommon Res Arg // reference to arg which we use OpDiv uint64 // divide result (executed before OpAdd) OpAdd uint64 // add to result Val uint64 // value used if Res is nil // contains filtered or unexported fields }
Used for ResourceType. Either holds constant value or reference another ResultArg or ReturnArg.
type ReturnArg ¶
type ReturnArg struct { ArgCommon // contains filtered or unexported fields }
Used for ResourceType and VmaType. This argument denotes syscall return value.
type StructDesc ¶
type StructDesc struct { TypeCommon Fields []Type AlignAttr uint64 }
func (*StructDesc) FieldName ¶
func (t *StructDesc) FieldName() string
type StructType ¶
type StructType struct { Key StructKey FldName string *StructDesc }
func (*StructType) FieldName ¶
func (t *StructType) FieldName() string
type Target ¶
type Target struct { OS string Arch string Revision string // unique hash representing revision of the descriptions PtrSize uint64 PageSize uint64 DataOffset uint64 Syscalls []*Syscall Resources []*ResourceDesc Structs []*KeyedStruct Consts []ConstValue // Syscall used by MakeMmap. // It has some special meaning because there are usually too many of them. MmapSyscall *Syscall // MakeMmap creates call that maps [start, start+npages) page range. MakeMmap func(start, npages uint64) *Call // AnalyzeMmap analyzes the call c regarding mapping/unmapping memory. // If it maps/unmaps any memory returns [start, start+npages) range, // otherwise returns npages = 0. AnalyzeMmap func(c *Call) (start, npages uint64, mapped bool) // SanitizeCall neutralizes harmful calls. SanitizeCall func(c *Call) // SpecialStructs allows target to do custom generation/mutation for some struct types. // Map key is struct name for which custom generation/mutation is required. // Map value is custom generation/mutation function that will be called // for the corresponding structs. g is helper object that allows generate random numbers, // allocate memory, etc. typ is the struct type. old is the old value of the struct // for mutation, or nil for generation. The function returns a new value of the struct, // and optionally any calls that need to be inserted before the arg reference. SpecialStructs map[string]func(g *Gen, typ *StructType, old *GroupArg) (Arg, []*Call) // Special strings that can matter for the target. // Used as fallback when string type does not have own dictionary. StringDictionary []string // Filled by prog package: SyscallMap map[string]*Syscall ConstMap map[string]uint64 // contains filtered or unexported fields }
Target describes target OS/arch pair.
func AllTargets ¶
func AllTargets() []*Target
func (*Target) BuildChoiceTable ¶
func (target *Target) BuildChoiceTable(prios [][]float32, enabled map[*Syscall]bool) *ChoiceTable
func (*Target) CalculatePriorities ¶
func (*Target) Generate ¶
Generate generates a random program of length ~ncalls. calls is a set of allowed syscalls, if nil all syscalls are used.
func (*Target) GenerateAllSyzProg ¶
GenerateAllSyzProg generates a program that contains all pseudo syz_ calls for testing.
type TypeCommon ¶
type TypeCommon struct { TypeName string FldName string // for struct fields and named args TypeSize uint64 // static size of the type, or 0 for variable size types ArgDir Dir IsOptional bool }
func (*TypeCommon) BitfieldLength ¶
func (t *TypeCommon) BitfieldLength() uint64
func (*TypeCommon) BitfieldMiddle ¶
func (t *TypeCommon) BitfieldMiddle() bool
func (*TypeCommon) BitfieldOffset ¶
func (t *TypeCommon) BitfieldOffset() uint64
func (*TypeCommon) Default ¶
func (t *TypeCommon) Default() uint64
func (TypeCommon) Dir ¶
func (t TypeCommon) Dir() Dir
func (*TypeCommon) FieldName ¶
func (t *TypeCommon) FieldName() string
func (*TypeCommon) Name ¶
func (t *TypeCommon) Name() string
func (*TypeCommon) Optional ¶
func (t *TypeCommon) Optional() bool
func (*TypeCommon) Size ¶
func (t *TypeCommon) Size() uint64
func (*TypeCommon) Varlen ¶
func (t *TypeCommon) Varlen() bool
type UnionType ¶
type UnionType struct { Key StructKey FldName string *StructDesc }
type VmaType ¶
type VmaType struct { TypeCommon RangeBegin uint64 // in pages RangeEnd uint64 }