철썩같이 믿고 사용하던 라이브러리 함수에서 버그를 발견했습니다.
입사하고 첫 업무였는데 상당히 신박한걸 보게되었네요.
요약부터 하자면, 1row에 16MB가 넘는 데이터 호출 시, 무한루프가 발생하는 현상입니다.
사용한 라이브러리는 mariadb-connector_c 1.x.x입니다. 소스를 찾긴 했는데 1버전 소스는 없네요
https://github.com/mariadb-corporation/mariadb-connector-c
[버그 내용]
버그는 데이터베이스에 쿼리를 전송하고, 결과값을 받아오는 함수에서 발생합니다.
ex> mysql_fetch_row, mysql_store_result 등
내부 소스코드를 보면 결과값은 1 row씩 읽어오는데, 여기서 my_net_read()라는 내부 함수를 사용합니다.
이 때 읽어온 1 row의 데이터 크기가 16MB이상인 경우, my_net_read 함수에서 무한루프가 발생합니다.
소스가 없는데 무한루프인걸 어떻게 아느냐!!
my_net_read+0x334 jmp my_net_read+0x334
정확히는 기억이 안나지만 저렇게 본인 주소로 jmp를 하고있더라구요
while(true){}이런 느낌?
[해결 방안]
해결 방안은 뭐... 패치해야죠.
2버전에서는 개선했더라구요.
패치가 안되는 경우에는 mysql 설정파일(my.cnf)에서 max_allowed_packet값을 수정해주면 됩니다.
근데 1 row에 16MB가 넘을일이 잘 없으니까 뭐...
정~~~말 보기 드문 케이스를 보게 되었네요!!
'개발 > 리눅스 프로그래밍' 카테고리의 다른 글
CentOS7 NetworkManager 문제 (0) | 2020.01.12 |
---|---|
localtime() 사용 시 유의사항 (0) | 2020.01.12 |
좀비 프로세스 방지 (0) | 2019.07.18 |
유닉스 파일 함수 정리 (0) | 2019.07.18 |
유닉스 파일 시스템2 (0) | 2019.07.17 |