func()

in rule/rule.go [436:477]


func (r *ruleData) fromAuditRuleData(in *auditRuleData) error {
	r.flags = in.Flags
	r.action = in.Action
	r.fields = make([]field, in.FieldCount)
	r.allSyscalls = true
	for i := 0; r.allSyscalls && i < len(in.Mask)-1; i++ {
		r.allSyscalls = in.Mask[i] == 0xFFFFFFFF
	}
	if !r.allSyscalls {
		for word, bits := range in.Mask {
			for bit := uint32(0); bit < 32; bit++ {
				if bits&(1<<bit) != 0 {
					r.syscalls = append(r.syscalls, uint32(word)*32+bit)
				}
			}
		}
	}
	r.fields = make([]field, in.FieldCount)
	r.fieldFlags = make([]operator, in.FieldCount)
	r.values = make([]uint32, in.FieldCount)

	offset := uint32(0)
	for i := uint32(0); i < in.FieldCount; i++ {
		r.fields[i] = in.Fields[i]
		r.fieldFlags[i] = in.FieldFlags[i]
		r.values[i] = in.Values[i]
		switch r.fields[i] {
		case objectUserField, objectRoleField, objectTypeField, objectLevelLowField,
			objectLevelHighField, pathField, dirField, subjectUserField,
			subjectRoleField, subjectTypeField, subjectSensitivityField,
			subjectClearanceField, keyField, exeField:
			end := in.Values[i] + offset
			if end > in.BufLen {
				return fmt.Errorf("field %d overflows buffer", i)
			}
			r.strings = append(r.strings, string(in.Buf[offset:end]))
			offset = end
		}
	}

	return nil
}