]> git.g-eek.se Git - interimap.git/commitdiff
Ensure the FD_CLOEXEC bit is 1 on sockets, logger and state files.
authorGuilhem Moulin <guilhem@fripost.org>
Sat, 5 Mar 2016 18:49:08 +0000 (19:49 +0100)
committerGuilhem Moulin <guilhem@fripost.org>
Sat, 5 Mar 2016 18:49:08 +0000 (19:49 +0100)
interimap
lib/Net/IMAP/InterIMAP.pm
pullimap

index b377d4e5988de15e91404ad95903a32662d3e1c2..76174ee80345efded6e5c9dfaccc6120ca9809f3 100755 (executable)
--- a/interimap
+++ b/interimap
@@ -26,6 +26,7 @@ my $NAME = 'interimap';
 use Getopt::Long qw/:config posix_default no_ignore_case gnu_compat
                             bundling auto_version/;
 use DBI ();
+use Fcntl qw/F_GETFL F_SETFL FD_CLOEXEC/;
 use List::Util 'first';
 
 use lib 'lib';
@@ -101,6 +102,8 @@ my ($DBFILE, $LOCKFILE, $LOGGER_FD);
         open $LOGGER_FD, '>>', $CONF->{_}->{logfile}
             or die "Can't open $CONF->{_}->{logfile}: $!\n";
         $LOGGER_FD->autoflush(1);
+        my $flags = fcntl($LOGGER_FD, F_GETFL, 0)       or die "fcntl F_GETFL: $!";
+        fcntl($LOGGER_FD, F_SETFL, $flags | FD_CLOEXEC) or die "fcntl F_SETFL: $!";
     }
     elsif ($CONFIG{debug}) {
         $LOGGER_FD = \*STDERR;
index 289890553a08f5dec4798bdfe20054f2f9bf1009..40f41938e7c7e8c30eef5cab522e4422a93cd678 100644 (file)
@@ -23,6 +23,7 @@ use strict;
 use Compress::Raw::Zlib qw/Z_OK Z_FULL_FLUSH Z_SYNC_FLUSH MAX_WBITS/;
 use Config::Tiny ();
 use Errno 'EINTR';
+use Fcntl qw/F_GETFL F_SETFL FD_CLOEXEC/;
 use Net::SSLeay ();
 use List::Util qw/all first/;
 use POSIX ':signal_h';
@@ -1354,7 +1355,13 @@ sub _tcp_connect($$$) {
 
     foreach my $ai (@res) {
         socket my $s, $ai->{family}, $ai->{socktype}, $ai->{protocol};
-        return $s if defined $s and connect($s, $ai->{addr});
+        # TODO: add a connection timeout
+        # http://devpit.org/wiki/Connect%28%29_with_timeout_%28in_Perl%29
+        if (defined $s and connect($s, $ai->{addr})) {
+            my $flags = fcntl($s, F_GETFL, 0)       or $self->panic("fcntl F_GETFL: $!");
+            fcntl($s, F_SETFL, $flags | FD_CLOEXEC) or $self->panic("fcntl F_SETFL: $!");
+            return $s;
+        }
     }
     $self->fail("Can't connect to $host:$port");
 }
index 40f7f6f13529e2401b3fcccc53add7f6903b5aa4..12b2568ca648f87dc6360d08f0712fce3e6105a4 100755 (executable)
--- a/pullimap
+++ b/pullimap
@@ -25,7 +25,7 @@ our $VERSION = '0.3';
 my $NAME = 'pullimap';
 
 use Errno 'EINTR';
-use Fcntl qw/O_CREAT O_RDWR O_DSYNC LOCK_EX SEEK_SET/;
+use Fcntl qw/O_CREAT O_RDWR O_DSYNC LOCK_EX SEEK_SET F_GETFL F_SETFL FD_CLOEXEC/;
 use Getopt::Long qw/:config posix_default no_ignore_case gnu_getopt auto_version/;
 use List::Util 'first';
 use Socket qw/PF_INET PF_INET6 SOCK_STREAM/;
@@ -82,6 +82,9 @@ do {
     }
 
     sysopen($STATE, $statefile, O_CREAT|O_RDWR|O_DSYNC, 0600) or die "Can't open $statefile: $!";
+    my $flags = fcntl($STATE, F_GETFL, 0)       or die "fcntl F_GETFL: $!";
+    fcntl($STATE, F_SETFL, $flags | FD_CLOEXEC) or die "fcntl F_SETFL: $!";
+
     flock($STATE, LOCK_EX) or die "Can't flock $statefile: $!";
 
 
@@ -90,6 +93,8 @@ do {
         require 'Time/HiRes.pm';
         open $LOGGER_FD, '>>', $logfile or die "Can't open $logfile: $!\n";
         $LOGGER_FD->autoflush(1);
+        my $flags = fcntl($LOGGER_FD, F_GETFL, 0)       or die "fcntl F_GETFL: $!";
+        fcntl($LOGGER_FD, F_SETFL, $flags | FD_CLOEXEC) or die "fcntl F_SETFL: $!";
     }
     elsif ($CONFIG{debug}) {
         $LOGGER_FD = \*STDERR;
@@ -253,7 +258,7 @@ sub pull(;$) {
         writeUID($uid);
     }, @$ignore);
 
-    # terminate the transmission channel gracefully, cf RFC 5321 section 4.5.3.2
+    # terminate the SMTP transmission channel gracefully, cf RFC 5321 section 4.5.3.2
     smtp_send('QUIT' => '221') if defined $SMTP;
     undef $SMTP;