Пример #1
0
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;
}