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) 경로는 이미 정상 동작했으므로 그 경로를 깨지 않는 것이 핵심 제약이었다.
무엇을 했는지
crownyc.c:2724부근에 이미 있던 (전 세션이 만들어둔)ws_resolve_fd(int v)헬퍼 함수를
crownyc.c:15478~15665 부근):
fd 인자를 pop한 직후 va = ws_resolve_fd((int)va); 삽입.
- 함수는 정의돼 있었지만 어디서도 호출되지 않는 죽은 코드였음(grep으로 확인).
- 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에 걸려 전부 실패.
- 수정:
ws_resolve_fd()진입 시sock_init()을 무조건 먼저 호출하도록 추가(idempotent,
sock_init_done 플래그로 중복 방지). 이후 미할당 인덱스는 sock_fds[v]==-1로 정확히 판별되어
raw fd 경로가 원래대로 그대로 통과된다.
- 재빌드(
cc -O2 -o crownyc crownyc.c -lm -framework Security -framework CoreFoundation) 후
검증 결과
웹소켓검증.sh 최종: PASS=13 FAIL=0 TRAP-CONFIRMED=1/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)관련 파일
/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 결함)로 소켓을 생성해
소켓생성(2,1) 2-arg로
고치면 정상화될 가능성이 높음(본 세션 범위 밖, 후속 과제로 남김).
- WS바이너리(786)의 "버퍼핸들" 문서 vs "문자열핸들만 허용" 실제 구현 불일치는 별개 함정으로 미해결.
crownycode-learn.sh add "ws_resolve_fd_슬롯번역" ...로 패턴 학습 완료.