All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.