Enlightenment E16의 20년 된 버그를 고치기
·2026.04.15 13:47
핵심 내용
E16의 중첩 텍스트 맞춤 로직이 뉴턴식 탐색에 빠져 무한 루프에 걸렸다.
1 / 2
자세히 보기
Enlightenment E16에서 중간 생략(middle ellipsis) 텍스트 맞춤 루틴이 특정 긴 창 제목에서 무한 반복에 빠지는 문제를 추적해 수정했다.
문제는 PDF를 열 때 데스크톱이 멈추는 현상으로 드러났고, gdb로 보면 imlib2의 글꼴 캐시 내부가 아니라 그 바깥의 텍스트 폭 계산 루프가 계속 재시도 중이었다. 샘플을 여러 번 뜯어보니 상태가 두 값 사이를 오가는 2-state oscillation이 관찰됐다.
핵심 원인은 TextstateTextFitMB()와 ASCII 버전의 탐색 로직이었다.
- 문자열 가운데를 잘라
...을 넣고 - 남은 폭을 다시 측정한 뒤
- 뉴턴식 추정으로
nuke_count를 늘리거나 줄이는 구조였는데 - iteration limit이 없어서 발산하거나 진동하면 끝나지 않았다.
또한 종료 조건이 너무 빡빡했다.
- 허용 범위는
nc2 >= 0 && nc2 < 3*cw - 짧은 문자열은 대개
1칸씩 조정돼 수렴했지만 - 길고 애매한 제목은 두 지점을 계속 오가며 멈췄다
수정에서는 두 경로(멀티바이트/ASCII)에 동일한 방어 로직을 넣었다.
- 반복 횟수를 32회로 제한하고, 그 이후에는 현재 시도가 맞으면 수용
nuke_count를 루프 안에서 최소 1로 고정해 음수 보정으로 인한 이상 문자열을 방지cw를 최소 1로 고정해 폭이 0에 가까운 경우의 나눗셈 문제를 차단
재현 사례는 길이가 긴 창 제목이었다. 예시처럼 81 wide chars 정도의 제목이 약 291px 정도의 제목 슬롯에 들어가려 할 때 문제가 터졌다.
글은 마지막에, 오래된 코드일수록 이런 수동 최적화와 휴리스틱이 숨어 있고, 의도치 않은 버그가 장기간 살아남을 수 있다는 점도 짚는다. 최근 커널 stable 패치 사례와 XZ 백도어 사례를 언급하며, 공급망이나 유지보수 과정에서 생기는 작은 실수도 큰 장애로 이어질 수 있다고 경고한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.