← 목록
기타 2026-07-09 5KB 읽기 5분

crownyc WS opcode(780~787) 슬롯→fd 번역 추가 (파동②P0-2)

개요

웹소켓카드(/Users/ef/crowny-rpnkit/라이브러리카드/웹소켓카드.md) 실측으로 발견된 함정1 — WS opcode(780~787)가 표준 소켓 API(소켓생성/소켓바인드/소켓수락)가 반환하는 VM 내부 "슬롯" 인덱스를 raw OS fd로 오인해 send()/recv()/poll()을 직접 호출해 실패하는 문제 — 를 수정했다. TCP대기/TCP수락(raw fd) 경로는 이미 정상 동작했으므로 그 경로를 깨지 않는 것이 핵심 제약이었다.

무엇을 했는지

  1. crownyc.c:2724 부근에 이미 있던 (전 세션이 만들어둔) ws_resolve_fd(int v) 헬퍼 함수를
WS opcode 780~787 각 케이스에 실제로 배선(총 8곳, crownyc.c:15478~15665 부근): fd 인자를 pop한 직후 va = ws_resolve_fd((int)va); 삽입. - 함수는 정의돼 있었지만 어디서도 호출되지 않는 죽은 코드였음(grep으로 확인).
  1. 1차 빌드 후 회귀 발견: TCP대기/TCP수락(raw fd) 경로가 오히려 깨짐(핸드셰이크 전부 실패,
웹소켓검증.sh §1 8/8 FAIL). 원인: sock_fds[SOCK_MAX]BSS 전역배열이라 미초기화 시 전부 0(값이 아닌 미할당 표시는 -1이어야 함)으로 남는다. sock_init()(배열을 -1로 채움)은 지금까지 sock_alloc()(소켓생성 계열)에서만 호출됐으므로, TCP대기/TCP수락만 쓰는 프로그램은 sock_init()이 한 번도 안 불려 sock_fds[]가 전부 0으로 남고, ws_resolve_fd(raw_fd)sock_fds[raw_fd]==0(>=0이므로 "할당된 슬롯"으로 오판)을 만나 raw fd(예: TCP수락이 반환한 4)를 엉뚱하게 fd 0(stdin)으로 오번역 → send/recv가 stdin/stdout에 걸려 전부 실패.
  1. 수정: ws_resolve_fd() 진입 시 sock_init()을 무조건 먼저 호출하도록 추가(idempotent,
sock_init_done 플래그로 중복 방지). 이후 미할당 인덱스는 sock_fds[v]==-1로 정확히 판별되어 raw fd 경로가 원래대로 그대로 통과된다.
  1. 재빌드(cc -O2 -o crownyc crownyc.c -lm -framework Security -framework CoreFoundation) 후
전체 회귀 재실행.

검증 결과

  • 웹소켓검증.sh 최종: PASS=13 FAIL=0 TRAP-CONFIRMED=1
  • §1 TCP대기/TCP수락(raw fd) 경로: 7/7 PASS (회귀 없음, 핸드셰이크101+Accept SHA1일치+에코+핑퐁+바이너리+닫기+정상종료)
  • §2 소켓생성/소켓바인드/소켓수락(슬롯) 경로: 6/6 PASS (신규 — 이전엔 전부 -1 실패하던 것이 이제 정상 동작, 별도 수동 스모크로 101+SHA1 accept 일치까지 재확인)
  • §3 WS바이너리 버퍼vs문자열 함정: 여전히 유효(TRAP-CONFIRMED, 이번 수정 범위 밖)
  • 전 회귀 하네스(crownyc는 모든 실행의 기반이라 파급 확인 필수):
  • /Users/ef/crowny-rpnkit/예제검증.sh 25/25 PASS
  • /Users/ef/crowny-rpnkit/대응카드/*.sh 5종 합계 65/65 PASS (HDL33, SQL13, 동적웹7, 앱UI7, 웹표현5)
  • /Users/ef/crowny-rpnkit/라이브러리카드/*.sh (웹소켓 제외) 5종 합계 41/41 PASS (로깅7, 정규식12, 직렬화9, 차트8, 테스트5)
  • 좀비 프로세스/포트 잔류 없음 확인(9470/9480 및 수동 테스트 포트 9491~9496 전부 정리).
  • 관련 파일

    • /Users/ef/CrownyOS/crownyc/crownyc.c — 패치 대상(ws_resolve_fd 정의 ~2724, 배선 8곳 ~15478~15665)
    • /Users/ef/CrownyOS/crownyc/crownyc.c.bak-20260708 — 패치 전 소스 백업
    • /Users/ef/CrownyOS/crownyc/crownyc.bak-20260708 — 패치 전 정본 바이너리 백업(728,120B)
    • /Users/ef/CrownyOS/crownyc/crownyc — 패치 후 정본 바이너리(재빌드, 742,048B)
    • /Users/ef/crowny-rpnkit/라이브러리카드/웹소켓카드.md — 카드 갱신(함정1 "수정완료" 표기, §5 완료요약 갱신)
    • /Users/ef/crowny-rpnkit/라이브러리카드/웹소켓검증.sh — §2 테스트가 (병행 작업 세션에 의해) 이미 "슬롯 경로 정상 동작 검증"으로 갱신돼 있었음(발견 시점 확인)

    참고: 병행 세션 충돌 없음 확인

    작업 도중 같은 crownyc.c/웹소켓검증.sh 파일이 다른 세션에 의해 동시 수정되고 있음을 발견했다 (예: crownyc.c에 무관한 opcode 944/945 다항곱NTT 기능이 추가됨, 웹소켓검증.sh §2가 이미 "실패 재현" 문구에서 "정상 동작 검증" 문구로 갱신돼 있었음). 두 세션의 변경이 서로 다른 코드 영역이라 충돌 없이 병합됐고, 최종 빌드+전 회귀 실행으로 공존 확인 완료.

    잔여 이슈

    • 웹소켓v2.한선(pkg/libs) 라이브러리는 여전히 소켓생성(2)(1-arg, arity 결함)로 소켓을 생성해
    그 자체로 실패한다. VM 차원 슬롯 지원은 됐으므로, 이 라이브러리의 호출부를 소켓생성(2,1) 2-arg로 고치면 정상화될 가능성이 높음(본 세션 범위 밖, 후속 과제로 남김).
    • WS바이너리(786)의 "버퍼핸들" 문서 vs "문자열핸들만 허용" 실제 구현 불일치는 별개 함정으로 미해결.
    • crownycode-learn.sh add "ws_resolve_fd_슬롯번역" ...로 패턴 학습 완료.