2021-05-28 Fred Gleason <fredg@paravelsystems.com>

* Fixed a use-after-delete bug in rdimport(1) that could cause
	a segfault when the '--fix-broken-formats' switch was given.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-05-28 10:55:08 -04:00
parent dea9c478b7
commit 62a3075bc7
3 changed files with 11 additions and 8 deletions

View File

@ -21721,3 +21721,6 @@
2021-05-28 Fred Gleason <fredg@paravelsystems.com> 2021-05-28 Fred Gleason <fredg@paravelsystems.com>
* Updated rddbmgr(8) to correctly recognize schema database * Updated rddbmgr(8) to correctly recognize schema database
schema 347 as belonging to v3.6.0. schema 347 as belonging to v3.6.0.
2021-05-28 Fred Gleason <fredg@paravelsystems.com>
* Fixed a use-after-delete bug in rdimport(1) that could cause
a segfault when the '--fix-broken-formats' switch was given.

View File

@ -1022,7 +1022,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
// //
// Open the file // Open the file
// //
if(!OpenAudioFile(wavefile,wavedata)) { if(!OpenAudioFile(&wavefile,wavedata)) {
delete wavedata; delete wavedata;
delete wavefile; delete wavefile;
return MainObject::FileBad; return MainObject::FileBad;
@ -1458,16 +1458,16 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
} }
bool MainObject::OpenAudioFile(RDWaveFile *wavefile,RDWaveData *wavedata) bool MainObject::OpenAudioFile(RDWaveFile **wavefile,RDWaveData *wavedata)
{ {
QString orig_filename=wavefile->getName(); QString orig_filename=(*wavefile)->getName();
if(!wavefile->openWave(wavedata)) { if(!(*wavefile)->openWave(wavedata)) {
if(import_fix_broken_formats) { if(import_fix_broken_formats) {
Log(LOG_WARNING,QString().sprintf(" File \"%s\" appears to be malformed, trying workaround ... ", Log(LOG_WARNING,QString().sprintf(" File \"%s\" appears to be malformed, trying workaround ... ",
RDGetBasePart(orig_filename).toUtf8().constData())); RDGetBasePart(orig_filename).toUtf8().constData()));
delete wavefile; delete *wavefile;
if((wavefile=FixFile(orig_filename,wavedata))==NULL) { if(((*wavefile)=FixFile(orig_filename,wavedata))==NULL) {
Log(LOG_WARNING,QString().sprintf("failed.\n")); Log(LOG_WARNING,QString().sprintf("failed.\n"));
Log(LOG_WARNING,QString().sprintf( Log(LOG_WARNING,QString().sprintf(
" File \"%s\" is not readable or not a recognized format, skipping...\n", " File \"%s\" is not readable or not a recognized format, skipping...\n",
@ -1489,7 +1489,7 @@ bool MainObject::OpenAudioFile(RDWaveFile *wavefile,RDWaveData *wavedata)
else { else {
Log(LOG_WARNING,QString().sprintf( Log(LOG_WARNING,QString().sprintf(
" File \"%s\" is not readable or not a recognized format, skipping...\n", " File \"%s\" is not readable or not a recognized format, skipping...\n",
RDGetBasePart(wavefile->getName()).toUtf8().constData())); RDGetBasePart((*wavefile)->getName()).toUtf8().constData()));
if(!import_run) { if(!import_run) {
NormalExit(); NormalExit();
} }

View File

@ -63,7 +63,7 @@ class MainObject : public QObject
void RunDropBox(); void RunDropBox();
void ProcessFileEntry(const QString &entry); void ProcessFileEntry(const QString &entry);
MainObject::Result ImportFile(const QString &filename,unsigned *cartnum); MainObject::Result ImportFile(const QString &filename,unsigned *cartnum);
bool OpenAudioFile(RDWaveFile *wavefile,RDWaveData *wavedata); bool OpenAudioFile(RDWaveFile **wavefile,RDWaveData *wavedata);
void VerifyFile(const QString &filename,unsigned *cartnum); void VerifyFile(const QString &filename,unsigned *cartnum);
RDWaveFile *FixFile(const QString &filename,RDWaveData *wavedata); RDWaveFile *FixFile(const QString &filename,RDWaveData *wavedata);
bool IsWav(int fd); bool IsWav(int fd);