Linux, 6년·360개 이상 패치 끝에 strncpy API 제거

1 hour ago 1
  • Linux 7.2에서 커널 내부의 strncpy API 사용처가 사라지며, 오래전부터 폐기 예정이던 문자열 복사 인터페이스가 최종 제거됨
  • strncpy()는 지정한 바이트 수만큼 복사하지만 NUL 종료 동작이 직관적이지 않아, 커널에서 수년간 버그의 원인으로 남아 있었음
  • 목적지 버퍼를 불필요하게 0으로 채우는 특성은 성능 문제까지 만들었고, 이를 걷어내는 데 약 6년과 362개 커밋이 필요했음
  • 금요일 머지에서 API 본체뿐 아니라 마지막 per-CPU 아키텍처별 구현도 함께 제거됨
  • 커널 코드는 이제 용도에 따라 strscpy(), strscpy_pad(), strtomem_pad(), memcpy_and_pad(), memcpy() 같은 대체 함수를 골라야 함

Linux 7.2에서 사라진 strncpy

  • Linux 7.2는 커널에서 오래전부터 폐기 예정이던 strncpy API를 최종 제거함
  • 6년에 걸친 정리 작업 끝에 커널 내부에서 strncpy 인터페이스를 쓰는 코드가 더 이상 남지 않게 됨
  • 이번 변경은 단순한 함수 교체가 아니라, 오래된 문자열 복사 관행을 커널 전반에서 걷어낸 작업에 가까움

제거까지 걸린 작업 규모

  • strncpy 제거에는 약 362개 커밋이 필요했음
  • 작업은 커널 내부의 strncpy 사용 코드를 단계적으로 없애는 방식으로 진행됨
  • Linux 7.2에서 이 정리 작업이 완료 지점에 도달함

strncpy가 커널에서 문제가 된 이유

  • strncpy는 Linux 커널 안에서 수년간 지속적인 버그 원인으로 여겨졌음
  • 특히 두 가지 동작이 문제였음
    • NUL 종료 의미와 동작이 직관적이지 않아 사용자가 실수하기 쉬움
    • 목적지 버퍼를 중복으로 0 채움해 불필요한 성능 비용이 생김

실제 제거 머지

  • 금요일에 이뤄진 머지가 strncpy API를 제거함
  • 같은 머지에서 마지막 per-CPU 아키텍처별 strncpy 구현도 함께 사라짐

커널 코드에서 쓸 대체 API

  • strncpy 대신 복사 대상과 종료 조건에 맞는 함수를 선택해야 함
    • strscpy(): NUL 종료되는 목적지에 사용
    • strscpy_pad(): NUL 종료되는 목적지에 0 패딩이 필요한 경우 사용
    • strtomem_pad(): NUL 종료되지 않는 고정 폭 필드에 사용
    • memcpy_and_pad(): 명시적 패딩이 있는 제한된 복사에 사용
    • memcpy(): 길이를 알고 있는 메모리 복사에 사용
Read Entire Article