Dear PostgreSQL Community Team, I hope this message finds you well. I am reaching out for assistance with an issue encountered in our application, which communicates with PostgreSQL using the libpq client library.
*Issue Details:* We have observed a problem where one of the application's threads gets stuck during a database operation. Below is a stack trace of the affected thread: *Application Logs:* Oct 23 10:08:44.806235 cucmtpccu1 shc-server@2.service[966034]: 0966070{ef5f81a7-d35b-4604-953d-a35665e505b7.010000}KIP8-SQL_get_tpf_rw()-SQL read data from File Address before lock fa(-1810606079) fa(94145801) fa2 htonl(22549652) Oct 23 10:08:44.806235 cucmtpccu1 shc-server@2.service[966034]: 0966070{ef5f81a7-d35b-4604-953d-a35665e505b7.010000}KIP8-SQL_get_tpf_rw() SelectDataCommand = CALL SQL_select_data_procedure($1, $2, NULL, NULL) hold(0) fa(-1810606079) Oct 23 10:08:44.807814 cucmtpccu1 shc-server@2.service[966034]: *** buffer overflow detected ***: terminated *Stack Trace of Thread 966070:* #0 0x00000000f7ee1129 __kernel_vsyscall (linux-gate.so.1) #1 0x00000000f6ba23b7 __poll (libc.so.6) #2 0x00000000f792e5b5 __interceptor_poll (libasan.so.8) #3 0x00000000f72b30a8 pqSocketCheck (libpq.so.5) #4 0x00000000f72b3864 pqWaitTimed (libpq.so.5) #5 0x00000000f72b38d2 pqWait (libpq.so.5) #6 0x00000000f72aff03 PQgetResult (libpq.so.5) #7 0x00000000f72b036a PQexecFinish (libpq.so.5) #8 0x0000000008106dd4 checkLOCK (server) #9 0x000000000811d871 SQL_get_tpf_rw (server) ... The stack trace shows that the thread is stuck in a poll operation while waiting for socket activity within the PostgreSQL client library (libpq). We suspect this could be related to a network timeout or issue. However, the application logs indicate a buffer overflow before the crash, which raises questions about whether these are related. *Questions:* -Could the buffer overflow be causing the crash, and if so, how is it related to the socket activity? -Are there specific configurations or checks we should perform to diagnose this issue further? -Any suggestions for possible solutions to resolve this problem? For additional context, I've verified that the specified record does exist in the database, and I am also attaching the implementation details for the *checkLOCK* function corresponding to the stack trace. Please let me know if you need any more details Your assistance with troubleshooting this would be highly appreciated. Regards, Sasmit Utkarsh +91-7674022625
void checkLOCK(int32_t fa) { int nFields; int nTuples; int i, j; PGresult *checkLOCK_res=NULL; char Command[100]; LOG_TRACE("%s() fa(%i)(%08X)",__func__,fa,fa); snprintf(Command,sizeof(Command),"SELECT pid, classid, objid FROM pg_locks WHERE objid=%i",fa); //PQclear(checkLOCK_res); checkLOCK_res = PQexec(conn,Command); if (!checkLOCK_res) { LOG_DEBUG("In %s(): PGresult is still NULL so return", __func__); return; } if (PQresultStatus(checkLOCK_res) != PGRES_TUPLES_OK) { LOG_DEBUG("checkLOCK failed: %s", PQerrorMessage(conn)); PQclear(checkLOCK_res); return; } nFields = PQnfields(checkLOCK_res); nTuples = PQntuples(checkLOCK_res); if(nTuples > 0) { LOG_DEBUG("%s() fa(%i)(%08X) is currently LOCKED by PID %s as classid=%s objid=%s",__func__,fa,fa,PQgetvalue(checkLOCK_res,0,0),PQgetvalue(checkLOCK_res,0,1),PQgetvalue(checkLOCK_res,0,2)); PQclear(checkLOCK_res); //printLOCKS(); } else { LOG_DEBUG("%s() fa(%i)(%08X) is NOT LOCKED",__func__,fa,fa); PQclear(checkLOCK_res); } }