Superkkt Blog

Code:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

int
main(void)
{
        int fd;
        pid_t pid;
        char buf[1024];
        char tmp_file[] = "/tmp/miniftpd.XXXXXX";

        fd = mkstemp(tmp_file);
        unlink(tmp_file);
        write(fd, "test", 4);

        pid = fork();

        if(pid == 0) {
                lseek(fd, 0, SEEK_SET);
                memset(buf, 0, 1024);
                read(fd, buf, 1024);
                fprintf(stderr, "%s\n", buf);
        }

        return 0;
}

임시파일 생성 후 바로 unlink를 하기 때문에 다른 유저들은 파일을 볼 수 없다. 하지만 파일을 열고있는 프로세스가 있기때문에 실제론 파일이 존재한다. fork() 후에도 자식 프로세스가 그 파일을 그대로 쓸 수 있기 때문에 locking만 제대로걸어준다면 부모/자식간의 통신에 이용 할 수 있다.

임시파일 생성하는 mkstemp()는 다른 임시파일 관련 함수들이 가지고 있는 보안상의 문제를 해결한 함수이다.template로 사용되는 변수(위에서는 tmp_file 배열)에서 X는 반드시 6개가 들어가야 한다. 6개의 X가 random값으로 변하면서 파일을 생성하는데 template를 저장하는 변수는 수정이 가능한 변수여야한다. 만약 배열로 하지않고 고정된포인터(char *tmp_file = "/tmp/miniftpd.XXXXXX";)를 사용하면 세그먼트폴트 발생한다.
2006/03/19 16:23 2006/03/19 16:23

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment