Blame tests/44-live-a2_order.py

Packit Service 8eee21
#!/usr/bin/env python
Packit Service 8eee21
Packit Service 8eee21
#
Packit Service 8eee21
# Seccomp Library test program
Packit Service 8eee21
#
Packit Service 8eee21
# Copyright (c) 2018 Oracle and/or its affiliates.  All rights reserved.
Packit Service 8eee21
# Author: Tom Hromatka <tom.hromatka@oracle.com>
Packit Service 8eee21
#
Packit Service 8eee21
Packit Service 8eee21
#
Packit Service 8eee21
# This library is free software; you can redistribute it and/or modify it
Packit Service 8eee21
# under the terms of version 2.1 of the GNU Lesser General Public License as
Packit Service 8eee21
# published by the Free Software Foundation.
Packit Service 8eee21
#
Packit Service 8eee21
# This library is distributed in the hope that it will be useful, but WITHOUT
Packit Service 8eee21
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit Service 8eee21
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
Packit Service 8eee21
# for more details.
Packit Service 8eee21
#
Packit Service 8eee21
# You should have received a copy of the GNU Lesser General Public License
Packit Service 8eee21
# along with this library; if not, see <http://www.gnu.org/licenses>.
Packit Service 8eee21
#
Packit Service 8eee21
Packit Service 8eee21
import argparse
Packit Service 8eee21
import os
Packit Service 8eee21
import sys
Packit Service 8eee21
Packit Service 8eee21
import util
Packit Service 8eee21
Packit Service 8eee21
from seccomp import *
Packit Service 8eee21
Packit Service 8eee21
DEFAULT_ACTION_ERRNO = 100
Packit Service 8eee21
DEFAULT_ACTION = ERRNO(DEFAULT_ACTION_ERRNO)
Packit Service 8eee21
Packit Service 8eee21
test_cases = [
Packit Service 8eee21
    {'sz': 1, 'exp_rc': 1},
Packit Service 8eee21
    {'sz': 10, 'exp_rc': 10},
Packit Service 8eee21
    {'sz': 50, 'exp_rc': 50},
Packit Service 8eee21
    {'sz': 100, 'exp_rc': -DEFAULT_ACTION_ERRNO},
Packit Service 8eee21
    {'sz': 200, 'exp_rc': -5},
Packit Service 8eee21
    {'sz': 256, 'exp_rc': -5},
Packit Service 8eee21
    {'sz': 257, 'exp_rc': -6},
Packit Service 8eee21
    {'sz': 400, 'exp_rc': -6},
Packit Service 8eee21
    {'sz': 800, 'exp_rc': -7},
Packit Service 8eee21
    {'sz': 1600, 'exp_rc': -8},
Packit Service 8eee21
    {'sz': 3200, 'exp_rc': -9},
Packit Service 8eee21
    {'sz': 4095, 'exp_rc': -9},
Packit Service 8eee21
    {'sz': 4096, 'exp_rc': -9},
Packit Service 8eee21
    {'sz': 4097, 'exp_rc': -10},
Packit Service 8eee21
    {'sz': 8000, 'exp_rc': -10},
Packit Service 8eee21
    {'sz': 8192, 'exp_rc': -10},
Packit Service 8eee21
    {'sz': 16383, 'exp_rc': -11},
Packit Service 8eee21
    {'sz': 16384, 'exp_rc': -11},
Packit Service 8eee21
    {'sz': 16385, 'exp_rc': -12},
Packit Service 8eee21
    {'sz': 35000, 'exp_rc': -12},
Packit Service 8eee21
]
Packit Service 8eee21
Packit Service 8eee21
def do_read():
Packit Service 8eee21
    fd = os.open("/dev/zero", os.O_RDONLY)
Packit Service 8eee21
    for x in test_cases:
Packit Service 8eee21
        try:
Packit Service 8eee21
            os.read(fd, x['sz'])
Packit Service 8eee21
            if x['exp_rc'] < 0:
Packit Service 8eee21
                os.close(fd)
Packit Service 8eee21
                raise IOError("Erroneously read %d bytes.  Expected rc = %d" %
Packit Service 8eee21
                    (x['sz'], x['exp_rc']))
Packit Service 8eee21
        except OSError as ex:
Packit Service 8eee21
            if -ex.errno != x['exp_rc']:
Packit Service 8eee21
                os.close(fd)
Packit Service 8eee21
                raise IOError("Expected errno %d but os.read(%d bytes) caused errno %d" %
Packit Service 8eee21
                    (-x['exp_rc'], x['sz'], ex.errno))
Packit Service 8eee21
    os.close(fd)
Packit Service 8eee21
Packit Service 8eee21
def test():
Packit Service 8eee21
    f = SyscallFilter(DEFAULT_ACTION)
Packit Service 8eee21
    f.add_rule(ALLOW, "read", Arg(2, LE, 64))
Packit Service 8eee21
    f.add_rule(ERRNO(5), "read", Arg(2, GT, 128))
Packit Service 8eee21
    f.add_rule(ERRNO(6), "read", Arg(2, GT, 256))
Packit Service 8eee21
    f.add_rule(ERRNO(7), "read", Arg(2, GT, 512))
Packit Service 8eee21
    f.add_rule(ERRNO(8), "read", Arg(2, GT, 1024))
Packit Service 8eee21
    f.add_rule(ERRNO(9), "read", Arg(2, GT, 2048))
Packit Service 8eee21
    f.add_rule(ERRNO(10), "read", Arg(2, GT, 4096))
Packit Service 8eee21
    f.add_rule(ERRNO(11), "read", Arg(2, GT, 8192))
Packit Service 8eee21
    f.add_rule(ERRNO(12), "read", Arg(2, GT, 16384))
Packit Service 8eee21
    # NOTE: additional syscalls required for python
Packit Service 8eee21
    f.add_rule(ALLOW, "close")
Packit Service 8eee21
    f.add_rule(ALLOW, "rt_sigaction")
Packit Service 8eee21
    f.add_rule(ALLOW, "rt_sigreturn")
Packit Service 8eee21
    f.add_rule(ALLOW, "sigaltstack")
Packit Service 8eee21
    f.add_rule(ALLOW, "exit_group")
Packit Service 8eee21
    f.add_rule(ALLOW, "exit")
Packit Service 8eee21
    f.add_rule(ALLOW, "brk")
Packit Service 8eee21
    f.add_rule(ALLOW, "open")
Packit Service 8eee21
    f.add_rule(ALLOW, "openat")
Packit Service 8eee21
    f.add_rule(ALLOW, "stat")
Packit Service 8eee21
    f.add_rule(ALLOW, "write")
Packit Service 8eee21
    f.load()
Packit Service 8eee21
Packit Service 8eee21
    do_read()
Packit Service 8eee21
Packit Service 8eee21
    # all reads behaved as expected
Packit Service 8eee21
    quit(160)
Packit Service 8eee21
Packit Service 8eee21
test()
Packit Service 8eee21
Packit Service 8eee21
# kate: syntax python;
Packit Service 8eee21
# kate: indent-mode python; space-indent on; indent-width 4; mixedindent off;