static ssize_t NaClDescIoDescPWrite(struct NaClDesc *vself, void const *buf, size_t len, nacl_off64_t offset) { struct NaClDescIoDesc *self = (struct NaClDescIoDesc *) vself; return NaClHostDescPWrite(self->hd, buf, len, offset); }
int PWriteUsesOffsetPReadVerification(struct NaClHostDesc *test_file, struct NaClHostDesc *ro_view, void const *test_params) { size_t len = strlen(another_quote); char buffer[4096]; ssize_t io_rv; UNREFERENCED_PARAMETER(test_params); CHECK(len <= sizeof buffer); io_rv = NaClHostDescPWrite(test_file, another_quote, len, GG_LONGLONG(0)); if (io_rv < 0) { fprintf(stderr, "PWriteUsesOffsetPReadVerification:" " pwrite (ostensibly to beginning) failed," " errno %d\n", -(int) io_rv); return 0; } if ((size_t) io_rv != len) { fprintf(stderr, "PWriteUsesOffsetPReadVerification:" " pwrite short write, expected %"NACL_PRIuS ", got %"NACL_PRIuS"\n", len, (size_t) io_rv); return 0; } CHECK(len <= sizeof buffer); io_rv = NaClHostDescPRead(ro_view, buffer, len, GG_LONGLONG(0)); if (io_rv < 0) { fprintf(stderr, "PWriteUsesOffsetPReadVerification:" " NaClHostPDescRead failed, errno %d\n", -(int) io_rv); return 0; } if ((size_t) io_rv != len) { fprintf(stderr, "PWriteUsesOffsetPReadVerification:" " short read, expected %"NACL_PRIuS ", got %"NACL_PRIuS"\n", len, (size_t) io_rv); return 0; } if (0 != memcmp(buffer, another_quote, len)) { fprintf(stderr, "PWriteUsesOffsetPReadVerification:" " data at end differs\n" " Expected: %.*s\n" " Got: %.*s\n", (int) len, another_quote, (int) len, buffer); return 0; } return 1; }
int PWriteUsesOffsetReadPtrVerification(struct NaClHostDesc *test_file, struct NaClHostDesc *ro_view, void const *test_params) { nacl_off64_t seek_err; char buffer[512]; ssize_t io_rv; const size_t pwrite_position = 4096; UNREFERENCED_PARAMETER(test_params); seek_err = NaClHostDescSeek(test_file, 0, 0); if (seek_err < 0) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: seek failed, errno %d\n", -(int) seek_err); return 0; } io_rv = NaClHostDescRead(test_file, buffer, sizeof buffer); if (sizeof buffer != io_rv) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: read failed, got %d," " expected %d", (int) io_rv, (int) sizeof buffer); return 0; } if (0 != memcmp(buffer, quote, sizeof buffer)) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: initial bytes mangled?!?\n"); return 0; } io_rv = NaClHostDescPWrite(test_file, another_quote, sizeof another_quote - 1, pwrite_position); if (io_rv != sizeof another_quote - 1) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: pwrite failed\n"); return 0; } io_rv = NaClHostDescRead(test_file, buffer, sizeof buffer); if (sizeof buffer != io_rv) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification:" " 2nd implicit file ptr read failed, got %d," " expected %d\n", (int) io_rv, (int) sizeof buffer); return 0; } if (0 != memcmp(buffer, quote + sizeof buffer, sizeof buffer)) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: 2nd read contents mangled\n" "Expected:\n" "%.*s\n" "Got:\n" "%.*s\n", (int) sizeof buffer, quote + sizeof buffer, (int) sizeof buffer, buffer); return 0; } io_rv = NaClHostDescPRead(ro_view, buffer, sizeof buffer, pwrite_position); if (io_rv != sizeof buffer) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: verification pread failed," " got %d, expected %d", (int) io_rv, (int) sizeof buffer); return 0; } if (0 != memcmp(buffer, another_quote, sizeof buffer)) { fprintf(stderr, "PWriteUsesOffsetReadPtrVerification: verification content bad\n" "Got:\n" "%.*s\n" "Expected:\n" "%.*s\n", (int) sizeof buffer, buffer, (int) sizeof buffer, another_quote); return 0; } return 1; }
int BasicPermChecks(struct NaClHostDesc *test_file, struct NaClHostDesc *ro_view, void const *test_params) { struct BasicPermChecksParams const *params = (struct BasicPermChecksParams const *) test_params; char buffer[1<<16]; ssize_t result; nacl_off64_t seek_result; size_t len; CHECK(params->seq_read_bytes1 <= sizeof buffer); CHECK(params->seq_read_bytes2 <= sizeof buffer); seek_result = NaClHostDescSeek(test_file, 0, 0); ASSERT_EQ(0, seek_result); /* * Some tests skip the initial read. */ if (0 != params->seq_read_bytes1) { memset(buffer, 0, sizeof buffer); CHECK(params->seq_read_bytes1 <= sizeof buffer); result = NaClHostDescRead(test_file, buffer, params->seq_read_bytes1); if (result != (ssize_t) params->seq_read_bytes1) { fprintf(stderr, "BasicPermChecks: first sequential read, got %"NACL_PRIdS ", expected %"NACL_PRIuS" bytes\n", result, params->seq_read_bytes1); return 0; } if (0 != memcmp(quote, buffer, params->seq_read_bytes1)) { fprintf(stderr, "BasicPermChecks: first sequential read result differs\n"); fprintf(stderr, "got: %.*s\n", (int) params->seq_read_bytes1, buffer); return 0; } } len = strlen(params->expected_pread_data); memset(buffer, 0, sizeof buffer); CHECK(len <= sizeof buffer); result = NaClHostDescPRead(test_file, buffer, len, params->pread_offset); if (result != (ssize_t) params->expected_pread_result) { fprintf(stderr, "BasicPermChecks: pread failed, got %"NACL_PRIdS", expected %" NACL_PRIuS" bytes\n", result, params->expected_pread_result); return 0; } if (params->expected_pread_result > 0 && 0 != memcmp(params->expected_pread_data, buffer, len)) { fprintf(stderr, "BasicPermChecks: pread result: %.*s\n" " expected output: %.*s\n", (int) len, buffer, (int) len, quote + params->pread_offset); return 0; } if (0 != params->seq_read_bytes2) { /* * Make sure that the read pointer did not change. */ memset(buffer, 0, sizeof buffer); CHECK(params->seq_read_bytes2 <= sizeof buffer); result = NaClHostDescRead(test_file, buffer, params->seq_read_bytes2); if (result != (ssize_t) params->seq_read_bytes2) { fprintf(stderr, "BasicPermChecks: second sequential read, got %"NACL_PRIdS ", expected %"NACL_PRIuS" bytes\n", result, params->seq_read_bytes2); return 0; } if (0 != memcmp(quote + params->seq_read_bytes1, buffer, params->seq_read_bytes2)) { fprintf(stderr, "BasicPermChecks: second sequential read result differs\n"); fprintf(stderr, "got: %.*s\n", (int) params->seq_read_bytes1, buffer); return 0; } } /* * Now try to write. */ if (NULL != params->pwrite_data) { len = strlen(params->pwrite_data); result = NaClHostDescPWrite(test_file, params->pwrite_data, len, params->pwrite_offset); if (result != params->expected_pwrite_result) { fprintf(stderr, "BasicPermChecks: pwrite failed, got %"NACL_PRIdS ", expected %"NACL_PRIdS"\n", result, params->expected_pwrite_result); return 0; } if (result == (ssize_t) len) { /* re-read by seek/sequential read and check data, using ro_view */ seek_result = NaClHostDescSeek(ro_view, params->pwrite_offset, 0); ASSERT_EQ(params->pwrite_offset, seek_result); memset(buffer, 0, sizeof buffer); CHECK(len <= sizeof buffer); result = NaClHostDescRead(ro_view, buffer, len); if (result != (ssize_t) len) { fprintf(stderr, "BasicPermChecks: pwrite verification read failed\n"); fprintf(stderr, " got %"NACL_PRIdS", expected %"NACL_PRIuS"\n", result, len); return 0; } if (0 != memcmp(buffer, params->pwrite_data, len)) { fprintf(stderr, "BasicPermChecks: pwrite verification data mismatch\n"); fprintf(stderr, " got %.*s\n" "expected %.*s\n", (int) len, buffer, (int) len, params->pwrite_data); return 0; } } } return 1; }