#include <assert.h>
#include <errno.h>
+#include <fcntl.h>
#include <math.h>
#include <netdb.h>
#include <netinet/in.h>
has_metacube_header(serialized.has_metacube_header()),
sock(serialized.sock())
{
+ // Set back the close-on-exec flag for the socket.
+ // (This can't leak into a child, since we haven't been started yet.)
+ fcntl(sock, F_SETFD, 1);
+
pending_data.resize(serialized.pending_data().size());
memcpy(&pending_data[0], serialized.pending_data().data(), serialized.pending_data().size());
InputProto HTTPInput::serialize() const
{
+ // Unset the close-on-exec flag for the socket.
+ // (This can't leak into a child, since there's only one thread left.)
+ fcntl(sock, F_SETFD, 0);
+
InputProto serialized;
serialized.set_state(state);
serialized.set_url(url);
for ( ; ai && !should_stop(); ai = ai->ai_next) {
// Now do a non-blocking connect. This is important because we want to be able to be
// woken up, even though it's rather cumbersome.
- int sock = socket(ai->ai_family, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
+ int sock = socket(ai->ai_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP);
if (sock == -1) {
// Could be e.g. EPROTONOSUPPORT. The show must go on.
continue;