linux/include/asm-generic
Ulrich Drepper f23513e8d9 Introduce O_CLOEXEC
The problem is as follows: in multi-threaded code (or more correctly: all
code using clone() with CLONE_FILES) we have a race when exec'ing.

   thread #1                       thread #2

   fd=open()

                                   fork + exec

  fcntl(fd,F_SETFD,FD_CLOEXEC)

In some applications this can happen frequently.  Take a web browser.  One
thread opens a file and another thread starts, say, an external PDF viewer.
 The result can even be a security issue if that open file descriptor
refers to a sensitive file and the external program can somehow be tricked
into using that descriptor.

Just adding O_CLOEXEC support to open() doesn't solve the whole set of
problems.  There are other ways to create file descriptors (socket,
epoll_create, Unix domain socket transfer, etc).  These can and should be
addressed separately though.  open() is such an easy case that it makes not
much sense putting the fix off.

The test program:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

#ifndef O_CLOEXEC
# define O_CLOEXEC 02000000
#endif

int
main (int argc, char *argv[])
{
  int fd;
  if (argc > 1)
    {
      fd = atol (argv[1]);
      printf ("child: fd = %d\n", fd);
      if (fcntl (fd, F_GETFD) == 0 || errno != EBADF)
        {
          puts ("file descriptor valid in child");
          return 1;
        }
      return 0;
    }

  fd = open ("/proc/self/exe", O_RDONLY | O_CLOEXEC);
  printf ("in parent: new fd = %d\n", fd);
  char buf[20];
  snprintf (buf, sizeof (buf), "%d", fd);
  execl ("/proc/self/exe", argv[0], buf, NULL);
  puts ("execl failed");
  return 1;
}

[kyle@parisc-linux.org: parisc fix]
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Cc: Davide Libenzi <davidel@xmailserver.org>
Cc: Michael Kerrisk <mtk-manpages@gmx.net>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 09:05:45 -07:00
..
bitops sched: simplify sched_find_first_bit() 2007-07-09 18:52:00 +02:00
4level-fixup.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
atomic.h atomic.h: atomic_add_unless as inline. Remove system.h atomic.h circular dependency 2007-05-08 11:15:20 -07:00
audit_change_attr.h [PATCH] fix missing ifdefs in syscall classes hookup for generic targets 2006-09-22 17:48:56 -07:00
audit_dir_write.h [PATCH] fix missing ifdefs in syscall classes hookup for generic targets 2006-09-22 17:48:56 -07:00
audit_read.h [PATCH] audit: more syscall classes added 2006-09-11 13:32:27 -04:00
audit_signal.h [PATCH] add SIGNAL syscall class (v3) 2007-05-11 05:38:25 -04:00
audit_write.h [PATCH] audit: more syscall classes added 2006-09-11 13:32:27 -04:00
bitops.h [PATCH] bitops: update include/asm-generic/bitops.h 2006-03-26 08:57:15 -08:00
bug.h Don't call a warnign a bug. It's a warning. 2007-05-24 10:13:43 -07:00
cputime.h [CPUFREQ] Remove slowdown from ondemand sampling path. 2006-06-30 01:29:47 -04:00
device.h Driver core: add dev_archdata to struct device 2006-12-01 14:52:01 -08:00
div64.h [NET]: div64_64 consolidate (rev3) 2007-04-25 22:23:33 -07:00
dma-mapping-broken.h dma-mapping: prevent dma dependent code from linking on !HAS_DMA archs 2007-07-16 09:05:45 -07:00
dma-mapping.h [PATCH] Pass struct dev pointer to dma_cache_sync() 2006-12-07 08:39:41 -08:00
emergency-restart.h
errno-base.h
errno.h
fcntl.h Introduce O_CLOEXEC 2007-07-16 09:05:45 -07:00
futex.h [PATCH] mm: pagefault_{disable,enable}() 2006-12-07 08:39:21 -08:00
gpio.h [PATCH] GPIO core 2007-02-12 09:48:34 -08:00
ide_iops.h
ioctl.h [PATCH] Generic ioctl.h 2006-01-10 08:01:34 -08:00
iomap.h
ipc.h
irq_regs.h IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
Kbuild Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
Kbuild.asm [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
kdebug.h move die notifier handling to common code 2007-05-08 11:15:04 -07:00
libata-portmap.h Fix Maple PATA IRQ assignment. 2007-01-26 17:27:40 -05:00
local.h local_t: architecture independent extension 2007-05-08 11:15:20 -07:00
memory_model.h [PATCH] typeof __page_to_pfn with SPARSEMEM=y 2007-02-11 10:51:17 -08:00
mm_hooks.h [PATCH] x86: PARAVIRT: add hooks to intercept mm creation and destruction 2007-05-02 19:27:14 +02:00
mman.h [PATCH] Remove final references to deprecated "MAP_ANON" page protection flag 2007-02-11 10:51:17 -08:00
mutex-dec.h fix file specification in comments 2006-10-03 23:01:26 +02:00
mutex-null.h fix file specification in comments 2006-10-03 23:01:26 +02:00
mutex-xchg.h fix file specification in comments 2006-10-03 23:01:26 +02:00
page.h Revert "[PATCH] LOG2: Alter get_order() so that it can make use of ilog2() on a constant" 2007-03-06 19:38:01 -08:00
pci-dma-compat.h
pci.h [PATCH] Make sparc64 use setup-res.c 2005-09-08 14:57:25 -07:00
percpu.h [PATCH] i386: Use per-cpu variables for GDT, PDA 2007-05-02 19:27:10 +02:00
pgtable-nopmd.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
pgtable-nopud.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
pgtable.h Rework ptep_set_access_flags and fix sun4c 2007-06-16 13:16:16 -07:00
poll.h Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
resource.h
rtc.h fix file specification in comments 2006-10-03 23:01:26 +02:00
sections.h [PATCH] add __[start|end]_rodata sections to asm-generic/sections.h 2006-07-01 09:56:03 -07:00
siginfo.h
signal.h Add standard include guard to asm-generic/signal and use compiler.h 2006-04-27 06:57:23 +01:00
statfs.h
termios.h [PATCH] tty: switch to ktermios 2006-12-08 08:28:57 -08:00
tlb.h fix file specification in comments 2006-10-03 23:01:26 +02:00
topology.h
uaccess.h
unaligned.h [PATCH] __get_unaligned() gcc-4 fix 2006-03-08 14:14:00 -08:00
vmlinux.lds.h sparc64: fix alignment bug in linker definition script 2007-05-29 21:29:00 +02:00
xor.h