Skip to content

Commit 42e492d

Browse files
Mathias Svenssonpopcornmix
Mathias Svensson
authored andcommitted
samples/seccomp: fix 64-bit comparison macros
commit 916cafd upstream. There were some bugs in the JNE64 and JLT64 comparision macros. This fixes them, improves comments, and cleans up the file while we are at it. Reported-by: Stephen Röttger <[email protected]> Signed-off-by: Mathias Svensson <[email protected]> Signed-off-by: Kees Cook <[email protected]> Signed-off-by: James Morris <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent a213c79 commit 42e492d

File tree

1 file changed

+72
-53
lines changed

1 file changed

+72
-53
lines changed

samples/seccomp/bpf-helper.h

Lines changed: 72 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ union arg64 {
138138
#define ARG_32(idx) \
139139
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, LO_ARG(idx))
140140

141-
/* Loads hi into A and lo in X */
141+
/* Loads lo into M[0] and hi into M[1] and A */
142142
#define ARG_64(idx) \
143143
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, LO_ARG(idx)), \
144144
BPF_STMT(BPF_ST, 0), /* lo -> M[0] */ \
@@ -153,88 +153,107 @@ union arg64 {
153153
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (value), 1, 0), \
154154
jt
155155

156-
/* Checks the lo, then swaps to check the hi. A=lo,X=hi */
156+
#define JA32(value, jt) \
157+
BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (value), 0, 1), \
158+
jt
159+
160+
#define JGE32(value, jt) \
161+
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 0, 1), \
162+
jt
163+
164+
#define JGT32(value, jt) \
165+
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 0, 1), \
166+
jt
167+
168+
#define JLE32(value, jt) \
169+
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 1, 0), \
170+
jt
171+
172+
#define JLT32(value, jt) \
173+
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 1, 0), \
174+
jt
175+
176+
/*
177+
* All the JXX64 checks assume lo is saved in M[0] and hi is saved in both
178+
* A and M[1]. This invariant is kept by restoring A if necessary.
179+
*/
157180
#define JEQ64(lo, hi, jt) \
181+
/* if (hi != arg.hi) goto NOMATCH; */ \
158182
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
159183
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
184+
/* if (lo != arg.lo) goto NOMATCH; */ \
160185
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (lo), 0, 2), \
161-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
186+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
162187
jt, \
163-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
188+
BPF_STMT(BPF_LD+BPF_MEM, 1)
164189

165190
#define JNE64(lo, hi, jt) \
166-
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 5, 0), \
167-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
191+
/* if (hi != arg.hi) goto MATCH; */ \
192+
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 3), \
193+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
194+
/* if (lo != arg.lo) goto MATCH; */ \
168195
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (lo), 2, 0), \
169-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
196+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
170197
jt, \
171-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
172-
173-
#define JA32(value, jt) \
174-
BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (value), 0, 1), \
175-
jt
198+
BPF_STMT(BPF_LD+BPF_MEM, 1)
176199

177200
#define JA64(lo, hi, jt) \
201+
/* if (hi & arg.hi) goto MATCH; */ \
178202
BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (hi), 3, 0), \
179-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
203+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
204+
/* if (lo & arg.lo) goto MATCH; */ \
180205
BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (lo), 0, 2), \
181-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
206+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
182207
jt, \
183-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
208+
BPF_STMT(BPF_LD+BPF_MEM, 1)
184209

185-
#define JGE32(value, jt) \
186-
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 0, 1), \
187-
jt
188-
189-
#define JLT32(value, jt) \
190-
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 1, 0), \
191-
jt
192-
193-
/* Shortcut checking if hi > arg.hi. */
194210
#define JGE64(lo, hi, jt) \
211+
/* if (hi > arg.hi) goto MATCH; */ \
195212
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 4, 0), \
213+
/* if (hi != arg.hi) goto NOMATCH; */ \
196214
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
197-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
215+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
216+
/* if (lo >= arg.lo) goto MATCH; */ \
198217
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (lo), 0, 2), \
199-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
200-
jt, \
201-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
202-
203-
#define JLT64(lo, hi, jt) \
204-
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
205-
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
206-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
207-
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 2, 0), \
208-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
218+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
209219
jt, \
210-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
220+
BPF_STMT(BPF_LD+BPF_MEM, 1)
211221

212-
#define JGT32(value, jt) \
213-
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 0, 1), \
214-
jt
215-
216-
#define JLE32(value, jt) \
217-
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 1, 0), \
218-
jt
219-
220-
/* Check hi > args.hi first, then do the GE checking */
221222
#define JGT64(lo, hi, jt) \
223+
/* if (hi > arg.hi) goto MATCH; */ \
222224
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 4, 0), \
225+
/* if (hi != arg.hi) goto NOMATCH; */ \
223226
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
224-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
227+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
228+
/* if (lo > arg.lo) goto MATCH; */ \
225229
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 0, 2), \
226-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
230+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
227231
jt, \
228-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
232+
BPF_STMT(BPF_LD+BPF_MEM, 1)
229233

230234
#define JLE64(lo, hi, jt) \
231-
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 6, 0), \
232-
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 3), \
233-
BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
235+
/* if (hi < arg.hi) goto MATCH; */ \
236+
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
237+
/* if (hi != arg.hi) goto NOMATCH; */ \
238+
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
239+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
240+
/* if (lo <= arg.lo) goto MATCH; */ \
234241
BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 2, 0), \
235-
BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
242+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
243+
jt, \
244+
BPF_STMT(BPF_LD+BPF_MEM, 1)
245+
246+
#define JLT64(lo, hi, jt) \
247+
/* if (hi < arg.hi) goto MATCH; */ \
248+
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
249+
/* if (hi != arg.hi) goto NOMATCH; */ \
250+
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
251+
BPF_STMT(BPF_LD+BPF_MEM, 0), \
252+
/* if (lo < arg.lo) goto MATCH; */ \
253+
BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (lo), 2, 0), \
254+
BPF_STMT(BPF_LD+BPF_MEM, 1), \
236255
jt, \
237-
BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
256+
BPF_STMT(BPF_LD+BPF_MEM, 1)
238257

239258
#define LOAD_SYSCALL_NR \
240259
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \

0 commit comments

Comments
 (0)