mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-18 02:48:40 +00:00
![James Tucker](/assets/img/avatar_default.png)
The intent of atomicfile is to overwrite regular files. Most use cases that would overwrite irregular files, unix sockets, named pipes, devices, and so on are more than likely misuse, so disallow them. Fixes #7658 Signed-off-by: James Tucker <james@tailscale.com>
39 lines
975 B
Go
39 lines
975 B
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
//go:build !js && !windows
|
|
|
|
package atomicfile
|
|
|
|
import (
|
|
"net"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestDoesNotOverwriteIrregularFiles(t *testing.T) {
|
|
// Per tailscale/tailscale#7658 as one example, almost any imagined use of
|
|
// atomicfile.Write should likely not attempt to overwrite an irregular file
|
|
// such as a device node, socket, or named pipe.
|
|
|
|
d := t.TempDir()
|
|
special := filepath.Join(d, "special")
|
|
|
|
// The least troublesome thing to make that is not a file is a unix socket.
|
|
// Making a null device sadly requries root.
|
|
l, err := net.ListenUnix("unix", &net.UnixAddr{Name: special, Net: "unix"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer l.Close()
|
|
|
|
err = WriteFile(special, []byte("hello"), 0644)
|
|
if err == nil {
|
|
t.Fatal("expected error, got nil")
|
|
}
|
|
if !strings.Contains(err.Error(), "is not a regular file") {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
}
|