// one returned previously, even if that one is not closed yet. So,
// we just re-number every one we get, so they are unique.
int new_fd(dup(fd));
- int close_error(close(fd));
+ // Only call close() if the descriptor is valid. Otherwise return
+ // an error.
+ int close_error(fd >=0 ? close(fd) : -1);
if (close_error == -1 || new_fd == -1) {
// 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.
TEST(MemorySegmentLocal, TestTooMuchMemory) {
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) {