← 목록
기타 2026-05-28 4KB 읽기 4분

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소켓연결(슬롯, 호스트, 포트)호스트=str1=성공, -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 구현 참조

잔여 이슈

  1. VM 스택 손상: _헤더후본문 같은 큰 문자열 슬라이스 함수 호출 시 PC 손상.
crownyc.c 측 근본 패치 필요. 현재는 인라인으로 우회.
  1. TLS 경로 미검증: HTTP만 검증 (로컬직통 127.0.0.1:4100). HTTPS는 별도 검증 필요.
  2. 웹소켓 코드: 소켓 <= 0 한 곳 남음 (라인 1644). HTTPS 경로의 TLS 슬롯 반환값과 별개라 별도 검증 후 정리.

학습DB

crownyc_socket_client_fetch intent 등록 완료.