]> git.sesse.net Git - cubemap/blobdiff - client.cpp
Fix various close-on-exec bugs.
[cubemap] / client.cpp
index 2552c6951067b4c99ebc192ad24ccb6a08fd9260..5d5c179be0e6df019930fb2924cf22be2e7bcab1 100644 (file)
@@ -1,8 +1,10 @@
 #include <stdio.h>
 #include <arpa/inet.h>
+#include <fcntl.h>
 #include <netinet/in.h>
 #include <stdint.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "client.h"
 #include "log.h"
@@ -68,6 +70,10 @@ Client::Client(const ClientProto &serialized, const vector<shared_ptr<const stri
          bytes_lost(serialized.bytes_lost()),
          num_loss_events(serialized.num_loss_events())
 {
+       // 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, O_CLOEXEC);
+
        if (stream != nullptr) {
                if (setsockopt(sock, SOL_SOCKET, SO_MAX_PACING_RATE, &stream->pacing_rate, sizeof(stream->pacing_rate)) == -1) {
                        if (stream->pacing_rate != ~0U) {
@@ -115,6 +121,10 @@ Client::Client(const ClientProto &serialized, const vector<shared_ptr<const stri
 
 ClientProto Client::serialize(unordered_map<const string *, size_t> *short_response_pool) 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);
+
        ClientProto serialized;
        serialized.set_sock(sock);
        serialized.set_remote_addr(remote_addr);
@@ -134,7 +144,7 @@ ClientProto Client::serialize(unordered_map<const string *, size_t> *short_respo
                serialized.set_header_or_short_response_index(iterator_and_inserted.first->second);
        }
 
-       serialized.set_header_or_short_response_bytes_sent(serialized.header_or_short_response_bytes_sent());
+       serialized.set_header_or_short_response_bytes_sent(header_or_short_response_bytes_sent);
        serialized.set_stream_pos(stream_pos);
        serialized.set_stream_pos_end(stream_pos_end);
        serialized.set_bytes_sent(bytes_sent);