Skip to content

Commit da1af50

Browse files
committed
Fix memory leak with fetchAsString/fetchAsBuffer
1 parent bfc26f0 commit da1af50

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/njs/src/njsConnection.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,16 @@ typedef struct eBaton
483483
}
484484
}
485485

486+
// If Blob data was fetched as Buffer, deallocate each buffer
487+
if ( (defines[i].fetchType == dpi::DpiRaw) &&
488+
mInfo[i].dbType == dpi::DpiBlob )
489+
{
490+
for ( unsigned int j = 0 ; j < maxRows ; j ++ )
491+
{
492+
free ( ((char **)(defines[i].buf))[j] );
493+
}
494+
}
495+
486496
/*
487497
* Buf and indicator will be allocated in all cases.
488498
* len will NOT be allocated for CLOB-as-STRING/BLOB-as-BUFFER

src/njs/src/njsResultSet.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,13 +711,15 @@ void ResultSet::clearFetchBuffer( unsigned int numRows )
711711
{
712712
if ( defineBuffers_[i].dttmarr )
713713
{
714+
/* Date/Timestamp columns */
714715
defineBuffers_[i].dttmarr->release ();
715716
defineBuffers_[i].extbuf = NULL;
716717
}
717718
else if ( ( defineBuffers_[i].fetchType == DpiClob ) ||
718719
( defineBuffers_[i].fetchType == DpiBlob ) ||
719720
( defineBuffers_[i].fetchType == DpiBfile ) )
720721
{
722+
/* Lob columns */
721723
for (unsigned int j = 0; j < numRows; j++)
722724
{
723725
if (((Descriptor **)(defineBuffers_[i].buf))[j])
@@ -727,6 +729,21 @@ void ResultSet::clearFetchBuffer( unsigned int numRows )
727729
}
728730
}
729731
}
732+
else if ( ( ( defineBuffers_[i].fetchType == dpi::DpiVarChar ) &&
733+
( mInfo_[i].dbType == dpi::DpiClob ) ) ||
734+
( ( defineBuffers_[i].fetchType == dpi::DpiRaw ) &&
735+
( mInfo_[i].dbType == dpi::DpiBlob ) ) )
736+
{
737+
/* CLOB-as-STRING or BLOB-as-BUFFER case */
738+
for ( unsigned int j = 0 ; j < numRows ; j ++ )
739+
{
740+
if ( ( (char **)defineBuffers_[i].buf)[j] )
741+
{
742+
free ( ( (char **)defineBuffers_[i].buf)[j] );
743+
( ( char **)defineBuffers_[i].buf)[j] = NULL ;
744+
}
745+
}
746+
}
730747

731748
free(defineBuffers_[i].buf);
732749
free(defineBuffers_[i].len);

0 commit comments

Comments
 (0)