diff options
-rw-r--r-- | gluten.h | 9 | ||||
-rw-r--r-- | operations.c | 6 |
2 files changed, 15 insertions, 0 deletions
@@ -52,6 +52,7 @@ enum op_type { OP_RETURN, OP_COPY_ARGS, OP_END, + OP_CMP, }; enum value_type { @@ -106,6 +107,13 @@ struct op_copy_args { struct copy_arg args[6]; }; +struct op_cmp { + uint16_t s1_off; + uint16_t s2_off; + size_t size; + unsigned int jmp; +}; + struct op { enum op_type type; union { @@ -115,6 +123,7 @@ struct op { struct op_return ret; struct op_inject inj; struct op_copy_args copy; + struct op_cmp cmp; }; }; #endif /* GLUTEN_H */ diff --git a/operations.c b/operations.c index 8cd0828..afc4b00 100644 --- a/operations.c +++ b/operations.c @@ -313,6 +313,12 @@ int do_operations(void *data, struct op operations[], struct seccomp_notif *req, break; case OP_END: return 0; + case OP_CMP: + if (memcmp((uint16_t *)data + operations[i].cmp.s1_off, + (uint16_t *)data + operations[i].cmp.s2_off, + operations[i].cmp.size) != 0) { + i = operations[i].cmp.jmp; + } break; default: fprintf(stderr, "unknow operation %d \n", |