]> git.giacomolli.uk - onechat/commitdiff
Check the socket path before the daemon writes
authorAnderson A. Giacomolli <agiacomolli@gmail.com>
Sat, 7 Nov 2026 02:53:53 +0000 (23:53 -0300)
committerAnderson A. Giacomolli <agiacomolli@gmail.com>
Sat, 7 Nov 2026 02:53:53 +0000 (23:53 -0300)
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

daemon.go
daemon_test.go

index 034cac7fdd43af811b70e84ed1aa203d6ab43c44..58bf502b5bba1b31d226f9439ac9038310a253ad 100644 (file)
--- a/daemon.go
+++ b/daemon.go
@@ -56,6 +56,14 @@ func daemon(ctx context.Context, out io.Writer) (err error) {
                return err
        }
 
+       // 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
@@ -90,7 +98,7 @@ func daemon(ctx context.Context, out io.Writer) (err error) {
                err = errors.Join(err, memory.Close())
        }()
 
-       listener, err := listenSocket(filepath.Join(dir, socketFileName))
+       listener, err := listenSocket(socket)
        if err != nil {
                return err
        }
index 91d6ecc8658095f12c6be089e2b229ab7db83889..fe409293d85f50638eeb7cc017942e0e19488e01 100644 (file)
@@ -116,6 +116,18 @@ func TestListenSocketRefusesALongPath(t *testing.T) {
        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)