mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix a memory leak that could follow an IO error in the zipfile extension. And
add other tests. FossilOrigin-Name: e6bb750697c3c7ceb5ce41d216e8ef6a1d556822a3b55e0a007b4a03e194a7d9
This commit is contained in:
@ -2017,23 +2017,24 @@ void zipfileFinal(sqlite3_context *pCtx){
|
||||
u8 *aZip;
|
||||
|
||||
p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
|
||||
if( p==0 || p->nEntry==0 ) return;
|
||||
if( p==0 ) return;
|
||||
if( p->nEntry>0 ){
|
||||
memset(&eocd, 0, sizeof(eocd));
|
||||
eocd.nEntry = p->nEntry;
|
||||
eocd.nEntryTotal = p->nEntry;
|
||||
eocd.nSize = p->cds.n;
|
||||
eocd.iOffset = p->body.n;
|
||||
|
||||
memset(&eocd, 0, sizeof(eocd));
|
||||
eocd.nEntry = p->nEntry;
|
||||
eocd.nEntryTotal = p->nEntry;
|
||||
eocd.nSize = p->cds.n;
|
||||
eocd.iOffset = p->body.n;
|
||||
|
||||
nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
|
||||
aZip = (u8*)sqlite3_malloc(nZip);
|
||||
if( aZip==0 ){
|
||||
sqlite3_result_error_nomem(pCtx);
|
||||
}else{
|
||||
memcpy(aZip, p->body.a, p->body.n);
|
||||
memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
|
||||
zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
|
||||
sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree);
|
||||
nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
|
||||
aZip = (u8*)sqlite3_malloc(nZip);
|
||||
if( aZip==0 ){
|
||||
sqlite3_result_error_nomem(pCtx);
|
||||
}else{
|
||||
memcpy(aZip, p->body.a, p->body.n);
|
||||
memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
|
||||
zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
|
||||
sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree);
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_free(p->body.a);
|
||||
|
Reference in New Issue
Block a user