#include #include #include #include "bar.h" extern void foo(unsigned int *); void bar(char *ptr) { if (((uintptr_t)ptr >> 56) != 0x1f) { fprintf(stderr, "Top byte corrupted on Rust -> C FFI boundary!\n"); exit(1); } } int main(void) { // Construct a pointer with an arbitrary tag in bits 56-59, simulating an MTE tag. // It's only necessary that the tag is preserved across FFI bounds for this test. unsigned int *ptr; ptr = alloc_page(); if (ptr == MAP_FAILED) { perror("mmap() failed"); return EXIT_FAILURE; } // Store an arbitrary tag in bits 56-59 of the pointer (where an MTE tag may be), // and a different value in the ignored top 4 bits. ptr = (unsigned int *)((uintptr_t)ptr | 0x1fl << 56); if (mte_enabled()) { set_tag(ptr); } ptr[0] = 61; ptr[1] = 62; foo(ptr); // should change the contents of the page to start with 0x63 0x64 and call `bar` if (ptr[0] != 0x63 || ptr[1] != 0x64) { fprintf(stderr, "invalid data in memory; expected '63 64', got '%d %d'\n", ptr[0], ptr[1]); return EXIT_FAILURE; } return 0; }