/* Scalar test for new labelsys syscall subcodes TSOL_GETCLEARANCE and TSOL_SETCLEARANCE available on Solaris 11. */ #include "scalar.h" #include <sys/syscall.h> #include <sys/tsol/tsyscall.h> #include <tsol/label.h> __attribute__((noinline)) static void sys_labelsys(void) { GO(SYS_labelsys, "(TSOL_GETCLEARANCE) 2s 1m"); SY(SYS_labelsys, x0 + TSOL_GETCLEARANCE, x0 + 1); FAIL; } __attribute__((noinline)) static void sys_labelsys2(void) { m_label_t *label = m_label_alloc(USER_CLEAR); if (label == NULL) { perror("m_label_alloc"); return; } GO(SYS_labelsys, "(TSOL_GETCLEARANCE) 1s 0m"); SY(SYS_labelsys, x0 + TSOL_GETCLEARANCE, label); SUCC; m_label_free(label); } __attribute__((noinline)) static void sys_labelsys3(void) { GO(SYS_labelsys, "(TSOL_SETCLEARANCE) 2s 1m"); SY(SYS_labelsys, x0 + TSOL_SETCLEARANCE, x0 + 1); FAIL; } __attribute__((noinline)) static void sys_labelsys4(void) { m_label_t *label = m_label_alloc(USER_CLEAR); if (label == NULL) { perror("m_label_alloc"); return; } int ret = getclearance(label); if (ret != 0) { perror("getclearance"); m_label_free(label); return; } GO(SYS_labelsys, "(TSOL_SETCLEARANCE) 1s 0m"); SY(SYS_labelsys, x0 + TSOL_SETCLEARANCE, label); SUCC; m_label_free(label); } int main(void) { /* Uninitialised, but we know px[0] is 0x0. */ long *px = malloc(sizeof(long)); x0 = px[0]; /* SYS_labelsys 52 */ sys_labelsys(); sys_labelsys2(); sys_labelsys3(); sys_labelsys4(); return 0; }