macOS에서 잘 돌아가던 게 Windows에서 온갖 곳에서 터졌다. 이틀 동안 Windows 호환성만 잡았다.
WinError 87
os.kill(pid, 0)가 Windows에서 안 된다. 리눅스/맥에서는 프로세스 존재 여부 체크하는 관용적인 방법인데, Windows는 이 시그널 자체를 지원 안 함. Monitor AI랑 Runner AI에서 프로세스 상태 확인할 때 쓰고 있었는데, 전부 ctypes.windll.kernel32.OpenProcess로 바꿔야 했다.
보안 구멍들
크로스플랫폼 작업하면서 보안 점검도 같이 했는데, 생각보다 구멍이 많았다.
BLOCKED_CHARS에서 &&만 막고 있었는데, Windows cmd.exe는 & 하나로도 명령어 체이닝이 된다. > 리다이렉션도 마찬가지. 전부 단일 문자로 막도록 바꿨다.
경로 순회 방지도 문제였다. 기존엔 /로 시작하는지만 체크했는데, Windows의 C:\... 같은 절대경로는 통과해버리는 거였다. Path.resolve()로 실제 해석된 경로가 staging 루트 안에 있는지 확인하는 방식으로 바꿨다.
python3 스텁
이건 좀 웃긴 건데, Windows에서 shutil.which("python3") 하면 Microsoft Store의 가짜 stub이 잡힌다. WindowsApps/python3.EXE라는 놈인데, 실행하면 Store 페이지만 열림. sys.executable로 현재 실행 중인 Python을 직접 쓰도록 바꿨다.
venv 활성화
source bin/activate가 당연히 Windows에서 안 된다. activate.bat &&로 바꿔야 하고, 서브프로세스도 cmd /c로 감싸야 했다. env_strategy.py 전체를 OS별 분기 처리했는데, 코드가 좀 지저분해진 건 아쉽다.
그래도 이 작업 끝나고 나서 크로스플랫폼 테스트 6개가 전부 통과했을 때는 좀 시원했다.