Skip to content

[FB-249] 프로토콜·입력 검증·테이블 로더 잔여 결함 모음 #670

Closed

Description

@boyism80
  • 심각도: low
  • 근거 강도: 항목별 보통~약함
  • 대상 커밋: 8576836 (대표 항목은 이 HEAD에서 코드로 다시 확인, 나머지는 기록 당시 판단 기준이라 수정 확인 때 항목별로 다시 봐요)
  • 출처: P09·P17·P18 회차(89·98·142·151·164·179·186·188·218·220회차 등)

이 이슈는 '기준 미달 후보도 모두 이슈로 등록'(2026-10-16 사용자 지시)에 따라, 과거 정기 검수·push 리뷰에서 기록만 하던 후보를 영역별로 모은 것이에요. 항목마다 데이터 복제·크래시·로그인 불가가 아니어서 이전 기준에는 못 미쳤어요. 이미 고쳐진 것, 기존 이슈와 겹치는 것, 예외 목록·사용자 확인 의도, 크래시 전제 시나리오는 뺐어요. 항목별로 따로 처리하기 원하시면 나눌게요.

항목

  1. spell_cast v550/v565 INPUT parse가 NUL 종단 없는 수신 버퍼를 C 문자열로 읽음(힙 over-read 최대 ~17바이트, 변조 클라이언트 전용) — cast.cpp:78-80
  2. INPUT 주문 message 길이 무제한(chat은 255)
  3. FlatBuffer Deserialize에 Verifier 없음(내부 신뢰 경로), typed POST/GET이 HTTP 상태·protocol_type 미대조로 비FB 오류 본문이면 GetRoot OOB
  4. http_client: 128 슬롯 공유·큐 대기 중 deadline 미시작, async_resolve가 socket.cancel 범위 밖, pivot 만료 시 원격 성공도 예외, 예외가 never-sent/maybe-applied 미구분
  5. update_option 잘못된 OPTION 값은 처리기 예외, success=false인데 로컬 적용
  6. NPC click 거리·시야 검사 없음(원거리 NPC 대화)
  7. 꾸민 채팅 이름: 메시지가 255바이트를 넘으면 길이 바이트 절단, dialog menu/list S2C 개수 uint8 절단
  8. stream: endian #ifdef BE 분기, writer 길이 절단, BOT decompress 빈 입력 무한 루프, iconv 결과 미검사, name_with 빈 문자열 out_of_range
  9. blocked_word/name aho_corasick이 첫 parse_text 때 failure 링크를 지연 구성(플래그 먼저 true) → 시작·리로드 직후 동시 채팅 시 nullptr 역참조 가능
  10. table _keep_alive가 패치마다 39개 테이블 전체 세대를 해제 없이 보존(메모리)
  11. service::schedule _tasks가 리로드 뒤 인덱스 미재구성, schedule::poll 전역 1초 타이머 겹침 방지 없음(공지 2회·기간 재추첨)
  12. weather reroll/sync _segments 무락 재구성, rebuild_rezens 중 옛 rezen spawn 잔여, C# AbilityStackedExp 무락 재구성, publish 루프 세대 혼재
  13. 윤달이면 음력 이벤트 전부 비활성, 음력 변환이 UTC+8 기준, 조합 트리가 연속 구간만 매칭, name2item_prefix 세대 포인터, add_exp uint32 절단
  14. npc_spawner operator[] 예외(시작 때만)
  15. 도감: mob 이름 중복 '지하대나무'로 개수·비트마스크 불일치, 로그인·이동마다 해금 수만큼 flag 패킷
  16. Redis 캐시 옛 UUID 문자열 잔존 시 역직렬화 실패(배포 전환 1회), ESCROW listing_id null→0
  17. map-editor: warp 시트 이름 없는 주석 열 어긋남, MCP HTTP 루프백 무인증·Origin 미검사, ServerMap.Read 길이 검사 없음

수정 방향

  • 문자열 파싱은 길이 기반으로 바꾸고 입력 길이 상한을 둬요. Verifier와 HTTP 상태 검사를 추가해요.
  • aho_corasick은 로드 끝에서 구성까지 마쳐 게시해요. _keep_alive는 참조가 끝난 세대를 해제해요.
  • schedule은 리로드 때 _tasks를 다시 만들고 poll 겹침을 막아요. 테이블 로드 때 이름 중복·범위를 검사해요.

Activity

  1. boyism80 commented on Oct 16, 2026

    @boyism80
    OwnerAuthor

    [FB 리뷰어] 사용자 지시(2026-10-17 00:10 KST)에 따라 기준 미달 항목은 이슈 대상에서 제외해 not planned로 닫아요. 내용은 audit 문서에 남겨 두고, 앞으로 기준 미달 항목은 묶음 브리핑에 한 줄로만 알려요.

  2. boyism80 commented on Oct 16, 2026

    @boyism80
    OwnerAuthor

    [FB 리뷰어] 사용자 지시(2026-10-17 00:14 KST): 메모리 누수 가능성이 있는 항목은 기준 미달로 분류하지 않아요. 그래서 이슈를 다시 열어요. 남은 항목은 10번(table _keep_alive가 패치할 때마다 테이블 39개의 이전 세대를 해제하지 않고 계속 보존)이에요. 나머지 항목은 기준 미달이라 대상에서 빼고 audit 문서에만 남겨요.

  3. boyism80 commented on Oct 16, 2026

    @boyism80
    OwnerAuthor

    [FB 리뷰어] 항목 10 부분 해결 (f4fc989 / data-converter e5c2c451)

    Template/C++/container.txt의 table_slot::publish가 _keep_alive에서 use_count()==1(벡터만 보유)인 세대를 제거하도록 바뀌었습니다. 핫패치마다 39개 테이블 세대가 무한히 쌓이던 누수 경로에 대한 템플릿 수정입니다.

    아직 fb include/fb/model/model.h에는 반영되지 않았습니다. update-data.bat 재생성 커밋이 오면 항목 10을 다시 확인해 닫겠습니다. 이슈는 open 유지합니다.

    참고: 객체는 _model_id로 현재 세대를 다시 조회하고, collection_mob도 매 호출 조회라 의도된 pin 모델과 맞습니다. 스냅샷 없이 리로드를 가로지르는 raw 참조는 기존 주석대로 금지입니다.

  4. boyism80 commented on Oct 16, 2026

    @boyism80
    OwnerAuthor

    [FB 리뷰어]
    ce5d1119d에서 include/fb/model/model.h 재생성(17 Oct 2026)과 함께 table_slot::publish의 use_count()>1 keep_alive 정리가 반영됐습니다. data-converter container.txt와 일치해 FB-249 항목10(테이블 세대 drop)은 해결로 닫습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions