본문 바로가기

개발/리눅스 프로그래밍

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가 넘을일이 잘 없으니까 뭐...

정~~~말 보기 드문 케이스를 보게 되었네요!!

'개발 > 리눅스 프로그래밍' 카테고리의 다른 글

CentOS7 NetworkManager 문제  (0) 2020.01.12
localtime() 사용 시 유의사항  (0) 2020.01.12
좀비 프로세스 방지  (0) 2019.07.18
유닉스 파일 함수 정리  (0) 2019.07.18
유닉스 파일 시스템2  (0) 2019.07.17