@@ -41,10 +41,22 @@ static void usage(const char *prog) {
41
41
prog );
42
42
}
43
43
44
- static char * extract_script (const char * path )
44
+ static int try_strncpy (char * dest , const char * src , size_t n , const char * fmt ) {
45
+ int srclen = strnlen (src , n );
46
+
47
+ if (srclen == n ) {
48
+ int err = ENAMETOOLONG ;
49
+ fprintf (stderr , fmt , strerror (err ));
50
+ return - err ;
51
+ }
52
+
53
+ strncpy (dest , src , n );
54
+ return srclen ;
55
+ }
56
+
57
+ static char * extract_script (const char * path , size_t * script_len )
45
58
{
46
59
FILE * f ;
47
- long script_len ;
48
60
size_t read ;
49
61
char * script = NULL ;
50
62
@@ -55,25 +67,33 @@ static char *extract_script(const char *path)
55
67
}
56
68
57
69
if (fseek (f , 0 , SEEK_END ) < 0 ) {
58
- perror ("unable to reach end of script file" );
70
+ perror ("unable to reach end of file" );
59
71
goto out ;
60
72
}
61
- script_len = ftell (f );
62
- if (script_len < 0 ) {
63
- perror ("error while attempting to get script length" );
73
+
74
+ * script_len = (size_t ) ftell (f );
75
+ if (* script_len < 0 ) {
76
+ perror ("error while attempting to get file length" );
64
77
goto out ;
65
78
}
66
- rewind (f );
67
79
68
- script = (char * ) malloc (script_len + 1 );
80
+ fseek (f , 0 , * script_len );
81
+
82
+ if (* script_len > XDP_LUA_MAX_SCRIPT_LEN )
83
+ fprintf (stderr , "lua file can't have more than %d bytes\n" ,
84
+ XDP_LUA_MAX_SCRIPT_LEN );
85
+
86
+ script = (char * ) malloc (sizeof (char ) * (* script_len ));
69
87
if (!script ) {
70
88
perror ("failed to alloc lua script" );
71
89
goto out ;
72
90
}
73
- memset (script , 0 , script_len + 1 );
74
- read = fread (script , 1 , script_len , f );
75
- if (read != script_len ) {
76
- perror ("unable to read lua file" );
91
+
92
+ rewind (f );
93
+
94
+ read = fread (script , sizeof (char ), * script_len , f );
95
+ if (read != * script_len ) {
96
+ fprintf (stderr , "unable to read file %s\n" , path );
77
97
free (script );
78
98
script = NULL ;
79
99
goto out ;
@@ -95,11 +115,11 @@ static int do_attach_ebpf(int idx, int fd, const char *name)
95
115
return err ;
96
116
}
97
117
98
- static int do_attach_lua (const char * script )
118
+ static int do_attach_lua (const char * script , size_t script_len )
99
119
{
100
120
int err ;
101
121
102
- err = bpf_set_link_xdp_lua_script (script );
122
+ err = bpf_set_link_xdp_lua_script (script , script_len );
103
123
if (err < 0 )
104
124
fprintf (stderr , "ERROR: failed to attach lua script %d\n" , err );
105
125
@@ -138,19 +158,23 @@ static void poll(int map_fd, int interval, int duration) {
138
158
}
139
159
}
140
160
161
+ #define strncpy_err (fmt , err ) fprintf(stderr, fmt, strerr(-err))
162
+
141
163
int main (int argc , char * argv [])
142
164
{
143
165
struct rlimit r = {RLIM_INFINITY , RLIM_INFINITY };
144
166
char lua_filename [MAXFILENAMELEN ];
145
167
char filename [MAXFILENAMELEN ];
146
168
char script [XDP_LUA_MAX_SCRIPT_LEN ];
169
+ size_t script_len = 0 ;
147
170
char ifname [IFNAMSIZ ];
148
171
struct bpf_object * obj ;
149
172
int opt , prog_fd ;
150
173
int rx_cnt_map_fd ;
151
174
int ifindex = 0 ;
152
175
int detach = 0 , attach_lua_file = 0 , attach_ebpf = 0 , monitor = 0 ,
153
176
attach_lua_script = 0 , interval = 1 , duration = 1 ;
177
+ int err = 0 ;
154
178
155
179
const char * optstr = "f:p:i:dms:I:D:" ;
156
180
struct bpf_prog_load_attr prog_load_attr = {
@@ -163,28 +187,36 @@ int main(int argc, char *argv[])
163
187
while ((opt = getopt (argc , argv , optstr )) != -1 ) {
164
188
switch (opt ) {
165
189
case 'f' :
166
- snprintf (lua_filename , sizeof (lua_filename ), "%s" , optarg );
190
+ err = try_strncpy (lua_filename , optarg , MAXFILENAMELEN , "Invalid lua filename\nerr: %s\n" );
191
+ if (err < 0 )
192
+ return 1 ;
167
193
attach_lua_file = 1 ;
168
194
break ;
169
195
case 'p' :
170
- snprintf (filename , sizeof (filename ),
171
- "%s" , optarg );
196
+ err = try_strncpy (filename , optarg , MAXFILENAMELEN , "Invalid bpf prog filename\nerr: %s" );
197
+ if (err < 0 )
198
+ return 1 ;
172
199
attach_ebpf = 1 ;
173
200
break ;
174
201
case 'd' :
175
202
detach = 1 ;
176
203
break ;
177
204
case 'i' :
178
- snprintf (ifname , sizeof (ifname ), "%s" , optarg );
205
+ script_len = try_strncpy (ifname , optarg , IFNAMSIZ , "Invalid interface name\nerr: %s" );
206
+ if (script_len < 0 )
207
+ return 1 ;
179
208
ifindex = if_nametoindex (optarg );
180
209
break ;
181
210
case 'm' :
182
211
monitor = 1 ;
183
212
break ;
184
- case 's' :
185
- snprintf (script , sizeof (script ), "%s" , optarg );
213
+ case 's' : {
214
+ err = try_strncpy (script , optarg , XDP_LUA_MAX_SCRIPT_LEN , "Invalid lua script\nerr: %s" );
215
+ if (err < 0 )
216
+ return 1 ;
186
217
attach_lua_script = 1 ;
187
218
break ;
219
+ }
188
220
case 'I' :
189
221
interval = atoi (optarg );
190
222
break ;
@@ -197,7 +229,6 @@ int main(int argc, char *argv[])
197
229
}
198
230
}
199
231
200
-
201
232
if (attach_ebpf || detach ) {
202
233
if (!ifindex ) {
203
234
printf ("ERROR: invalid interface name" );
@@ -234,20 +265,21 @@ int main(int argc, char *argv[])
234
265
}
235
266
236
267
if (attach_lua_file ) {
237
- char * extracted_script = extract_script (lua_filename );
268
+ int ret = 0 ;
269
+ size_t extracted_script_len ;
270
+ char * extracted_script = extract_script (lua_filename , & extracted_script_len );
238
271
if (!extracted_script )
239
272
return 1 ;
240
273
241
- if (do_attach_lua (extracted_script ) < 0 ) {
242
- free (extracted_script );
243
- return 1 ;
244
- }
274
+ if (do_attach_lua (extracted_script , extracted_script_len ) < 0 )
275
+ ret = 1 ;
245
276
246
277
free (extracted_script );
278
+ return ret ;
247
279
}
248
280
249
281
if (attach_lua_script )
250
- if (do_attach_lua (script ) < 0 )
282
+ if (do_attach_lua (script , script_len ) < 0 )
251
283
return 1 ;
252
284
253
285
if (monitor ) {
0 commit comments