void test_fail_on_load_to_data_area() { uint8_t *data; int rc; fill_hlts(block_in_data_segment, sizeof(block_in_data_segment)); /* Align to 32 byte boundary so that we don't fail for a reason we're not testing for. */ data = block_in_data_segment; while (((int) data) % 32 != 0) data++; rc = nacl_load_code(data, data, 32); assert(rc == -EFAULT); }
void test_hlt_filled_bundle() { uint8_t bad_code[NUM_BUNDLES_FOR_HLT * NACL_BUNDLE_SIZE]; void *load_area; int ix; for (ix = 0; ix < NUM_BUNDLES_FOR_HLT; ++ix) { fill_nops(bad_code, sizeof bad_code); fill_hlts(bad_code + ix * NACL_BUNDLE_SIZE, NACL_BUNDLE_SIZE); load_area = allocate_code_space(1); /* hlts are now allowed */ assert(0 == nacl_load_code(load_area, bad_code, sizeof bad_code)); /* but not twice... */ assert(0 != nacl_load_code(load_area, bad_code, sizeof bad_code)); } }
void test_fail_on_load_to_data_area(void) { uint8_t *data; int rc; fill_hlts(block_in_data_segment, sizeof(block_in_data_segment)); /* * Align to bundle size so that we don't fail for a reason we're not * testing for. */ data = block_in_data_segment; while (((int) data) % NACL_BUNDLE_SIZE != 0) data++; rc = nacl_load_code(data, data, NACL_BUNDLE_SIZE); assert(rc == -EFAULT); }
void test_deleting_code_from_invalid_ranges(void) { uint8_t *load_addr = (uint8_t *) allocate_code_space(1) + 32; uint8_t buf[64]; int rc; /* We specifically want to test using multiple instruction bundles. */ assert(sizeof(buf) / NACL_BUNDLE_SIZE >= 2); assert(sizeof(buf) % NACL_BUNDLE_SIZE == 0); rc = dyncode_delete_with_retry(load_addr, sizeof(buf)); assert(rc == -1); assert(errno == EFAULT); fill_hlts(buf, sizeof(buf)); rc = nacl_dyncode_create(load_addr, buf, sizeof(buf)); assert(rc == 0); /* Overlapping before. */ rc = nacl_dyncode_delete(load_addr - NACL_BUNDLE_SIZE, sizeof(buf) + NACL_BUNDLE_SIZE); assert(rc == -1); assert(errno == EFAULT); /* Overlapping after. */ rc = nacl_dyncode_delete(load_addr, sizeof(buf) + NACL_BUNDLE_SIZE); assert(rc == -1); assert(errno == EFAULT); /* Missing the end of the loaded chunk. */ rc = nacl_dyncode_delete(load_addr, sizeof(buf) - NACL_BUNDLE_SIZE); assert(rc == -1); assert(errno == EFAULT); /* Missing the start of the loaded chunk. */ rc = nacl_dyncode_delete(load_addr + NACL_BUNDLE_SIZE, sizeof(buf) - NACL_BUNDLE_SIZE); assert(rc == -1); assert(errno == EFAULT); /* The correct range should work, though. */ rc = nacl_dyncode_delete(load_addr, sizeof(buf)); assert(rc == 0); }