@@ -1888,27 +1888,47 @@ int get_syscall(struct __test_metadata *_metadata, pid_t tracee)
1888
1888
}
1889
1889
1890
1890
/* Architecture-specific syscall changing routine. */
1891
- void change_syscall (struct __test_metadata * _metadata ,
1892
- pid_t tracee , int syscall , int result )
1891
+ void __change_syscall (struct __test_metadata * _metadata ,
1892
+ pid_t tracee , long * syscall , long * ret )
1893
1893
{
1894
1894
ARCH_REGS orig , regs ;
1895
1895
1896
+ /* Do not get/set registers if we have nothing to do. */
1897
+ if (!syscall && !ret )
1898
+ return ;
1899
+
1896
1900
EXPECT_EQ (0 , ARCH_GETREGS (regs )) {
1897
1901
return ;
1898
1902
}
1899
1903
orig = regs ;
1900
1904
1901
- SYSCALL_NUM_SET (regs , syscall );
1905
+ if (syscall )
1906
+ SYSCALL_NUM_SET (regs , * syscall );
1902
1907
1903
- /* If syscall is skipped, change return value. */
1904
- if (syscall == -1 )
1905
- SYSCALL_RET_SET (regs , result );
1908
+ if (ret )
1909
+ SYSCALL_RET_SET (regs , * ret );
1906
1910
1907
1911
/* Flush any register changes made. */
1908
1912
if (memcmp (& orig , & regs , sizeof (orig )) != 0 )
1909
1913
EXPECT_EQ (0 , ARCH_SETREGS (regs ));
1910
1914
}
1911
1915
1916
+ /* Change only syscall number. */
1917
+ void change_syscall_nr (struct __test_metadata * _metadata ,
1918
+ pid_t tracee , long syscall )
1919
+ {
1920
+ __change_syscall (_metadata , tracee , & syscall , NULL );
1921
+ }
1922
+
1923
+ /* Change syscall return value (and set syscall number to -1). */
1924
+ void change_syscall_ret (struct __test_metadata * _metadata ,
1925
+ pid_t tracee , long ret )
1926
+ {
1927
+ long syscall = -1 ;
1928
+
1929
+ __change_syscall (_metadata , tracee , & syscall , & ret );
1930
+ }
1931
+
1912
1932
void tracer_seccomp (struct __test_metadata * _metadata , pid_t tracee ,
1913
1933
int status , void * args )
1914
1934
{
@@ -1924,17 +1944,17 @@ void tracer_seccomp(struct __test_metadata *_metadata, pid_t tracee,
1924
1944
case 0x1002 :
1925
1945
/* change getpid to getppid. */
1926
1946
EXPECT_EQ (__NR_getpid , get_syscall (_metadata , tracee ));
1927
- change_syscall (_metadata , tracee , __NR_getppid , 0 );
1947
+ change_syscall_nr (_metadata , tracee , __NR_getppid );
1928
1948
break ;
1929
1949
case 0x1003 :
1930
1950
/* skip gettid with valid return code. */
1931
1951
EXPECT_EQ (__NR_gettid , get_syscall (_metadata , tracee ));
1932
- change_syscall (_metadata , tracee , -1 , 45000 );
1952
+ change_syscall_ret (_metadata , tracee , 45000 );
1933
1953
break ;
1934
1954
case 0x1004 :
1935
1955
/* skip openat with error. */
1936
1956
EXPECT_EQ (__NR_openat , get_syscall (_metadata , tracee ));
1937
- change_syscall (_metadata , tracee , -1 , - ESRCH );
1957
+ change_syscall_ret (_metadata , tracee , - ESRCH );
1938
1958
break ;
1939
1959
case 0x1005 :
1940
1960
/* do nothing (allow getppid) */
@@ -1961,6 +1981,8 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
1961
1981
int ret ;
1962
1982
unsigned long msg ;
1963
1983
static bool entry ;
1984
+ long syscall_nr_val , syscall_ret_val ;
1985
+ long * syscall_nr = NULL , * syscall_ret = NULL ;
1964
1986
FIXTURE_DATA (TRACE_syscall ) * self = args ;
1965
1987
1966
1988
/*
@@ -1987,17 +2009,30 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
1987
2009
else
1988
2010
return ;
1989
2011
2012
+ syscall_nr = & syscall_nr_val ;
2013
+ syscall_ret = & syscall_ret_val ;
2014
+
2015
+ /* Now handle the actual rewriting cases. */
1990
2016
switch (self -> syscall_nr ) {
1991
2017
case __NR_getpid :
1992
- change_syscall (_metadata , tracee , __NR_getppid , 0 );
2018
+ syscall_nr_val = __NR_getppid ;
2019
+ /* Never change syscall return for this case. */
2020
+ syscall_ret = NULL ;
1993
2021
break ;
1994
2022
case __NR_gettid :
1995
- change_syscall (_metadata , tracee , -1 , 45000 );
2023
+ syscall_nr_val = -1 ;
2024
+ syscall_ret_val = 45000 ;
1996
2025
break ;
1997
2026
case __NR_openat :
1998
- change_syscall (_metadata , tracee , -1 , - ESRCH );
2027
+ syscall_nr_val = -1 ;
2028
+ syscall_ret_val = - ESRCH ;
1999
2029
break ;
2030
+ default :
2031
+ /* Unhandled, do nothing. */
2032
+ return ;
2000
2033
}
2034
+
2035
+ __change_syscall (_metadata , tracee , syscall_nr , syscall_ret );
2001
2036
}
2002
2037
2003
2038
FIXTURE_VARIANT (TRACE_syscall ) {
0 commit comments