}
oldData = x
case fs.ModeSymlink:
- buf := make([]byte, unix.PathMax)
+ buf := make([]byte, unix.PathMax+1)
n, err := unix.Readlinkat(parentFd, baseName, buf)
if err != nil {
- return fmt.Errorf("reading old content: %v", err)
+ return fmt.Errorf("reading old target: %v", err)
+ }
+ if n == len(buf) {
+ // Cannot differentiate between exact match and truncation.
+ // This shouldn't occur with unix.PathMax but let's be
+ // careful.
+ return fmt.Errorf("old path possibly truncated")
}
oldData = buf[:n]
}