Bazel client, Windows: fix ReadFile("/dev/null")

Mimic read(2) behavior when reading from /dev/null
and always successfully read 0 bytes.

See https://github.com/bazelbuild/bazel/issues/2107

--
PiperOrigin-RevId: 149286494
MOS_MIGRATED_REVID=149286494
diff --git a/src/main/cpp/util/file_windows.cc b/src/main/cpp/util/file_windows.cc
index 35d8242..145d5da 100644
--- a/src/main/cpp/util/file_windows.cc
+++ b/src/main/cpp/util/file_windows.cc
@@ -599,6 +599,11 @@
 }
 
 bool ReadFile(const string& filename, string* content, int max_size) {
+  if (IsDevNull(filename)) {
+    // mimic read(2) behavior: we can always read 0 bytes from /dev/null
+    content->clear();
+    return true;
+  }
   HANDLE handle;
   if (!OpenFileForReading(filename, &handle)) {
     return false;
@@ -613,6 +618,10 @@
 }
 
 bool ReadFile(const string& filename, void* data, size_t size) {
+  if (IsDevNull(filename)) {
+    // mimic read(2) behavior: we can always read 0 bytes from /dev/null
+    return true;
+  }
   HANDLE handle;
   if (!OpenFileForReading(filename, &handle)) {
     return false;
diff --git a/src/test/cpp/util/file_test.cc b/src/test/cpp/util/file_test.cc
index c941619..ab943a7 100644
--- a/src/test/cpp/util/file_test.cc
+++ b/src/test/cpp/util/file_test.cc
@@ -105,9 +105,9 @@
   ASSERT_TRUE(ReadFile(filename, buffer, 30));
   ASSERT_EQ(string("hello world"), string(buffer));
 
-  memset(buffer, 0, 30);
+  buffer[0] = 'x';
   ASSERT_TRUE(ReadFile("/dev/null", buffer, 42));
-  ASSERT_EQ(string(""), string(buffer));
+  ASSERT_EQ('x', buffer[0]);
 }
 
 TEST(FileTest, TestWriteFile) {