From nobody@FreeBSD.org  Sat Dec 18 01:19:55 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 8EDE3106567A
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 18 Dec 2010 01:19:55 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (unknown [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 633B28FC1A
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 18 Dec 2010 01:19:55 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id oBI1Jts8018829
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 18 Dec 2010 01:19:55 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id oBI1Jtr8018828;
	Sat, 18 Dec 2010 01:19:55 GMT
	(envelope-from nobody)
Message-Id: <201012180119.oBI1Jtr8018828@red.freebsd.org>
Date: Sat, 18 Dec 2010 01:19:55 GMT
From: Pedro Giffuni <giffunip@tutopia.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: sed: fix for a race condition (from illumos)
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         153261
>Category:       bin
>Synopsis:       [patch] sed(1): fix for a race condition (from illumos)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    jilles
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 18 01:20:06 UTC 2010
>Closed-Date:    Mon May 02 18:29:20 UTC 2011
>Last-Modified:  Mon May 02 18:29:20 UTC 2011
>Originator:     Pedro Giffuni
>Release:        8.1-RELEASE
>Organization:
>Environment:
FreeBSD mogwai.giffuni.net 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Tue Nov  9 10:31:43 UTC 2010     pedro@mogwai.giffuni.net:/usr/src/sys/i386/compile/GENERIC  i386

>Description:
Garrett D'Amore's blog:

http://blogs.nexenta.org/

"I just integrated a new sed(1) port for illumos. This is derived from FreeBSD, but it includes a fix for a race condition, and support for translated messages. (FreeBSD friends, please feel free to include these changes back  Ive not changed the original BSD license.)"

The complete sources are available here:
http://mexico.purplecow.org/gdamore/webrev/sed/

I only looked where link was replaced by rename and was careful to apply this patch here:
http://www.illumos.org/issues/524

It should also be noted that they made a small change to libc/regex (PR bin/153257) to obtain a Solaris compatible behavior.

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -ru sed.orig/main.c sed/main.c
--- sed.orig/main.c	2010-12-17 17:42:46.000000000 +0000
+++ sed/main.c	2010-12-17 19:58:41.000000000 +0000
@@ -338,8 +338,10 @@
 		if (infile != NULL) {
 			fclose(infile);
 			if (*oldfname != '\0') {
-				if (rename(fname, oldfname) != 0) {
-					warn("rename()");
+				/* if there was a backup file, remove it */
+				unlink(oldfname);
+				if (link(fname, oldfname) != 0) {
+					warn("link()");
 					unlink(tmpfname);
 					exit(1);
 				}
@@ -347,9 +349,18 @@
 			}
 			if (*tmpfname != '\0') {
 				if (outfile != NULL && outfile != stdout)
-					fclose(outfile);
+					if (fclose(outfile) != 0) {
+						warn("fclose()");
+						unlink(tmpfname);
+						exit(1);
+					}
 				outfile = NULL;
-				rename(tmpfname, fname);
+				if (rename(tmpfname, fname) != 0) {
+					/* this should not happen really! */
+					warn("rename()");
+					unlink(tmpfname);
+					exit(1);
+				}
 				*tmpfname = '\0';
 			}
 			outfname = NULL;


>Release-Note:
>Audit-Trail:

From: Jilles Tjoelker <jilles@stack.nl>
To: bug-followup@FreeBSD.org, giffunip@tutopia.com
Cc:  
Subject: Re: bin/153261: sed: fix for a race condition (from illumos)
Date: Sun, 26 Dec 2010 22:30:49 +0100

 > [illumos sed patch]
 
 I think this breaks running sed -i on filesystems that do not support
 hard links such as msdosfs. A check for [EOPNOTSUPP] with a fallback to
 the old rename() code could be appropriate.
 
 -- 
 Jilles Tjoelker

From: "Pedro F. Giffuni" <giffunip@tutopia.com>
To: bug-followup@FreeBSD.org, Jilles Tjoelker <jilles@stack.nl>
Cc:  
Subject: Re: bin/153261: sed: fix for a race condition (from illumos)
Date: Tue, 28 Dec 2010 08:19:42 -0800 (PST)

 --0-1632005195-1293553182=:99003
 Content-Type: text/plain; charset=us-ascii
 
 I can confirm there was a problem with msdosfs.
 
 The attached patch fixes it.
 
 
       
 --0-1632005195-1293553182=:99003
 Content-Type: text/plain; name="patch-sed1.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="patch-sed1.txt"
 
 LS0tIHNlZC9tYWluLmMub3JpZwkyMDEwLTEyLTE4IDE4OjM3OjUwLjAwMDAw
 MDAwMCArMDAwMAorKysgc2VkL21haW4uYwkyMDEwLTEyLTI4IDExOjAxOjQz
 LjAwMDAwMDAwMCArMDAwMApAQCAtMzM4LDE4ICszMzgsMzUgQEAKIAkJaWYg
 KGluZmlsZSAhPSBOVUxMKSB7CiAJCQlmY2xvc2UoaW5maWxlKTsKIAkJCWlm
 ICgqb2xkZm5hbWUgIT0gJ1wwJykgewotCQkJCWlmIChyZW5hbWUoZm5hbWUs
 IG9sZGZuYW1lKSAhPSAwKSB7Ci0JCQkJCXdhcm4oInJlbmFtZSgpIik7Ci0J
 CQkJCXVubGluayh0bXBmbmFtZSk7Ci0JCQkJCWV4aXQoMSk7CisJCQkJLyog
 aWYgdGhlcmUgd2FzIGEgYmFja3VwIGZpbGUsIHJlbW92ZSBpdCAqLworCQkJ
 CXVubGluayhvbGRmbmFtZSk7CisJCQkJaWYgKGxpbmsoZm5hbWUsIG9sZGZu
 YW1lKSAhPSAwKSB7CisJCQkJCWlmIChlcnJubyA9PSBFT1BOT1RTVVBQKSB7
 CisJCQkJCQlpZiAocmVuYW1lKGZuYW1lLCBvbGRmbmFtZSkgIT0gMCkKKwkJ
 CQkJCQl3YXJuKCJyZW5hbWUoKSIpOworCQkJCQl9CisJCQkJCWVsc2Ugewor
 CQkJCQkJd2FybigibGluaygpIik7CisJCQkJCQl1bmxpbmsodG1wZm5hbWUp
 OworCQkJCQkJZXhpdCgxKTsKKwkJCQkJfQogCQkJCX0KIAkJCQkqb2xkZm5h
 bWUgPSAnXDAnOwogCQkJfQogCQkJaWYgKCp0bXBmbmFtZSAhPSAnXDAnKSB7
 CiAJCQkJaWYgKG91dGZpbGUgIT0gTlVMTCAmJiBvdXRmaWxlICE9IHN0ZG91
 dCkKLQkJCQkJZmNsb3NlKG91dGZpbGUpOworCQkJCQlpZiAoZmNsb3NlKG91
 dGZpbGUpICE9IDApIHsKKwkJCQkJCXdhcm4oImZjbG9zZSgpIik7CisJCQkJ
 CQl1bmxpbmsodG1wZm5hbWUpOworCQkJCQkJZXhpdCgxKTsKKwkJCQkJfQog
 CQkJCW91dGZpbGUgPSBOVUxMOwotCQkJCXJlbmFtZSh0bXBmbmFtZSwgZm5h
 bWUpOworCQkJCWlmIChyZW5hbWUodG1wZm5hbWUsIGZuYW1lKSAhPSAwKSB7
 CisJCQkJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gcmVhbGx5ISAqLwor
 CQkJCQl3YXJuKCJyZW5hbWUoKSIpOworCQkJCQl1bmxpbmsodG1wZm5hbWUp
 OworCQkJCQlleGl0KDEpOworCQkJCX0KIAkJCQkqdG1wZm5hbWUgPSAnXDAn
 OwogCQkJfQogCQkJb3V0Zm5hbWUgPSBOVUxMOwo=
 
 --0-1632005195-1293553182=:99003--

From: "Pedro F. Giffuni" <giffunip@tutopia.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: sed: fix for a race condition (from illumos)
Date: Wed, 29 Dec 2010 07:31:13 -0800 (PST)

 --- On Wed, 12/29/10, Diomidis Spinellis <d-s@NO-SPAM.gr> wrote:
 ...
 > 
 > One style nit: please place the else statement on the same
 > line as its braces.
 > 
 > } else {
 > 
 
 
 
       

From: "Pedro F. Giffuni" <giffunip@tutopia.com>
To: bug-followup@FreeBSD.org, Jilles Tjoelker <jilles@stack.nl>
Cc:  
Subject: Re: bin/153261: sed: fix for a race condition (from illumos)
Date: Wed, 29 Dec 2010 10:51:23 -0800 (PST)

 --0-1803587171-1293648683=:46994
 Content-Type: text/plain; charset=us-ascii
 
 Garret D'Amore (from Illumos) has provided some feedback:
 ____
 Thanks.  Two issues:
 
 a) On Solaris, the errno is ENOSYS, not EOPNOTSUPP. 
 
 b) The "unlink(tmpfname)" and exit(1) logic don't seem to be honored in
 the case of rename() failing.
 
 I think the simpler solution is to unconditionally try the rename() if
 link fails, and not worry about a difference in the error message. 
 
 I also noticed that we unconditionally try to unlink(tmpfname), but that
 only makes sense if tmpfname is a non-empty string. :-)
 ____
 
 So I attach a new patch.
 
 
       
 --0-1803587171-1293648683=:46994
 Content-Type: text/plain; name="patch-sed2.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="patch-sed2.txt"
 
 LS0tIHNlZC9tYWluLmMub3JpZwkyMDEwLTEyLTE4IDE4OjM3OjUwLjAwMDAw
 MDAwMCArMDAwMAorKysgc2VkL21haW4uYwkyMDEwLTEyLTI3IDE0OjU1OjU0
 LjAwMDAwMDAwMCArMDAwMApAQCAtMzM4LDggKzMzOCwxMiBAQAogCQlpZiAo
 aW5maWxlICE9IE5VTEwpIHsKIAkJCWZjbG9zZShpbmZpbGUpOwogCQkJaWYg
 KCpvbGRmbmFtZSAhPSAnXDAnKSB7Ci0JCQkJaWYgKHJlbmFtZShmbmFtZSwg
 b2xkZm5hbWUpICE9IDApIHsKLQkJCQkJd2FybigicmVuYW1lKCkiKTsKKwkJ
 CQkvKiBpZiB0aGVyZSB3YXMgYSBiYWNrdXAgZmlsZSwgcmVtb3ZlIGl0ICov
 CisJCQkJaWYgKHVubGluayhvbGRmbmFtZSkgIT0wKQorCQkJCQlpZiAocmVu
 YW1lKGZuYW1lLCBvbGRmbmFtZSkgIT0gMCkKKwkJCQkJCXdhcm4oInJlbmFt
 ZSgpIik7CisJCQkJZWxzZSBpZiAobGluayhmbmFtZSwgb2xkZm5hbWUpICE9
 IDApIHsKKwkJCQkJd2FybigibGluaygpIik7CiAJCQkJCXVubGluayh0bXBm
 bmFtZSk7CiAJCQkJCWV4aXQoMSk7CiAJCQkJfQpAQCAtMzQ3LDkgKzM1MSwx
 OCBAQAogCQkJfQogCQkJaWYgKCp0bXBmbmFtZSAhPSAnXDAnKSB7CiAJCQkJ
 aWYgKG91dGZpbGUgIT0gTlVMTCAmJiBvdXRmaWxlICE9IHN0ZG91dCkKLQkJ
 CQkJZmNsb3NlKG91dGZpbGUpOworCQkJCQlpZiAoZmNsb3NlKG91dGZpbGUp
 ICE9IDApIHsKKwkJCQkJCXdhcm4oImZjbG9zZSgpIik7CisJCQkJCQl1bmxp
 bmsodG1wZm5hbWUpOworCQkJCQkJZXhpdCgxKTsKKwkJCQkJfQogCQkJCW91
 dGZpbGUgPSBOVUxMOwotCQkJCXJlbmFtZSh0bXBmbmFtZSwgZm5hbWUpOwor
 CQkJCWlmIChyZW5hbWUodG1wZm5hbWUsIGZuYW1lKSAhPSAwKSB7CisJCQkJ
 CS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gcmVhbGx5ISAqLworCQkJCQl3
 YXJuKCJyZW5hbWUoKSIpOworCQkJCQl1bmxpbmsodG1wZm5hbWUpOworCQkJ
 CQlleGl0KDEpOworCQkJCX0KIAkJCQkqdG1wZm5hbWUgPSAnXDAnOwogCQkJ
 fQogCQkJb3V0Zm5hbWUgPSBOVUxMOwo=
 
 --0-1803587171-1293648683=:46994--
Responsible-Changed-From-To: freebsd-bugs->jilles 
Responsible-Changed-By: jilles 
Responsible-Changed-When: Wed Dec 29 21:51:30 UTC 2010 
Responsible-Changed-Why:  
Take. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=153261 

From: "Pedro F. Giffuni" <giffunip@tutopia.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: sed: fix for a race condition (from illumos)
Date: Wed, 29 Dec 2010 17:44:35 -0800 (PST)

 --0-1431592252-1293673475=:58292
 Content-Type: text/plain; charset=us-ascii
 
 Garrett D'Amore has noted that fchown doesn't work on
 FAT filesystems either so he has provided a fix:
 https://www.illumos.org/issues/585
 
 Updated (and retested) patch for FreeBSD follows.
 
 
       
 --0-1431592252-1293673475=:58292
 Content-Type: text/plain; name="patch-sed3.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="patch-sed3.txt"
 
 LS0tIHNlZC9tYWluLmMub3JpZwkyMDEwLTEyLTE4IDE4OjM3OjUwLjAwMDAw
 MDAwMCArMDAwMAorKysgc2VkL21haW4uYwkyMDEwLTEyLTI5IDIwOjM1OjIy
 LjAwMDAwMDAwMCArMDAwMApAQCAtMzA2LDcgKzMwNiw3IEBACiBpbnQKIG1m
 X2ZnZXRzKFNQQUNFICpzcCwgZW51bSBlX3NwZmxhZyBzcGZsYWcpCiB7Ci0J
 c3RydWN0IHN0YXQgc2I7CisJc3RydWN0IHN0YXQgc2IsIG5zYjsKIAlzaXpl
 X3QgbGVuOwogCWNoYXIgKnA7CiAJaW50IGM7CkBAIC0zMzgsMTggKzMzOCwz
 NSBAQAogCQlpZiAoaW5maWxlICE9IE5VTEwpIHsKIAkJCWZjbG9zZShpbmZp
 bGUpOwogCQkJaWYgKCpvbGRmbmFtZSAhPSAnXDAnKSB7Ci0JCQkJaWYgKHJl
 bmFtZShmbmFtZSwgb2xkZm5hbWUpICE9IDApIHsKKwkJCQkvKiBpZiB0aGVy
 ZSB3YXMgYSBiYWNrdXAgZmlsZSwgcmVtb3ZlIGl0ICovCisJCQkJdW5saW5r
 KG9sZGZuYW1lKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAg
 ICAgICAqIEJhY2t1cCB0aGUgb3JpZ2luYWwuICBOb3RlIHRoYXQgaGFyZCBs
 aW5rcworICAgICAgICAgICAgICAgICAqIGFyZSBub3Qgc3VwcG9ydGVkIG9u
 IGFsbCBmaWxlc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAgKi8KKwkJCQlp
 ZiAoKGxpbmsoZm5hbWUsIG9sZGZuYW1lKSAhPSAwKSAmJgorCQkJCSAgIChy
 ZW5hbWUoZm5hbWUsIG9sZGZuYW1lKSAhPSAwKSkgewogCQkJCQl3YXJuKCJy
 ZW5hbWUoKSIpOwotCQkJCQl1bmxpbmsodG1wZm5hbWUpOworCQkJCQlpZiAo
 KnRtcGZuYW1lKQorCQkJCQkJdW5saW5rKHRtcGZuYW1lKTsKIAkJCQkJZXhp
 dCgxKTsKIAkJCQl9CiAJCQkJKm9sZGZuYW1lID0gJ1wwJzsKIAkJCX0KIAkJ
 CWlmICgqdG1wZm5hbWUgIT0gJ1wwJykgewogCQkJCWlmIChvdXRmaWxlICE9
 IE5VTEwgJiYgb3V0ZmlsZSAhPSBzdGRvdXQpCi0JCQkJCWZjbG9zZShvdXRm
 aWxlKTsKKwkJCQkJaWYgKGZjbG9zZShvdXRmaWxlKSAhPSAwKSB7CisJCQkJ
 CQl3YXJuKCJmY2xvc2UoKSIpOworCQkJCQkJdW5saW5rKHRtcGZuYW1lKTsK
 KwkJCQkJCWV4aXQoMSk7CisJCQkJCX0KIAkJCQlvdXRmaWxlID0gTlVMTDsK
 LQkJCQlyZW5hbWUodG1wZm5hbWUsIGZuYW1lKTsKKwkJCQlpZiAocmVuYW1l
 KHRtcGZuYW1lLCBmbmFtZSkgIT0gMCkgeworCQkJCQkvKiB0aGlzIHNob3Vs
 ZCBub3QgaGFwcGVuIHJlYWxseSEgKi8KKwkJCQkJd2FybigicmVuYW1lKCki
 KTsKKwkJCQkJdW5saW5rKHRtcGZuYW1lKTsKKwkJCQkJZXhpdCgxKTsKKwkJ
 CQl9CiAJCQkJKnRtcGZuYW1lID0gJ1wwJzsKIAkJCX0KIAkJCW91dGZuYW1l
 ID0gTlVMTDsKQEAgLTM4Niw4ICs0MDMsMjMgQEAKIAkJCXVubGluayh0bXBm
 bmFtZSk7CiAJCQlpZiAoKG91dGZpbGUgPSBmb3Blbih0bXBmbmFtZSwgInci
 KSkgPT0gTlVMTCkKIAkJCQllcnIoMSwgIiVzIiwgZm5hbWUpOwotCQkJZmNo
 b3duKGZpbGVubyhvdXRmaWxlKSwgc2Iuc3RfdWlkLCBzYi5zdF9naWQpOwot
 CQkJZmNobW9kKGZpbGVubyhvdXRmaWxlKSwgc2Iuc3RfbW9kZSAmIEFMTFBF
 Uk1TKTsKKwkJCS8qCisJCQkgKiBTb21lIGZpbGUgc3lzdGVtcyBkb24ndCBz
 dXBwb3J0IGNob3duIG9yCisJCQkgKiBjaG1vZCBmdWxseS4gIE9uIHRob3Nl
 LCB0aGUgb3duZXIvZ3JvdXAgYW5kCisJCQkgKiBwZXJtaXNzaW9ucyB3aWxs
 IGFscmVhZHkgYmUgc2V0IHRvIHdoYXQKKwkJCSAqIHRoZXkgbmVlZCB0byBi
 ZS4KKwkJCSAqLworCQkJaWYgKGZzdGF0KGZpbGVubyhvdXRmaWxlKSwgJm5z
 YikgIT0gMCkgeworCQkJICAgIHdhcm4oImZzdGF0KCkiKTsKKwkJCX0KKwkJ
 CWlmICgoKHNiLnN0X3VpZCAhPSBuc2Iuc3RfdWlkKSB8fAorCQkJICAgIChz
 Yi5zdF9naWQgIT0gbnNiLnN0X2dpZCkpICYmCisJCQkgICAgKGZjaG93bihm
 aWxlbm8ob3V0ZmlsZSksIHNiLnN0X3VpZCwgc2Iuc3RfZ2lkKQorCQkJICAg
 ICE9IDApKQorCQkJICAgIHdhcm4oImZjaG93bigpIik7CisJCQlpZiAoKHNi
 LnN0X21vZGUgIT0gbnNiLnN0X21vZGUpICYmCisJCQkgICAgKGZjaG1vZChm
 aWxlbm8ob3V0ZmlsZSksIHNiLnN0X21vZGUgJiAwNzc3NykgIT0gMCkpCisJ
 CQkgICAgd2FybigiZmNobW9kKCkiKTsKIAkJCW91dGZuYW1lID0gdG1wZm5h
 bWU7CiAJCQlpZiAoIWlzcGFuKSB7CiAJCQkJbGluZW51bSA9IDA7Cg==
 
 --0-1431592252-1293673475=:58292--

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: commit references a PR
Date: Sat,  8 Jan 2011 00:03:27 +0000 (UTC)

 Author: jilles
 Date: Sat Jan  8 00:03:18 2011
 New Revision: 217133
 URL: http://svn.freebsd.org/changeset/base/217133
 
 Log:
   sed: Try hard links to make -i target available continually.
   
   When creating a backup file, sed renamed the original before renaming the
   changed copy into place, leading to a short time when no file with the
   original name was present (usually only visible on SMP systems). Try
   creating the backup file using a hard link instead, avoiding this problem.
   If creating the hard link fails for any reason, fall back to the old rename
   method.
   
   When not creating a backup file, sed already renamed the changed copy onto
   the original. This remains unchanged.
   
   I am not adding the suppression of redundant fchown/fchmod to this commit,
   because FreeBSD appears to check this in the kernel (for msdosfs at least).
   
   PR:		bin/153261
   Submitted by:	Pedro F. Giffuni
   Reviewed by:	dds (older version)
   Obtained from:	Illumos
   MFC after:	2 weeks
 
 Modified:
   head/usr.bin/sed/main.c
 
 Modified: head/usr.bin/sed/main.c
 ==============================================================================
 --- head/usr.bin/sed/main.c	Fri Jan  7 23:39:41 2011	(r217132)
 +++ head/usr.bin/sed/main.c	Sat Jan  8 00:03:18 2011	(r217133)
 @@ -338,18 +338,35 @@ mf_fgets(SPACE *sp, enum e_spflag spflag
  		if (infile != NULL) {
  			fclose(infile);
  			if (*oldfname != '\0') {
 -				if (rename(fname, oldfname) != 0) {
 +				/* if there was a backup file, remove it */
 +				unlink(oldfname);
 +				/*
 +				 * Backup the original.  Note that hard links
 +				 * are not supported on all filesystems.
 +				 */
 +				if ((link(fname, oldfname) != 0) &&
 +				   (rename(fname, oldfname) != 0)) {
  					warn("rename()");
 -					unlink(tmpfname);
 +					if (*tmpfname)
 +						unlink(tmpfname);
  					exit(1);
  				}
  				*oldfname = '\0';
  			}
  			if (*tmpfname != '\0') {
  				if (outfile != NULL && outfile != stdout)
 -					fclose(outfile);
 +					if (fclose(outfile) != 0) {
 +						warn("fclose()");
 +						unlink(tmpfname);
 +						exit(1);
 +					}
  				outfile = NULL;
 -				rename(tmpfname, fname);
 +				if (rename(tmpfname, fname) != 0) {
 +					/* this should not happen really! */
 +					warn("rename()");
 +					unlink(tmpfname);
 +					exit(1);
 +				}
  				*tmpfname = '\0';
  			}
  			outfname = NULL;
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: commit references a PR
Date: Sat,  8 Jan 2011 00:06:27 +0000 (UTC)

 Author: jilles
 Date: Sat Jan  8 00:06:22 2011
 New Revision: 217134
 URL: http://svn.freebsd.org/changeset/base/217134
 
 Log:
   sed: Add test for r217133 (-i race).
   
   PR:		bin/153261
   MFC after:	2 weeks
 
 Added:
   head/tools/regression/usr.bin/sed/inplace_race.t   (contents, props changed)
 Modified:
   head/tools/regression/usr.bin/sed/Makefile
 
 Modified: head/tools/regression/usr.bin/sed/Makefile
 ==============================================================================
 --- head/tools/regression/usr.bin/sed/Makefile	Sat Jan  8 00:03:18 2011	(r217133)
 +++ head/tools/regression/usr.bin/sed/Makefile	Sat Jan  8 00:06:22 2011	(r217134)
 @@ -3,3 +3,4 @@
  all:
  	@m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR}
  	@sh multitest.t
 +	@sh inplace_race.t
 
 Added: head/tools/regression/usr.bin/sed/inplace_race.t
 ==============================================================================
 --- /dev/null	00:00:00 1970	(empty, because file is newly added)
 +++ head/tools/regression/usr.bin/sed/inplace_race.t	Sat Jan  8 00:06:22 2011	(r217134)
 @@ -0,0 +1,83 @@
 +#!/bin/sh
 +
 +#-
 +# Copyright (c) 2011 Jilles Tjoelker
 +# All rights reserved.
 +#
 +# Redistribution and use in source and binary forms, with or without
 +# modification, are permitted provided that the following conditions
 +# are met:
 +# 1. Redistributions of source code must retain the above copyright
 +#    notice, this list of conditions and the following disclaimer.
 +# 2. Redistributions in binary form must reproduce the above copyright
 +#    notice, this list of conditions and the following disclaimer in the
 +#    documentation and/or other materials provided with the distribution.
 +#
 +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 +# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 +# SUCH DAMAGE.
 +#
 +# $FreeBSD$
 +
 +: "${SED=sed}"
 +
 +# This test really needs an SMP system. On an UP system, it will
 +# usually pass even if the race condition exists.
 +if command -v cpuset >/dev/null; then
 +	case `cpuset -g -p $$` in
 +	*,*) ;;
 +	*)
 +		echo '1..0 # Skipped: not an SMP system'
 +		exit 0 ;;
 +	esac
 +fi
 +
 +echo "1..1"
 +
 +T=$(mktemp -d "${TMPDIR:-/tmp}/sed-test.XXXXXX")
 +trap 'cd /; rm -rf "$T"' 0
 +cd "$T"
 +
 +data=abababab
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data="BEGIN
 +$data
 +END"
 +for i in 0 1 2 3 4 5 6 7 8 9; do
 +	echo "$data" >file$i
 +done
 +len=${#data}
 +
 +i=0
 +while [ $i -lt 100 ]; do
 +	${SED} -i.prev "s/$i/ab/" file[0-9]
 +	i=$((i+1))
 +done &
 +sedproc=$!
 +
 +while :; do
 +	set -- file[0-9]
 +	if [ $# -ne 10 ]; then
 +		echo "not ok 1 inplace_race"
 +		exit 3
 +	fi
 +done &
 +checkproc=$!
 +
 +wait $sedproc
 +kill $checkproc 2>/dev/null
 +wait $checkproc >/dev/null 2>&1
 +if [ $? -ne 3 ]; then
 +	echo "ok 1 inplace_race"
 +fi
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: commit references a PR
Date: Tue, 25 Jan 2011 23:02:49 +0000 (UTC)

 Author: jilles
 Date: Tue Jan 25 23:02:25 2011
 New Revision: 217863
 URL: http://svn.freebsd.org/changeset/base/217863
 
 Log:
   MFC r217133:   sed: Try hard links to make -i target available continually.
   
   When creating a backup file, sed renamed the original before renaming the
   changed copy into place, leading to a short time when no file with the
   original name was present (usually only visible on SMP systems). Try
   creating the backup file using a hard link instead, avoiding this problem.
   If creating the hard link fails for any reason, fall back to the old rename
   method.
   
   When not creating a backup file, sed already renamed the changed copy onto
   the original. This remains unchanged.
   
   PR:		bin/153261
   Submitted by:	Pedro F. Giffuni
   Reviewed by:	dds (older version)
   Obtained from:	Illumos
 
 Modified:
   stable/8/usr.bin/sed/main.c
 Directory Properties:
   stable/8/usr.bin/sed/   (props changed)
 
 Modified: stable/8/usr.bin/sed/main.c
 ==============================================================================
 --- stable/8/usr.bin/sed/main.c	Tue Jan 25 22:55:50 2011	(r217862)
 +++ stable/8/usr.bin/sed/main.c	Tue Jan 25 23:02:25 2011	(r217863)
 @@ -338,18 +338,35 @@ mf_fgets(SPACE *sp, enum e_spflag spflag
  		if (infile != NULL) {
  			fclose(infile);
  			if (*oldfname != '\0') {
 -				if (rename(fname, oldfname) != 0) {
 +				/* if there was a backup file, remove it */
 +				unlink(oldfname);
 +				/*
 +				 * Backup the original.  Note that hard links
 +				 * are not supported on all filesystems.
 +				 */
 +				if ((link(fname, oldfname) != 0) &&
 +				   (rename(fname, oldfname) != 0)) {
  					warn("rename()");
 -					unlink(tmpfname);
 +					if (*tmpfname)
 +						unlink(tmpfname);
  					exit(1);
  				}
  				*oldfname = '\0';
  			}
  			if (*tmpfname != '\0') {
  				if (outfile != NULL && outfile != stdout)
 -					fclose(outfile);
 +					if (fclose(outfile) != 0) {
 +						warn("fclose()");
 +						unlink(tmpfname);
 +						exit(1);
 +					}
  				outfile = NULL;
 -				rename(tmpfname, fname);
 +				if (rename(tmpfname, fname) != 0) {
 +					/* this should not happen really! */
 +					warn("rename()");
 +					unlink(tmpfname);
 +					exit(1);
 +				}
  				*tmpfname = '\0';
  			}
  			outfname = NULL;
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/153261: commit references a PR
Date: Tue, 25 Jan 2011 23:05:14 +0000 (UTC)

 Author: jilles
 Date: Tue Jan 25 23:04:57 2011
 New Revision: 217864
 URL: http://svn.freebsd.org/changeset/base/217864
 
 Log:
   MFC r217134: sed: Add test for r217863 (-i race).
   
   r217863 is the MFC of r217133.
   
   PR:		bin/153261
 
 Added:
   stable/8/tools/regression/usr.bin/sed/inplace_race.t
      - copied unchanged from r217134, head/tools/regression/usr.bin/sed/inplace_race.t
 Modified:
   stable/8/tools/regression/usr.bin/sed/Makefile
 Directory Properties:
   stable/8/tools/regression/usr.bin/sed/   (props changed)
 
 Modified: stable/8/tools/regression/usr.bin/sed/Makefile
 ==============================================================================
 --- stable/8/tools/regression/usr.bin/sed/Makefile	Tue Jan 25 23:02:25 2011	(r217863)
 +++ stable/8/tools/regression/usr.bin/sed/Makefile	Tue Jan 25 23:04:57 2011	(r217864)
 @@ -3,3 +3,4 @@
  all:
  	@m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR}
  	@sh multitest.t
 +	@sh inplace_race.t
 
 Copied: stable/8/tools/regression/usr.bin/sed/inplace_race.t (from r217134, head/tools/regression/usr.bin/sed/inplace_race.t)
 ==============================================================================
 --- /dev/null	00:00:00 1970	(empty, because file is newly added)
 +++ stable/8/tools/regression/usr.bin/sed/inplace_race.t	Tue Jan 25 23:04:57 2011	(r217864, copy of r217134, head/tools/regression/usr.bin/sed/inplace_race.t)
 @@ -0,0 +1,83 @@
 +#!/bin/sh
 +
 +#-
 +# Copyright (c) 2011 Jilles Tjoelker
 +# All rights reserved.
 +#
 +# Redistribution and use in source and binary forms, with or without
 +# modification, are permitted provided that the following conditions
 +# are met:
 +# 1. Redistributions of source code must retain the above copyright
 +#    notice, this list of conditions and the following disclaimer.
 +# 2. Redistributions in binary form must reproduce the above copyright
 +#    notice, this list of conditions and the following disclaimer in the
 +#    documentation and/or other materials provided with the distribution.
 +#
 +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 +# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 +# SUCH DAMAGE.
 +#
 +# $FreeBSD$
 +
 +: "${SED=sed}"
 +
 +# This test really needs an SMP system. On an UP system, it will
 +# usually pass even if the race condition exists.
 +if command -v cpuset >/dev/null; then
 +	case `cpuset -g -p $$` in
 +	*,*) ;;
 +	*)
 +		echo '1..0 # Skipped: not an SMP system'
 +		exit 0 ;;
 +	esac
 +fi
 +
 +echo "1..1"
 +
 +T=$(mktemp -d "${TMPDIR:-/tmp}/sed-test.XXXXXX")
 +trap 'cd /; rm -rf "$T"' 0
 +cd "$T"
 +
 +data=abababab
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data=$data$data$data$data
 +data="BEGIN
 +$data
 +END"
 +for i in 0 1 2 3 4 5 6 7 8 9; do
 +	echo "$data" >file$i
 +done
 +len=${#data}
 +
 +i=0
 +while [ $i -lt 100 ]; do
 +	${SED} -i.prev "s/$i/ab/" file[0-9]
 +	i=$((i+1))
 +done &
 +sedproc=$!
 +
 +while :; do
 +	set -- file[0-9]
 +	if [ $# -ne 10 ]; then
 +		echo "not ok 1 inplace_race"
 +		exit 3
 +	fi
 +done &
 +checkproc=$!
 +
 +wait $sedproc
 +kill $checkproc 2>/dev/null
 +wait $checkproc >/dev/null 2>&1
 +if [ $? -ne 3 ]; then
 +	echo "ok 1 inplace_race"
 +fi
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: eadler 
State-Changed-When: Tue Mar 1 10:14:03 EST 2011 
State-Changed-Why:  
committed in head 

http://www.freebsd.org/cgi/query-pr.cgi?pr=153261 
State-Changed-From-To: patched->closed 
State-Changed-By: jhb 
State-Changed-When: Mon May 2 18:29:00 UTC 2011 
State-Changed-Why:  
Fix merged to 8 stable. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=153261 
>Unformatted:
