• F
    linux-user: Fix syscall rt_sigtimedwait() implementation · 4d213001
    Filip Bozuta 提交于
    Implementation of 'rt_sigtimedwait()' in 'syscall.c' uses the
    function 'target_to_host_timespec()' to transfer the value of
    'struct timespec' from target to host. However, the implementation
    doesn't check whether this conversion succeeds and thus can cause
    an unaproppriate error instead of the 'EFAULT (Bad address)' which
    is supposed to be set if the conversion from target to host fails.
    
    This was confirmed with the LTP test for rt_sigtimedwait:
    "/testcases/kernel/syscalls/rt_sigtimedwait/rt_sigtimedwait01.c"
    which causes an unapropriate error in test case "test_bad_adress3"
    which is run with a bad adress for the 'struct timespec' argument:
    
    FAIL: test_bad_address3 (349): Unexpected failure: EAGAIN/EWOULDBLOCK (11)
    
    The test fails with an unexptected errno 'EAGAIN/EWOULDBLOCK' instead
    of the expected EFAULT.
    
    After the changes from this patch, the test case is executed successfully
    along with the other LTP test cases for 'rt_sigtimedwait()':
    
    PASS: test_bad_address3 (349): Test passed
    Signed-off-by: NFilip Bozuta <Filip.Bozuta@syrmia.com>
    Reviewed-by: NLaurent Vivier <laurent@vivier.eu>
    Message-Id: <20200724181651.167819-1-Filip.Bozuta@syrmia.com>
    Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
    4d213001
syscall.c 401.7 KB