Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mesos: FIX #18209 readdir_r deprecation in libc #18219

Merged
merged 1 commit into from
Sep 2, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions pkgs/applications/networking/cluster/mesos/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ in stdenv.mkDerivation rec {
patches = [
# https://reviews.apache.org/r/36610/
./rb36610.patch

# https://issues.apache.org/jira/browse/MESOS-6013
./rb51324.patch
./rb51325.patch

./maven_repo.patch
];

Expand Down
72 changes: 72 additions & 0 deletions pkgs/applications/networking/cluster/mesos/rb51324.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/ls.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/ls.hpp
index f8da9ef74a885cc39424b3e50cebca905d88ca44..25e2bec6415f2382291cf8da5c0a8c44cf882d27 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/ls.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/os/ls.hpp
@@ -18,6 +18,8 @@
#else
#include <dirent.h>
#endif // __WINDOWS__
+
+#include <errno.h>
#include <stdlib.h>

#include <list>
@@ -26,8 +28,6 @@
#include <stout/error.hpp>
#include <stout/try.hpp>

-#include <stout/os/direntsize.hpp>
-

namespace os {

@@ -36,36 +36,32 @@ inline Try<std::list<std::string>> ls(const std::string& directory)
DIR* dir = opendir(directory.c_str());

if (dir == NULL) {
- // Preserve `opendir` error.
return ErrnoError("Failed to opendir '" + directory + "'");
}

- dirent* temp = (dirent*) malloc(os::dirent_size(dir));
-
- if (temp == NULL) {
- // Preserve `malloc` error.
- ErrnoError error("Failed to allocate directory entries");
- closedir(dir);
- return error;
- }
-
std::list<std::string> result;
struct dirent* entry;
- int error;

- while ((error = readdir_r(dir, temp, &entry)) == 0 && entry != NULL) {
+ // Zero `errno` before starting to call `readdir`. This is necessary
+ // to allow us to determine when `readdir` returns an error.
+ errno = 0;
+
+ while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
result.push_back(entry->d_name);
}

- free(temp);
- closedir(dir);
+ if (errno != 0) {
+ // Preserve `readdir` error.
+ Error error = ErrnoError("Failed to read directory");
+ closedir(dir);
+ return error;
+ }

- if (error != 0) {
- // Preserve `readdir_r` error.
- return ErrnoError("Failed to read directories");
+ if (closedir(dir) == -1) {
+ return ErrnoError("Failed to close directory");
}

return result;
156 changes: 156 additions & 0 deletions pkgs/applications/networking/cluster/mesos/rb51325.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
diff -Naur a/3rdparty/libprocess/3rdparty/stout/include/Makefile.am b/3rdparty/libprocess/3rdparty/stout/include/Makefile.am
--- a/3rdparty/libprocess/3rdparty/stout/include/Makefile.am 2016-09-02 15:20:04.834457344 +0200
+++ b/3rdparty/libprocess/3rdparty/stout/include/Makefile.am 2016-09-02 15:21:00.190983981 +0200
@@ -62,7 +62,6 @@
stout/os/chroot.hpp \
stout/os/close.hpp \
stout/os/constants.hpp \
- stout/os/direntsize.hpp \
stout/os/environment.hpp \
stout/os/exists.hpp \
stout/os/fcntl.hpp \
@@ -101,7 +100,6 @@
stout/os/posix/bootid.hpp \
stout/os/posix/chown.hpp \
stout/os/posix/chroot.hpp \
- stout/os/posix/direntsize.hpp \
stout/os/posix/exists.hpp \
stout/os/posix/fcntl.hpp \
stout/os/posix/fork.hpp \
@@ -118,7 +116,6 @@
stout/os/raw/environment.hpp \
stout/os/windows/bootid.hpp \
stout/os/windows/chroot.hpp \
- stout/os/windows/direntsize.hpp \
stout/os/windows/exists.hpp \
stout/os/windows/fcntl.hpp \
stout/os/windows/fork.hpp \
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/direntsize.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/direntsize.hpp
deleted file mode 100644
index 819f99a89862491e99873bdedc603317b91266b0..0000000000000000000000000000000000000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/direntsize.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef __STOUT_OS_DIRENTSIZE_HPP__
-#define __STOUT_OS_DIRENTSIZE_HPP__
-
-
-// For readability, we minimize the number of #ifdef blocks in the code by
-// splitting platform specifc system calls into separate directories.
-#ifdef __WINDOWS__
-#include <stout/os/windows/direntsize.hpp>
-#else
-#include <stout/os/posix/direntsize.hpp>
-#endif // __WINDOWS__
-
-
-#endif // __STOUT_OS_DIRENTSIZE_HPP__
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp
deleted file mode 100644
index 9d8f72eb607a288e77f92b39b91542ff5eb2fa21..0000000000000000000000000000000000000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef __STOUT_OS_POSIX_DIRENTSIZE_HPP__
-#define __STOUT_OS_POSIX_DIRENTSIZE_HPP__
-
-#include <dirent.h>
-#include <unistd.h>
-
-
-namespace os {
-
-inline size_t dirent_size(DIR* dir)
-{
- // Calculate the size for a "directory entry".
- long name_max = fpathconf(dirfd(dir), _PC_NAME_MAX);
-
- // If we don't get a valid size, check NAME_MAX, but fall back on
- // 255 in the worst case ... Danger, Will Robinson!
- if (name_max == -1) {
- name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
- }
-
- size_t name_end = (size_t) offsetof(dirent, d_name) + name_max + 1;
-
- size_t size = (name_end > sizeof(dirent) ? name_end : sizeof(dirent));
-
- return size;
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_DIRENTSIZE_HPP__
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/windows/direntsize.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/windows/direntsize.hpp
deleted file mode 100644
index 7c8c7a06f478b3a80341a874494cff21f71fc397..0000000000000000000000000000000000000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/windows/direntsize.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef __STOUT_OS_WINDOWS_DIRENTSIZE_HPP__
-#define __STOUT_OS_WINDOWS_DIRENTSIZE_HPP__
-
-#include <stout/internal/windows/dirent.hpp>
-
-#include <stout/windows.hpp>
-
-
-namespace os {
-
-inline size_t dirent_size(DIR* dir)
-{
- // NOTE: Size calculation logic here is much simpler than on POSIX because
- // our implementation of `dirent` is constant-sized. In particular, on POSIX,
- // we usually have to calculate the maximum name size for a path before we
- // can alloc a correctly-size `dirent`, but on Windows, `dirent.d_name` is
- // always `MAX_PATH` bytes in size.
- //
- // This follows closely from the Windows standard API data structures for
- // manipulating and querying directories. For example, the structures
- // `WIN32_FIND_DATA`[1] (which in many ways is the Windows equivalent of
- // `dirent`) has a field `cFileName` (which is much like `d_name`) that is
- // also `MAX_PATH` in size.
- //
- // [1] https://msdn.microsoft.com/en-us/library/windows/desktop/aa365740(v=vs.85).aspx
- return sizeof(dirent);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_WINDOWS_DIRENTSIZE_HPP__