From: David du Colombier <0intro@gmail.com> Date: Thu, 19 Dec 2013 20:20:03 +0000 (+0100) Subject: os: rename only works as part of the same directory on Plan 9 X-Git-Tag: go1.3beta1~1138 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=16dcef80d46d78cc198bfc680e9cf05cea9095cc;p=gostls13.git os: rename only works as part of the same directory on Plan 9 R=golang-dev, lucio.dere, rsc CC=golang-dev https://golang.org/cl/44080046 --- diff --git a/src/pkg/os/file_plan9.go b/src/pkg/os/file_plan9.go index 278fae772c..102ad5f892 100644 --- a/src/pkg/os/file_plan9.go +++ b/src/pkg/os/file_plan9.go @@ -6,6 +6,7 @@ package os import ( "runtime" + "strings" "syscall" "time" ) @@ -314,6 +315,15 @@ func Remove(name string) error { } func rename(oldname, newname string) error { + dirname := oldname[:strings.LastIndex(oldname, "/")+1] + if strings.HasPrefix(newname, dirname) { + newname = newname[len(dirname):] + } + + // If newname still contains slashes after removing the oldname + // prefix, the rename is cross-directory and must be rejected. + // This case is caught by d.Marshal below. + var d syscall.Dir d.Null() @@ -322,10 +332,10 @@ func rename(oldname, newname string) error { buf := make([]byte, syscall.STATFIXLEN+len(d.Name)) n, err := d.Marshal(buf[:]) if err != nil { - return &PathError{"rename", oldname, err} + return &LinkError{"rename", oldname, newname, err} } if err = syscall.Wstat(oldname, buf[:n]); err != nil { - return &PathError{"rename", oldname, err} + return &LinkError{"rename", oldname, newname, err} } return nil }