1- // copyright axtlos <axtlos@disroot.org>
2- // SPDX-LICENSE: LGPL-3.0-ONLY
1+ /* copyright axtlos <axtlos@disroot.org>
2+ * SPDX-LICENSE: LGPL-3.0-ONLY */
33
44#include <errno.h>
55#include <stdbool.h>
@@ -22,46 +22,51 @@ argcmp(int matchtype, long config_arg_long, char *config_arg_char, long sys_arg)
2222 bool return_val = false;
2323
2424 if (!config_arg_char && config_arg_long != -1 )
25- return_val = has_flag (config_arg_long , sys_arg );
25+ return_val = has_flag (config_arg_long , sys_arg );
2626 else if (config_arg_char )
27- switch (matchtype ) {
28- case -1 :
29- if (strncmp (config_arg_char , (char * )sys_arg , strlen (config_arg_char )) == 0 )
30- return_val = true;
31- break ;
32- case 0 :
33- if (strcmp ((char * )sys_arg , config_arg_char ) == 0 )
34- return_val = true;
35- break ;
36- case 1 :
37- if (strstr ((char * )sys_arg , config_arg_char ) != NULL )
38- return_val = true;
39- break ;
40- default :
41- return_val = false;
27+ switch (matchtype )
28+ {
29+ case -1 :
30+ if (strncmp (config_arg_char , (char * )sys_arg , strlen (config_arg_char )) == 0 )
31+ return_val = true;
32+ break ;
33+ case 0 :
34+ if (strcmp ((char * )sys_arg , config_arg_char ) == 0 )
35+ return_val = true;
36+ break ;
37+ case 1 :
38+ if (strstr ((char * )sys_arg , config_arg_char ) != NULL )
39+ return_val = true;
40+ break ;
41+ default :
42+ return_val = false;
4243 }
4344
4445 return return_val ;
4546}
4647
47- // Function origin:
48- // https://www.gnu.org/software/libc/manual/html_node/Symbolic-Links.html#index-readlink
48+ /* Function origin:
49+ *
50+ * https://www.gnu.org/software/libc/manual/html_node/Symbolic-Links.html#index-readlink */
4951char *
5052readlink_malloc (const char * filename )
5153{
5254 size_t size = 50 ;
5355 char * buffer = NULL ;
5456
55- while (true) {
56- buffer = reallocarray (buffer , size , 2 );
57- if (buffer == 0 ) {
58- puts ("Virtual memory exhausted" );
59- exit (1 );
57+ while (true)
58+ {
59+ buffer = reallocarray (buffer , size , 2 );
60+ if (buffer == 0 )
61+ {
62+ puts ("Virtual memory exhausted" );
63+ exit (1 );
6064 }
6165 size *= 2 ;
62- ssize_t nchars = readlink (filename , buffer , size );
63- if (nchars < 0 ) {
64- free (buffer );
66+ ssize_t nchars = readlink (filename , buffer , size );
67+ if (nchars < 0 )
68+ {
69+ free (buffer );
6570 return NULL ;
6671 }
6772 if ((unsigned )nchars < size )
@@ -73,106 +78,125 @@ char *
7378get_fdesc (long arg )
7479{
7580 char * linkname , * procstat ;
76- pid_t pid = getpid ();
77- int proc = asprintf (& procstat , "/proc/%d/fd/%ld" , pid , arg );
81+ pid_t pid = getpid ();
82+ int proc = asprintf (& procstat , "/proc/%d/fd/%ld" , pid , arg );
7883
7984 if (proc < 0 )
8085 linkname = NULL ;
8186 else
82- linkname = readlink_malloc (procstat );
87+ linkname = readlink_malloc (procstat );
8388
8489 return linkname ;
8590}
8691
8792bool
88- match_args (conf_syscall * call , long arg0 , long arg1 , long arg2 , long arg3 , long arg4 , long arg5 )
93+ match_args (conf_syscall * call , long arg0 , long arg1 , long arg2 , long arg3 , long arg4 , long arg5 )
8994{
90- bool arg0_match = true, arg1_match = true, arg2_match = true, arg3_match = true, arg4_match = true, arg5_match = true;
91- if (call -> arg0 || call -> arg0_long != -1 ) {
95+ bool arg0_match = true, arg1_match = true, arg2_match = true, arg3_match = true,
96+ arg4_match = true, arg5_match = true;
97+
98+ if (call -> arg0 || call -> arg0_long != -1 )
99+ {
92100 long arg = arg0 ;
93- if (call -> arg0_fdesc == true) {
94- arg = (long )get_fdesc (arg0 );
101+ if (call -> arg0_fdesc == true)
102+ {
103+ arg = (long )get_fdesc (arg0 );
95104 if (arg <= 0 )
96105 goto arg1cmp ;
97106 }
98- arg0_match = argcmp (call -> arg0_matchtype , call -> arg0_long , call -> arg0 , arg );
107+ arg0_match = argcmp (call -> arg0_matchtype , call -> arg0_long , call -> arg0 , arg );
99108 }
100109arg1cmp :
101- if (call -> arg1 || call -> arg1_long != -1 ) {
110+ if (call -> arg1 || call -> arg1_long != -1 )
111+ {
102112 long arg = arg1 ;
103- if (call -> arg1_fdesc == true) {
104- arg = (long )get_fdesc (arg1 );
113+ if (call -> arg1_fdesc == true)
114+ {
115+ arg = (long )get_fdesc (arg1 );
105116 if (arg <= 0 )
106117 goto arg2cmp ;
107118 }
108- arg1_match = argcmp (call -> arg1_matchtype , call -> arg1_long , call -> arg1 , arg );
119+ arg1_match = argcmp (call -> arg1_matchtype , call -> arg1_long , call -> arg1 , arg );
109120 }
110121arg2cmp :
111- if (call -> arg2 || call -> arg2_long != -1 ) {
122+ if (call -> arg2 || call -> arg2_long != -1 )
123+ {
112124 long arg = arg2 ;
113- if (call -> arg2_fdesc == true) {
114- arg = (long )get_fdesc (arg2 );
125+ if (call -> arg2_fdesc == true)
126+ {
127+ arg = (long )get_fdesc (arg2 );
115128 if (arg <= 0 )
116129 goto arg3cmp ;
117130 }
118- arg2_match = argcmp (call -> arg2_matchtype , call -> arg2_long , call -> arg2 , arg );
131+ arg2_match = argcmp (call -> arg2_matchtype , call -> arg2_long , call -> arg2 , arg );
119132 }
120133arg3cmp :
121- if (call -> arg3 || call -> arg3_long != -1 ) {
134+ if (call -> arg3 || call -> arg3_long != -1 )
135+ {
122136 long arg = arg3 ;
123- if (call -> arg3_fdesc == true) {
124- arg = (long )get_fdesc (arg3 );
137+ if (call -> arg3_fdesc == true)
138+ {
139+ arg = (long )get_fdesc (arg3 );
125140 if (arg <= 0 )
126141 goto arg4cmp ;
127142 }
128- arg3_match = argcmp (call -> arg3_matchtype , call -> arg3_long , call -> arg3 , arg );
143+ arg3_match = argcmp (call -> arg3_matchtype , call -> arg3_long , call -> arg3 , arg );
129144 }
130145arg4cmp :
131- if (call -> arg4 || call -> arg4_long != -1 ) {
146+ if (call -> arg4 || call -> arg4_long != -1 )
147+ {
132148 long arg = arg4 ;
133- if (call -> arg4_fdesc == true) {
134- arg = (long )get_fdesc (arg4 );
149+ if (call -> arg4_fdesc == true)
150+ {
151+ arg = (long )get_fdesc (arg4 );
135152 if (arg <= 0 )
136153 goto arg5cmp ;
137154 }
138- arg4_match = argcmp (call -> arg4_matchtype , call -> arg4_long , call -> arg4 , arg );
155+ arg4_match = argcmp (call -> arg4_matchtype , call -> arg4_long , call -> arg4 , arg );
139156 }
140157arg5cmp :
141- if (call -> arg5 || call -> arg5_long != -1 ) {
158+ if (call -> arg5 || call -> arg5_long != -1 )
159+ {
142160 long arg = arg5 ;
143- if (call -> arg5_fdesc == true) {
144- arg = (long )get_fdesc (arg5 );
161+ if (call -> arg5_fdesc == true)
162+ {
163+ arg = (long )get_fdesc (arg5 );
145164 if (arg <= 0 )
146165 goto cmpfinish ;
147166 }
148- arg5_match = argcmp (call -> arg5_matchtype , call -> arg5_long , call -> arg5 , arg );
167+ arg5_match = argcmp (call -> arg5_matchtype , call -> arg5_long , call -> arg5 , arg );
149168 }
150169cmpfinish :
151170 return arg0_match && arg1_match && arg2_match && arg3_match && arg4_match && arg5_match ;
152171}
153172
154- void log_call (conf_syscall * call )
173+ void
174+ log_call (conf_syscall * call )
155175{
156176 FILE * log_file ;
157- time_t t = time (NULL );
158- struct tm timestruc = * localtime (& t );
159-
160- log_file = fopen (LOG_FILE , "a" );
161- fprintf (log_file , "Intercepted call %s at %d-%02d-%02d %02d:%02d:%02d\n" ,
162- call -> name , timestruc .tm_year + 1900 , timestruc .tm_mon + 1 ,
163- timestruc .tm_mday , timestruc .tm_hour , timestruc .tm_min ,
164- timestruc .tm_sec );
165- fclose (log_file );
177+ time_t t = time (NULL );
178+ struct tm timestruc = * localtime (& t );
179+
180+ log_file = fopen (LOG_FILE , "a" );
181+ fprintf (log_file , "Intercepted call %s at %d-%02d-%02d %02d:%02d:%02d\n" ,
182+ call -> name , timestruc .tm_year + 1900 , timestruc .tm_mon + 1 ,
183+ timestruc .tm_mday , timestruc .tm_hour , timestruc .tm_min ,
184+ timestruc .tm_sec );
185+ fclose (log_file );
166186}
187+
167188static int
168189hook (long syscall_number , long arg0 , long arg1 , long arg2 , long arg3 , long arg4 , long arg5 , long * result )
169190{
170- conf_syscall * call = get_calls ();
171- while (true) {
172- if (call -> callnum == syscall_number && match_args (call , arg0 , arg1 , arg2 , arg3 , arg4 , arg5 )) {
191+ conf_syscall * call = get_calls ();
192+ while (true)
193+ {
194+ if (call -> callnum == syscall_number && match_args (call , arg0 , arg1 , arg2 , arg3 , arg4 , arg5 ))
195+ {
173196 if (call -> log )
174- log_call (call );
175- if (call -> block ) {
197+ log_call (call );
198+ if (call -> block )
199+ {
176200 * result = - ENOTSUP ;
177201 return 0 ;
178202 }
@@ -184,7 +208,8 @@ hook(long syscall_number, long arg0, long arg1, long arg2, long arg3, long arg4,
184208 }
185209}
186210
187- static __attribute__((constructor )) void
211+ static __attribute__ ((constructor ))
212+ void
188213init (void )
189214{
190215 intercept_hook_point = & hook ;
0 commit comments