1970년 이후 생일 버그 수정
zbirthday 개발자입니다.
어제 사용자 한분의 메일을 받고 원인 분석 중에 zeroboard에서 1970 이전
생일자와 관련된 문제가 있다는 것을 알았습니다. 관련하여 이것저것 찾아
보았고, glibc의 mktime() 함수의 버전 문제 때문에 이런 일이 생긴다는 것
을 파악했습니다.
glibc를 mktime 함수를 사용하는 모든 시스템에서는 mktime 함수가 1970
년 이전을 -1로 반환 할 가능성이 있습니다. 결과적으로 glib 2.3.3 릴리즈는
1970년 이전을 -1로 처리합니다.
mktime.c v1.36 이후부터는 이 문제가 해결된 것으로 보입니다.
이런 이유로 1970년 1월 1일 이전 생일자에 대해서는 별도의 mktime 함수가
필요합니다. 편리하게 mktime() 함수를 wrapping 하여 쓸 수 있도록 만들
어보았습니다.
제로보드 4.1 pl4 기준입니다. 다른 버전을 사용하시는 분들은 글 맨아래의
수동 패치법을 참고하시기 바랍니다.
다운로드 하셔서 압축을 푸시고, 제로보드와 같은 디렉토리에 파일 5개를
복사해 넣으십시오. 그 다음에 아래와 같이 명령을 치시면 됩니다.
$ make patch
patch 외에도 편리를 위해 몇가지 기능을 더 넣었습니다.
본 패치가 마음에 안 드시거나 이상이 있으시면 make recover 하시면
됩니다. 충분히 안정화가 됐다고 생각하시면 make clean으로 설치 파일을
지우셔도 됩니다. make recover로 원상 복구 하실 일이 없다고 생각하시면
make delold 로 보관 파일을 없애시면 됩니다.
** 수동 패치 **
mktime() 함수가 사용된 부분을 찾아서 bw_mktime.php 를 include 하시고
bw_mktime() 함수로 바꿔주시면 됩니다.
$ fgrep -r mktime *
$birth=mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이런 줄을 찾으셔서
include ("bw_mktime.php");
$birth=bw_mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이렇게 바꿔주시면 됩니다.
수동으로 설치했습니다.. 저도 초보..
여튼.. 이거 잘되네요..
레벨1에서 다른 아이디 수정이 안되던데.. 그건 잘 모르겠고..원래그런건지..
자기 정보도 주정되고 70전 이전도 잘 입력되네요..
초보를 위해 방법을 말씀드리면..
우선 bw_mktime.php를 제로보드 디렉토리에 까시고..
제로보드 디렉토리의
member_join_ok.php
member_modify_ok.php
제로보드안 admin 디렉토리의
admin_exec_member.php
화일에서
$birth=mktime(0,0,0,$birth_2,$birth_3,$birth_1);
부분을 찾아서..
include ("bw_mktime.php");
$birth=bw_mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이렇게 바꿔주니까 되내요..
그전에는 가상으로 가입시켜서 68년을 입력하면 모두 1970년 1월 1일로 나왔는데 말이죠..
^^;
그럼 모두 수고하세요..
어제 사용자 한분의 메일을 받고 원인 분석 중에 zeroboard에서 1970 이전
생일자와 관련된 문제가 있다는 것을 알았습니다. 관련하여 이것저것 찾아
보았고, glibc의 mktime() 함수의 버전 문제 때문에 이런 일이 생긴다는 것
을 파악했습니다.
glibc를 mktime 함수를 사용하는 모든 시스템에서는 mktime 함수가 1970
년 이전을 -1로 반환 할 가능성이 있습니다. 결과적으로 glib 2.3.3 릴리즈는
1970년 이전을 -1로 처리합니다.
mktime.c v1.36 이후부터는 이 문제가 해결된 것으로 보입니다.
이런 이유로 1970년 1월 1일 이전 생일자에 대해서는 별도의 mktime 함수가
필요합니다. 편리하게 mktime() 함수를 wrapping 하여 쓸 수 있도록 만들
어보았습니다.
제로보드 4.1 pl4 기준입니다. 다른 버전을 사용하시는 분들은 글 맨아래의
수동 패치법을 참고하시기 바랍니다.
다운로드 하셔서 압축을 푸시고, 제로보드와 같은 디렉토리에 파일 5개를
복사해 넣으십시오. 그 다음에 아래와 같이 명령을 치시면 됩니다.
$ make patch
patch 외에도 편리를 위해 몇가지 기능을 더 넣었습니다.
본 패치가 마음에 안 드시거나 이상이 있으시면 make recover 하시면
됩니다. 충분히 안정화가 됐다고 생각하시면 make clean으로 설치 파일을
지우셔도 됩니다. make recover로 원상 복구 하실 일이 없다고 생각하시면
make delold 로 보관 파일을 없애시면 됩니다.
** 수동 패치 **
mktime() 함수가 사용된 부분을 찾아서 bw_mktime.php 를 include 하시고
bw_mktime() 함수로 바꿔주시면 됩니다.
$ fgrep -r mktime *
$birth=mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이런 줄을 찾으셔서
include ("bw_mktime.php");
$birth=bw_mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이렇게 바꿔주시면 됩니다.
수동으로 설치했습니다.. 저도 초보..
여튼.. 이거 잘되네요..
레벨1에서 다른 아이디 수정이 안되던데.. 그건 잘 모르겠고..원래그런건지..
자기 정보도 주정되고 70전 이전도 잘 입력되네요..
초보를 위해 방법을 말씀드리면..
우선 bw_mktime.php를 제로보드 디렉토리에 까시고..
제로보드 디렉토리의
member_join_ok.php
member_modify_ok.php
제로보드안 admin 디렉토리의
admin_exec_member.php
화일에서
$birth=mktime(0,0,0,$birth_2,$birth_3,$birth_1);
부분을 찾아서..
include ("bw_mktime.php");
$birth=bw_mktime(0,0,0,$birth_2,$birth_3,$birth_1);
이렇게 바꿔주니까 되내요..
그전에는 가상으로 가입시켜서 68년을 입력하면 모두 1970년 1월 1일로 나왔는데 말이죠..
^^;
그럼 모두 수고하세요..