dd bug fix: accept e.g., if=/dev/stdin and of=/dev/stdout
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 31 Mar 2008 06:37:36 +0000 (08:37 +0200)
committerJim Meyering <meyering@redhat.com>
Mon, 31 Mar 2008 06:37:58 +0000 (08:37 +0200)
* lib/fd-reopen.c: Work even if FILE is "/dev/stdin".
Problem reported by Geoffrey Lee in <http://bugs.debian.org/290727>.
* tests/dd/misc: Check for this bug.

lib/fd-reopen.c
tests/dd/misc

index 2ce467873746cdb1410d7e1571b423165b963d43..c12fef602948d9bbeeb5384a65d1f02bc4b7e9a0 100644 (file)
@@ -1,6 +1,6 @@
 /* Invoke open, but return either a desired file descriptor or -1.
 
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 int
 fd_reopen (int desired_fd, char const *file, int flags, mode_t mode)
 {
-  int fd;
+  int fd = open (file, flags, mode);
 
-  close (desired_fd);
-  fd = open (file, flags, mode);
   if (fd == desired_fd || fd < 0)
     return fd;
   else
     {
-      int fd2 = fcntl (fd, F_DUPFD, desired_fd);
+      int fd2 = dup2 (fd, desired_fd);
       int saved_errno = errno;
       close (fd);
       errno = saved_errno;
index 917258236ee674affdba227b205eeda36124f223..2b54cfb3634d0b03c09f9fada4dc7ade79f15dea 100755 (executable)
@@ -46,6 +46,13 @@ if dd oflag=append if=$tmp_in of=$tmp_out 2> /dev/null; then
   compare $tmp_in $tmp_out || fail=1
 fi
 
+case $(cat /dev/stdin <$tmp_in 2>/dev/null) in
+(data)
+  rm -f $tmp_out
+  dd if=/dev/stdin of=$tmp_out <$tmp_in || fail=1
+  compare $tmp_in $tmp_out || fail=1
+esac
+
 if dd iflag=nofollow if=$tmp_in count=0 2> /dev/null; then
   dd iflag=nofollow if=$tmp_sym count=0 2> /dev/null && fail=1
 fi