Skip to content

sporadic read access violation #382

@gazsi150

Description

@gazsi150

Using msnodesqlv8 v5.1.3 with sqlserver2022

Super sporadically my application crashes with Unhandled exception thrown: read access violation. this->statements_._Mypair._Myval2._Myval2._Myhead->_Parent was 0xFFFFFFFFFFFFFFE6.

The call stack is
[Inline Frame] sqlserver.node!std::_Tree<std::_Tmap_traits<int,std::shared_ptrmssql::IOdbcStatement,std::less,std::allocator<std::pair<int const ,std::shared_ptrmssql::IOdbcStatement>>,0>>::_Eqrange(const int &) Line 1713
[Inline Frame] sqlserver.node!std::_Tree<std::_Tmap_traits<int,std::shared_ptrmssql::IOdbcStatement,std::less,std::allocator<std::pair<int const ,std::shared_ptrmssql::IOdbcStatement>>,0>>::erase(const int &) Line 1358
sqlserver.node!mssql::OdbcStatementFactory::RemoveStatement(int statementId) Line 54
sqlserver.node!mssql::OdbcConnection::RemoveStatement(int statementId) Line 246
sqlserver.node!mssql::ReleaseWorker::Execute() Line 23
sqlserver.node!Napi::AsyncWorker::OnExecute(Napi::Env __formal) Line 5544
.exe!node::ThreadPoolWork::ScheduleWork::__l2::<lambda_1>::operator()(uv_work_s * req) Line 45
.exe!worker(void * arg) Line 125
.exe!uv__thread_start(void * arg) Line 91
.exe!thread_start<unsigned int (__cdecl*)(void *),1>(void * const parameter) Line 97
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()

connectionId_ is 99
statementId is 1

the client code looks like this:

async querySingle(db){
  var queryPromise = new Promise((resolve, reject) => {
    sql.open(createConnectionString(db), (err, conn) => {
      if (err) {
      ...
      } else {
      var pm = conn.procedureMgr();
      pm.setTimeout(timeout);
      pm.getProc(queryName, (err, procedure) => {
      if(err) {
        conn.close(() => {...});
       } else {
         var query = procedure.call(args);
         query.on('done', () => {
             conn.close(() => {...});
         });
         query.on('error', err => {
             conn.close(() => {...});
         });
         query.on('info', i => {...});
         query.on('meta', meta => {...});
         query.on('column', (index, data) => {...});
         query.on('row', index => {...});
         query.on('free', () => {...});
        }
      }
    });
  });
  return queryPromise;
}
const dbInfos = ["nodedb", "node1db", "node2db", "node3db"];
const results = await Promise.all(dbInfos.map(entry => querySingle(entry)));

I couldn't create a simple example which can reproduce the issue or threading. By debugging the code it looks like that it crashes after the callback function of the conn.close was called.
I set up the logging in my client application. It generated 40MB logs so i cut out the part from the connection with id 99 was created until the crash happened in time.

sql-trace_prepared2.log

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions