Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c2819fc authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Addressing comments in 1130236.

Use Unicode versions of mktemp function.
Correctly handle unset TMP variable in tests.

Test: atest libbase_test
Change-Id: I5009962d33b224c4d5f39102e03daeb0837f1525
parent c63ef7fc
Loading
Loading
Loading
Loading
+28 −15
Original line number Diff line number Diff line
@@ -53,34 +53,47 @@ namespace {

#ifdef _WIN32
static int mkstemp(char* name_template, size_t size_in_chars) {
  auto path = name_template;
  if (_mktemp_s(path, size_in_chars) != 0) {
  std::wstring path;
  CHECK(android::base::UTF8ToWide(name_template, &path))
      << "path can't be converted to wchar: " << name_template;
  if (_wmktemp_s(path.data(), path.size() + 1) != 0) {
    return -1;
  }

  std::wstring path_wide;
  CHECK(android::base::UTF8ToWide(path, &path_wide))
      << "path can't be converted to wchar: " << path;

  // Use open() to match the close() that TemporaryFile's destructor does.
  // Use O_BINARY to match base file APIs.
  return _wopen(path_wide.c_str(), O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR);
  int fd = _wopen(path.c_str(), O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR);
  if (fd < 0) {
    return -1;
  }

  std::string path_utf8;
  CHECK(android::base::WideToUTF8(path, &path_utf8)) << "path can't be converted to utf8";
  CHECK(strcpy_s(name_template, size_in_chars, path_utf8.c_str()) == 0)
      << "utf8 path can't be assigned back to name_template";

  return fd;
}

static char* mkdtemp(char* name_template, size_t size_in_chars) {
  auto path = name_template;
  if (_mktemp_s(path, size_in_chars) != 0) {
  std::wstring path;
  CHECK(android::base::UTF8ToWide(name_template, &path))
      << "path can't be converted to wchar: " << name_template;

  if (_wmktemp_s(path.data(), path.size() + 1) != 0) {
    return nullptr;
  }

  std::wstring path_wide;
  CHECK(android::base::UTF8ToWide(path, &path_wide))
      << "path can't be converted to wchar: " << path;

  if (_wmkdir(path_wide.c_str()) != 0) {
  if (_wmkdir(path.c_str()) != 0) {
    return nullptr;
  }
  return path;

  std::string path_utf8;
  CHECK(android::base::WideToUTF8(path, &path_utf8)) << "path can't be converted to utf8";
  CHECK(strcpy_s(name_template, size_in_chars, path_utf8.c_str()) == 0)
      << "utf8 path can't be assigned back to name_template";

  return name_template;
}
#endif

+11 −2
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#if !defined(_WIN32)
#include <pwd.h>
#else
#include <processenv.h>
#include <windows.h>
#endif

#include "android-base/logging.h"  // and must be after windows.h for ERROR
@@ -99,6 +99,11 @@ TEST(file, NonUnicodeCharsWindows) {
  std::wstring old_tmp;
  old_tmp.resize(kMaxEnvVariableValueSize);
  old_tmp.resize(GetEnvironmentVariableW(L"TMP", old_tmp.data(), old_tmp.size()));
  if (old_tmp.empty()) {
    // Can't continue with empty TMP folder.
    return;
  }

  std::wstring new_tmp = old_tmp;
  if (new_tmp.back() != L'\\') {
    new_tmp.push_back(L'\\');
@@ -156,14 +161,18 @@ TEST(file, NonUnicodeCharsWindows) {
TEST(file, RootDirectoryWindows) {
  constexpr auto kMaxEnvVariableValueSize = 32767;
  std::wstring old_tmp;
  bool tmp_is_empty = false;
  old_tmp.resize(kMaxEnvVariableValueSize);
  old_tmp.resize(GetEnvironmentVariableW(L"TMP", old_tmp.data(), old_tmp.size()));
  if (old_tmp.empty()) {
    tmp_is_empty = (GetLastError() == ERROR_ENVVAR_NOT_FOUND);
  }
  SetEnvironmentVariableW(L"TMP", L"C:");

  TemporaryFile tf;
  ASSERT_NE(tf.fd, -1) << tf.path;

  SetEnvironmentVariableW(L"TMP", old_tmp.c_str());
  SetEnvironmentVariableW(L"TMP", tmp_is_empty ? nullptr : old_tmp.c_str());
}
#endif