u/complete: fix TOCTOU race spawning duplicate copilot sessions

Use deterministic session ID derived from cwd hash instead of
timestamp. Concurrent invocations for the same directory now
converge on the same session name, and the server rejects the
duplicate atomically.
This commit is contained in:
Levi Neely 2026-05-03 14:08:15 +02:00
parent 3c03faed3a
commit ebea90d5f7
1 changed files with 21 additions and 15 deletions

View File

@ -46,28 +46,34 @@ done
# otherwise spawns a new one.
find_or_create_session() {
local target_cwd="$1"
local sdir state scwd id kv deadline
local id kv deadline
while IFS= read -r line; do
id=${line%%$'\t'*}
case "$id" in *-copilot) ;; *) continue ;; esac
sdir="$MOUNT/s/$id"
[ -d "$sdir" ] || continue
scwd=$(cat "$sdir/cwd" 2>/dev/null) || continue
[ "$scwd" = "$target_cwd" ] || continue
state=$(cat "$sdir/state" 2>/dev/null) || continue
case "$state" in failed*|error*) continue ;; esac
printf '%s\n' "$id"
return 0
done < "$MOUNT/s/idx"
# Deterministic name: one copilot session per cwd.
id="$(printf '%s' "$target_cwd" | cksum | awk '{print $1}')-copilot"
if [ -d "$MOUNT/s/$id" ]; then
local state
state=$(cat "$MOUNT/s/$id/state" 2>/dev/null) || true
case "$state" in
failed*|error*)
# Dead session — kill and recreate below.
printf 'kill\n' > "$MOUNT/s/$id/ctl" 2>/dev/null || true
sleep 0.1
;;
*)
printf '%s\n' "$id"
return 0
;;
esac
fi
id="$(date +%s%N)-copilot"
kv="name=${id}
cwd=${target_cwd}
agent=copilot
backend=${backend}
model=${model}"
printf '%s\n' "$kv" > "$MOUNT/s/new" || die "failed to create copilot session"
# If a concurrent invocation already created it, ignore the error.
printf '%s\n' "$kv" > "$MOUNT/s/new" 2>/dev/null || true
deadline=$(( $(date +%s) + 5 ))
until [ -d "$MOUNT/s/$id" ] || [ "$(date +%s)" -ge "$deadline" ]; do sleep 0.05; done