Commit 003533bf authored by Marcin Siodelski's avatar Marcin Siodelski

[master] Merge branch 'trac3461'

parents f4c16c57 769cac66
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2010, 2014 Internet Systems Consortium, Inc. ("ISC")
// //
// Permission to use, copy, modify, and/or distribute this software for any // Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above // purpose with or without fee is hereby granted, provided that the above
...@@ -107,11 +107,15 @@ recv_fd(const int sock) { ...@@ -107,11 +107,15 @@ recv_fd(const int sock) {
std::memcpy(&fd, CMSG_DATA(cmsg), sizeof(int)); std::memcpy(&fd, CMSG_DATA(cmsg), sizeof(int));
} }
free(msghdr.msg_control); free(msghdr.msg_control);
// It is strange, but the call can return the same file descriptor as int new_fd = -1;
// one returned previously, even if that one is not closed yet. So, int close_error = -1;
// we just re-number every one we get, so they are unique. if (fd >= 0) {
int new_fd(dup(fd)); // It is strange, but the call can return the same file descriptor as
int close_error(close(fd)); // one returned previously, even if that one is not closed yet. So,
// we just re-number every one we get, so they are unique.
new_fd = dup(fd);
close_error = close(fd);
}
if (close_error == -1 || new_fd == -1) { if (close_error == -1 || new_fd == -1) {
// We need to return an error, because something failed. But in case // We need to return an error, because something failed. But in case
// it was the previous close, we at least try to close the duped FD. // it was the previous close, we at least try to close the duped FD.
......
...@@ -59,7 +59,12 @@ TEST(MemorySegmentLocal, TestLocal) { ...@@ -59,7 +59,12 @@ TEST(MemorySegmentLocal, TestLocal) {
TEST(MemorySegmentLocal, TestTooMuchMemory) { TEST(MemorySegmentLocal, TestTooMuchMemory) {
auto_ptr<MemorySegment> segment(new MemorySegmentLocal()); auto_ptr<MemorySegment> segment(new MemorySegmentLocal());
EXPECT_THROW(segment->allocate(ULONG_MAX), bad_alloc); // Although it should be perfectly fine to use the ULONG_MAX
// instead of LONG_MAX as the size_t value should be unsigned,
// Valgrind appears to be using the signed value and hence the
// maximum positive value is LONG_MAX for Valgrind. But, this
// should be sufficient to test the "too much memory" conditions.
EXPECT_THROW(segment->allocate(LONG_MAX), bad_alloc);
} }
TEST(MemorySegmentLocal, TestBadDeallocate) { TEST(MemorySegmentLocal, TestBadDeallocate) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment