| /* 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; |
| } |
| |