The daemon checks the length of the socket path first, before it reads
the config, takes the token lock, or opens the agent. With a data
directory whose path is too long, it gives the error and leaves the
directory empty, so a failed start leaves no agent or lock file behind.
Issue:
5daf23e
+ // Check the socket path before the daemon writes a file, so that a data
+ // directory with a long path stays empty.
+ socket := filepath.Join(dir, socketFileName)
+ err = checkSocketPath(socket)
+ if err != nil {
+ return err
+ }
+
config, err := loadConfig(dir)
if err != nil {
return err
config, err := loadConfig(dir)
if err != nil {
return err
err = errors.Join(err, memory.Close())
}()
err = errors.Join(err, memory.Close())
}()
- listener, err := listenSocket(filepath.Join(dir, socketFileName))
+ listener, err := listenSocket(socket)
if err != nil {
return err
}
if err != nil {
return err
}
require.ErrorContains(t, err, "set ONECHAT_DIR to a shorter path")
}
require.ErrorContains(t, err, "set ONECHAT_DIR to a shorter path")
}
+func TestDaemonWritesNoFileForALongSocketPath(t *testing.T) {
+ dir := filepath.Join(t.TempDir(), strings.Repeat("d", 100))
+ t.Setenv("ONECHAT_DIR", dir)
+
+ err := daemon(t.Context(), io.Discard)
+ require.ErrorContains(t, err, "set ONECHAT_DIR to a shorter path")
+
+ entries, err := os.ReadDir(dir)
+ require.NoError(t, err)
+ require.Empty(t, entries)
+}
+
func TestOneProcessHoldsTheTokens(t *testing.T) {
dir := t.TempDir()
lock, err := lockTokens(dir)
func TestOneProcessHoldsTheTokens(t *testing.T) {
dir := t.TempDir()
lock, err := lockTokens(dir)