MKTEMP(3)

명칭
mktemp - 일의인 일시파일명을 작성

프로그램 라이브러리
libc

서식
<unistd.h> char * mktemp(char *template) int mkstemp(char *template) int mkstemps(char *template, int suffixlen) char * mkdtemp(char *template)

해설
mktemp() 함수는, 주어진 파일명 템플릿의 일부를 고쳐 써 파일명을 작성합니다. 이 파일명은, 함수가 불렸을 때에 존재하고 있지 않는 것이 프로텍션되고 있어 어플리케이션에서의 사용에 적절하고 있습니다. 템플릿으로서는, /tmp/temp.XXXXXX (와)과 같이, 임의의 파일명에 수형의 캐릭터 ‘X’ 하지만 붙어 있는 것이 사용됩니다. 뒤로 계속된다 ‘X’ (은)는, 영숫자의 일의의 편성으로 옮겨집니다. mktemp() 하지만 되돌리는 일의적인 파일명의 수는, ‘X’ 의 수에 의해 정해집니다. ‘X’ 하지만 6 자리수인 경우, 56800235584 (62 ** 6) 방법의 가능한 일시파일명으로부터 mktemp() 에 의해 하나 선택됩니다.

mkstemp() 함수는, 템플릿을 똑같이 옮겨놓아 모드 0600 으로 템플릿 파일을 작성해, 읽고 쓰기용으로서 오픈한 파일 기술자를 돌려줍니다. 이렇게 하는 것으로, 파일의 존재를 확인하는 것으로 사용하기 위해서 오픈하는 것으로의 사이의 경합 상태를 피할 수 있습니다.

mkstemps() (은)는, 템플릿에 사픽스를 포함할 수가 있는 것을 제외해 mkstemp() (와)과 같게 동작합니다. 템플릿은, /tmp/tmpXXXXXXsuffix 그렇다고 하는 형식일 필요가 있습니다. mkstemps() (은)는, 사픽스 캐릭터 라인의 길이를 필요로 합니다.

mkdtemp() 함수는, 템플릿을 mktemp(3) (와)과 같이 옮겨놓아 모드 0700 으로 템플릿 디렉토리를 작성합니다.

반환값
성공했을 경우, mktemp() 함수와 mkdtemp() 함수는, 템플릿에의 포인터를 돌려주어, 실패했을 경우 NULL (을)를 돌려줍니다. mkstemp() 함수와 mkstemps() 함수는, 적절한 파일을 작성할 수 없는 경우에 -1 를 돌려줍니다. 어느 함수 소환에서도 에러가 발생하면(자), 에러 코드가 글로벌 변수 errno 에 기입해집니다.

에러
mkstemp(), mkstemps(), mkdtemp() 함수는, 이하의 값중 1 개(살)을 errno (으)로 설정합니다.

[ENOTDIR]
    템플릿의 패스명 부분이, 존재하는 디렉토리가 아닙니다.

mkstemp(), mkstemps(), mkdtemp() 함수는, stat(2) 함수로 규정되는 어느 값도 errno (으)로 설정할 가능성이 있습니다.

mkstemp() 함수와 mkstemps() 함수는, open(2) 함수로 규정되는 어느 값도 errno (으)로 설정할 가능성이 있습니다.

mkdtemp() 함수는, mkdir(2) 함수로 규정되는 어느 값도 errno (으)로 설정할 가능성이 있습니다.

주
코어덤프를 일으키는 문제로서 자주 있는 것은, 프로그래머가, mktemp(), mkstemp(), mkstemps(), mkdtemp() 에 독포함 전용 캐릭터 라인을 건네주고 있는 것입니다. 이 문제는, isoC 컴파일러가 보급하기 전에 개발된 프로그램으로 많이 볼 수 있습니다. 예를 들어 인수 "/tmp/tempfile.XXXXXX" (을)를 지정해 mkstemp() (을)를 호출하면(자), mkstemp() 하지만, 지정된 캐릭터 라인 정수를 고쳐 쓰려고 코어덤프가 일어납니다. 문제를 일으키는 프로그램이, 이러한 함수 소환을 빈번하게 가고 있는 경우는, 메모리의 기록 가능 세그먼트(segment)에 캐릭터 라인 정수를 보관 유지하도록(듯이) 프로그램을 컴파일 할 수도 있습니다. 상세한 것에 대하여는, gcc(1) (을)를 참조해 주세요.

버그
이 함수군은 추측 가능한 파일명을 생성합니다만, ‘X’ 의 수를 많이 해 작성 가능한 일시파일명의 수를 늘리는 것으로, 추측되는 위험을 최소화합니다. mktemp() 그럼, 어느 파일이 존재할까의 테스트 ( mktemp() 함수 호출안)과 그 파일을 사용하기 위한 오픈 (그 후의 유저 어플리케이션안)(와)과의 사이에 경합이 발생해, 이것은 보안의 면으로부터 봐, 매우 위험합니다. mkstemp() 에는 경합 상태가 없기 때문에, 가능한 한, 이 함수를 사용해야 하는 것이지요. 만약 mkstemp() 하지만 사용할 수 없는 경우는, mktemp() 그리고 생성된 파일명을 open(2) 그리고 열릴 때에 O_EXCL 플래그를 붙이도록(듯이) 해, 실패하고 있지 않는가 반환값을 테스트해야 하겠지요. 이렇게 하는 것에 의해, 공격자가 파일의 내용을 조작하거나 읽거나 하는 의도를 가져 파일을 이미 작성해도, 프로그램이 함부로 동작을 계속하는 것이 없어집니다.

관련 항목
chmod(2), getpid(2), mkdir(2), open(2), stat(2)

역사
mktemp() 함수는, AT&T UNIX 그리고 등장했습니다. mkstemp() 함수는, 4.4BSD 그리고 등장했습니다. mkdtemp() 함수는, OpenBSD 2.2 그리고 처음 등장해, 그 후 FreeBSD 3.2 그리고 등장했습니다. mkstemps() 하 OpenBSD 2.4 그리고 처음 등장해, 그 후 FreeBSD 3.4 그리고 등장했습니다.