strncat_safe(3)

char *strncat_safe(char *dest, size_t dest_size, const char *src, size_t src_len)

strncat(3)함수는 buffer overflow를 유발할 수 있어서, 보안 취약함수로 정의되어 있습니다. 보안 취약 함수로 지정된 이유는 dest의 buffer 크기보다 dest와 src의 문자열을 합친 것이 크면 제어하는 방법이 없는 함수이기 때문입니다. 그래서 큰 규모의 프로젝트에서는 대체로 사용금지 함수로 지정되어 있습니다.

일부 UNIX에서는 snprintf(dest, sizeof(dest), "%s%.*s", dest, src_len, src);와 같이 사용할 수 있습니다만, LINUX에서는 오류가 발생합니다. 

이 결과는 snprintf(dest, sizeof(dest), "%.*s", src_len, src);와 같습니다.

 

따라서 strncat(3)를 대체할 표준함수로 없기 때문에 별도로 만들어 사용해야 합니다.

 

 

파라미터

dest
    - 문자열을 붙여서 저장할 저장소
dest_size
    - dest에 할당된 buffer의 크기
src
    - 문자열에 추가할 데이터
src_len
    - 문자열에 추가할 최대 길이

 

RETURN

dest
    - dest 문자열이 그대로 return 됩니다.

 


Source 구현

 

strncat_safe 소스

#include <stdio.h>
#include <string.h>

char *strncat_safe(char *dest, size_t dest_size, const char *src, size_t src_len)
{
    int dest_len = strlen(dest);

    if(dest_len >= dest_size) {
        return dest;
    }

    snprintf(dest + dest_len, dest_size - dest_len, "%.*s", (int)src_len, src);

    return dest;
}

 

 


 

strncat_safe( ) 사용 예제

#include <stdio.h>
#include <string.h>

......



int main(int argc, char **argv)
{
    char dest[40];
    char src[15];

    ......

    strncat_safe(dest, sizeof(dest), src, sizeof(src));

    ......

}

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , , ,

댓글을 달아 주세요