mariadb-connector 라이브러리 내부 버그
철썩같이 믿고 사용하던 라이브러리 함수에서 버그를 발견했습니다.
입사하고 첫 업무였는데 상당히 신박한걸 보게되었네요.
요약부터 하자면, 1row에 16MB가 넘는 데이터 호출 시, 무한루프가 발생하는 현상입니다.
사용한 라이브러리는 mariadb-connector_c 1.x.x입니다. 소스를 찾긴 했는데 1버전 소스는 없네요
https://github.com/mariadb-corporation/mariadb-connector-c
mariadb-corporation/mariadb-connector-c
MariaDB Connector/C is used to connect applications developed in C/C++ to MariaDB and MySQL databases.The client library is LGPL licensed. - mariadb-corporation/mariadb-connector-c
github.com
[버그 내용]
버그는 데이터베이스에 쿼리를 전송하고, 결과값을 받아오는 함수에서 발생합니다.
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가 넘을일이 잘 없으니까 뭐...
정~~~말 보기 드문 케이스를 보게 되었네요!!