crownyc 소켓 검증 — 크라우니브라우저 HTTP fetch 복구
개요
crownyc VM의 소켓 클라이언트 시퀀스를 단위 검증하고, 크라우니브라우저 HTTP스택.한선이 실제 docs.crowny.org로 fetch에 성공하도록 복구.
검증된 사실 — 소켓 함수 시그니처
/Users/ef/CrownyOS/crownyc/crownyc.c 라인 8543-8645 직접 분석.
| opcode | 한선 | 시그니처 | 반환 |
|---|---|---|---|
| 370 | 소켓생성(domain, type) | 2=AF_INET, 1=SOCK_STREAM | 슬롯번호(0~) 또는 -1 |
| 374 | 소켓연결(슬롯, 호스트, 포트) | 호스트=str | 1=성공, -1=실패 |
| 375 | 소켓보내기(슬롯, 문자열) | — | 전송 바이트수 |
| 376 | 소켓받기(슬롯, 최대길이) | 최대=정수 (필수) | 응답 문자열 핸들 |
| 377 | 소켓닫기(슬롯) | — | — |
소켓생성() 인자 없이 호출 → stack underflow → -1.
핵심: 첫 소켓 슬롯이 0 이므로 소켓 <= 0은 잘못된 유효성 검사. < 0만 써야 한다.검증 시나리오 (소켓검증.한선)
/Users/ef/crowny-local/소켓검증.한선
| 단계 | 결과 |
|---|---|
| 소켓생성() (인자 없음) | -1 (실패) |
| 소켓생성(2, 1) | 슬롯 0 (성공) |
| 소켓연결(0, 127.0.0.1, 4100) | 1 |
| 소켓보내기(0, "GET / ...") | 60 바이트 |
| 소켓받기(0, 8192) | 6892 바이트 — HTTP/1.1 200 OK |
| 소켓닫기(0) | 0 |
HTTP스택.한선 발견 버그 4종
/Users/ef/CrownyBrowser/src/v2/HTTP스택.한선
B1. 소켓생성 인자 누락 (라인 639, 731, 1636 — 수정 완료)
javascript; 변경 전
소켓 = 소켓생성()
; 변경 후
소켓 = 소켓생성(2, 1)
B2. 소켓받기 size 인자 누락 (라인 751, 885, 910, 1044, 1057, 1643, 1672 — 수정 완료)
javascript; 변경 전 — stack underflow → -1
변수 청크 = 소켓받기(소켓)
; 변경 후
변수 청크 = 소켓받기(소켓, 8192)
B3. 슬롯 0을 무효로 판정 (라인 643, 700-710 — 수정 완료)
javascript; 변경 전 — 첫 소켓이 항상 0 슬롯이라 항상 실패
만약 (소켓 <= 0) { 반환 0 }
함수 _연결유효(연결) { 반환 소켓 > 0 }
; 변경 후
만약 (소켓 < 0) { 반환 0 }
함수 _연결유효(연결) { 반환 소켓 >= 0 }
B4. _헤더후본문 / _청크디코딩 함수 호출 시 VM 스택 손상 (라인 926/921 — 인라인으로 우회)
증상: _HTTP요청내부가 _헤더후본문(응답원문) 호출 후 함수 반환 없이 main이 다시 시작. 매번 새 맵 핸들 발급되어 메모리 24786씩 감소하며 무한루프.
우회: chunked 처리와 본문 분리 로직을 인라인 코드로 풀어서 작성. 함수 호출 회피.
원인 추정: 6KB+ 응답 문자열을 인자로 전달 + 함수 안에서 또 부분() 호출이 누적되어 어떤 임계값을 넘으면 PC가 첫 함수로 점프. crownyc.c 컴파일러 측 패치가 필요. C 소스 수정 권한 사용자에게 제안:
_헤더후본문같은 큰 문자열 슬라이스 반환 함수에서 PC 손상- 함수 콜 스택 또는 str_handle GC 상호작용 의심
- 재현 최소 케이스: 6KB+ 문자열을 인자로 받아
반환 부분(s, n, 글자수(s))하는 함수 호출 직후 다음 라인 실행 불가
동작하는 fetch 결과
HTTP요청("http://docs.crowny.org/", "GET", 0, "")
→ 상태: 200
→ 본문길이: 9021 바이트 (chunked 디코딩 후)
관련 파일
/Users/ef/crowny-local/소켓검증.한선— 소켓 시그니처 단위 검증 (신규)/Users/ef/CrownyBrowser/src/v2/HTTP스택.한선— 4종 버그 수정/Users/ef/CrownyOS/crownyc/crownyc.c라인 8543-8645 — 소켓 opcode 구현 참조
잔여 이슈
- VM 스택 손상:
_헤더후본문같은 큰 문자열 슬라이스 함수 호출 시 PC 손상.
- TLS 경로 미검증: HTTP만 검증 (로컬직통 127.0.0.1:4100). HTTPS는 별도 검증 필요.
- 웹소켓 코드:
소켓 <= 0한 곳 남음 (라인 1644). HTTPS 경로의 TLS 슬롯 반환값과 별개라 별도 검증 후 정리.
학습DB
crownyc_socket_client_fetch intent 등록 완료.