public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ben Greear <greearb@candelatech.com>
To: linux-kernel <linux-kernel@vger.kernel.org>
Subject: close-exec flag not working in 2.6.9?
Date: Sun, 30 Jan 2005 23:56:07 -0800	[thread overview]
Message-ID: <41FDE497.6040308@candelatech.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 852 bytes --]

As far as I can tell, close-exec is not working correctly in 2.6.9
or 2.6.10-1.741_FC3smp.

The attached program generates a file /tmp/cl_foo.output
which has this data:


[greear@grok ~]$ more /tmp/cl_foo.output
total 5
lrwx------  1 greear greear 64 Jan 30 23:49 0 -> /dev/pts/3
l-wx------  1 greear greear 64 Jan 30 23:49 1 -> /tmp/cl_foo.output
l-wx------  1 greear greear 64 Jan 30 23:49 2 -> /tmp/cl_foo.output
lr-x------  1 greear greear 64 Jan 30 23:49 3 -> /etc/passwd
lr-x------  1 greear greear 64 Jan 30 23:49 4 -> /proc/7020/fd


I would not expect to see the /etc/passwd entry since I marked
it close-exec in the parent process before forking and running
the system() command.

Am I confused about things, or is this a real bug?

Thanks,
Ben

-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com


[-- Attachment #2: close_exec.cc --]
[-- Type: text/plain, Size: 1254 bytes --]



#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <errno.h>

using namespace std;

void close_exec(int s) {
   int  flags;

   flags = fcntl(s, F_GETFL);
   flags |= (FD_CLOEXEC);
   if (fcntl(s, F_SETFL, flags) < 0) {
      cerr << "ERROR:  fcntl, executing close_exec:  " << strerror(errno)
           << endl;
   }
}//close_exec

int main() {
   ofstream script("/tmp/cl_foo.bash");
   script << "#!/bin/bash\nls -l /proc/self/fd > /tmp/cl_foo.output 2>&1\n";
   script.close();
   
   if (chmod("/tmp/cl_foo.bash",
             S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) < 0) {
      cerr << "ERROR:  Failed to chmod /tmp/cl_foo.bash, error: "
           << strerror(errno) << endl;
      exit(7);
   }

   int fd = open("/etc/passwd", O_RDONLY);
   if (fd < 0) {
      cerr << "ERROR:  Failed to open /etc/passwd: " << strerror(errno) << endl;
   }
   else {
      close_exec(fd);
   }

   int rv = fork();
   if (rv < 0) {
      cerr << "ERROR from fork: " << strerror(errno) << endl;
   }
   else if (rv == 0) {
      // Child
      system("/tmp/cl_foo.bash");
      exit(7);
   }
   else {
      // parent, done
      sleep(5);
   }
   return 0;
}//main

             reply	other threads:[~2005-01-31  8:01 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-31  7:56 Ben Greear [this message]
2005-01-31 21:08 ` close-exec flag not working in 2.6.9? Ulrich Drepper
2005-01-31 21:26   ` Ben Greear

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41FDE497.6040308@candelatech.com \
    --to=greearb@candelatech.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox