You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by an...@apache.org on 2018/05/02 01:38:21 UTC
[21/31] mesos git commit: Windows: Made `net::download()` use CRT
file descriptor explicitly.
Windows: Made `net::download()` use CRT file descriptor explicitly.
This is an edge case where a third-party library (libcurl) requires a
CRT integer file descriptor. Thus we explicitly allocate one via
`crt()`, which requires that we also manually close it via `_close()`,
not `os::close()`.
Review: https://reviews.apache.org/r/66433
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b061fb14
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b061fb14
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b061fb14
Branch: refs/heads/master
Commit: b061fb14638f306491d16cc79442ca5bc46bbde6
Parents: d0b055b
Author: Andrew Schwartzmeyer <an...@schwartzmeyer.com>
Authored: Tue Apr 3 22:33:39 2018 -0700
Committer: Andrew Schwartzmeyer <an...@schwartzmeyer.com>
Committed: Tue May 1 18:36:04 2018 -0700
----------------------------------------------------------------------
3rdparty/stout/include/stout/net.hpp | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/b061fb14/3rdparty/stout/include/stout/net.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/include/stout/net.hpp b/3rdparty/stout/include/stout/net.hpp
index 52fa09b..10666ed 100644
--- a/3rdparty/stout/include/stout/net.hpp
+++ b/3rdparty/stout/include/stout/net.hpp
@@ -167,19 +167,32 @@ inline Try<int> download(
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, nullptr);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
- // We don't bother introducing a `os::fdopen` since this is the only place
- // we use `fdopen` in the entire codebase as of writing this comment.
+ // We don't bother introducing a `os::fdopen()` since this is the
+ // only place we use `fdopen()` in the entire codebase as of writing
+ // this comment.
#ifdef __WINDOWS__
+ // This explicitly allocates a CRT integer file descriptor, which
+ // when closed, also closes the underlying handle, so we do not call
+ // `CloseHandle()` (or `os::close()`).
+ const int crt = fd->crt();
// We open in "binary" mode on Windows to avoid line-ending translation.
- FILE* file = ::_fdopen(fd->crt(), "wb");
+ FILE* file = ::_fdopen(crt, "wb");
+ if (file == nullptr) {
+ curl_easy_cleanup(curl);
+ // NOTE: This is not `os::close()` because we allocated a CRT int
+ // fd earlier.
+ ::_close(crt);
+ return ErrnoError("Failed to open file handle of '" + path + "'");
+ }
#else
FILE* file = ::fdopen(fd.get(), "w");
-#endif
if (file == nullptr) {
curl_easy_cleanup(curl);
os::close(fd.get());
return ErrnoError("Failed to open file handle of '" + path + "'");
}
+#endif // __WINDOWS__
+
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
if (stall_timeout.isSome()) {
@@ -195,7 +208,9 @@ inline Try<int> download(
CURLcode curlErrorCode = curl_easy_perform(curl);
if (curlErrorCode != 0) {
curl_easy_cleanup(curl);
- fclose(file);
+ // NOTE: `fclose()` also closes the associated file descriptor, so
+ // we do not call `close()`.
+ ::fclose(file);
return Error(curl_easy_strerror(curlErrorCode));
}
@@ -203,7 +218,7 @@ inline Try<int> download(
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
curl_easy_cleanup(curl);
- if (fclose(file) != 0) {
+ if (::fclose(file) != 0) {
return ErrnoError("Failed to close file handle of '" + path + "'");
}