2018-07-30 Fred Gleason <fredg@paravelsystems.com>

* Cleaned up memory leaks in 'RDAudioExport', 'RDAudioImport',
	'RDAudioStore', 'RDCart', 'RDCopyAudio', 'RDPeakExport',
	'RDRehash', and 'RDTrimAudio'.
	* Modified Xload operations in 'RDDelete', 'RDDownload' and
	'RDUpload' to work properly with credentials using UTF-8 strings.
This commit is contained in:
Fred Gleason 2018-07-30 11:02:55 -04:00
parent 0605d2ff83
commit 5482e87e23
14 changed files with 61 additions and 13 deletions

View File

@ -17269,3 +17269,9 @@
* Modified 'RDRehash' to use multipart-mime encoding.
2018-07-30 Fred Gleason <fredg@paravelsystems.com>
* Modified 'RDTrimAudio' to use multipart-mime encoding.
2018-07-30 Fred Gleason <fredg@paravelsystems.com>
* Cleaned up memory leaks in 'RDAudioExport', 'RDAudioImport',
'RDAudioStore', 'RDCart', 'RDCopyAudio', 'RDPeakExport',
'RDRehash', and 'RDTrimAudio'.
* Modified Xload operations in 'RDDelete', 'RDDownload' and
'RDUpload' to work properly with credentials using UTF-8 strings.

View File

@ -196,6 +196,7 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
(const char *)QString().sprintf("%u",conv_enable_metadata),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDAudioExport::ErrorInternal;
}
if((f=fopen(conv_dst_filename,"w"))==NULL) {
@ -226,6 +227,7 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
case CURLE_ABORTED_BY_CALLBACK:
curl_easy_cleanup(curl);
curl_formfree(first);
unlink(conv_dst_filename);
return RDAudioExport::ErrorAborted;
@ -240,6 +242,7 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
case CURLE_HTTP_POST_ERROR:
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioExport::ErrorInternal;
case CURLE_URL_MALFORMAT:
@ -247,6 +250,7 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioExport::ErrorUrlInvalid;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
@ -255,6 +259,8 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
if(response_code==200) {
*conv_err=RDAudioConvert::ErrorOk;
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioExport::ErrorOk;
}
@ -274,6 +280,8 @@ RDAudioExport::ErrorCode RDAudioExport::runExport(const QString &username,
default:
ret=RDAudioExport::ErrorConverter;
}
curl_easy_cleanup(curl);
curl_formfree(first);
unlink(conv_dst_filename);
return ret;

View File

@ -163,6 +163,7 @@ RDAudioImport::ErrorCode RDAudioImport::runImport(const QString &username,
// Set up the transfer
//
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDAudioImport::ErrorInternal;
}
curl_easy_setopt(curl,CURLOPT_WRITEDATA,stdout);
@ -192,6 +193,7 @@ RDAudioImport::ErrorCode RDAudioImport::runImport(const QString &username,
case CURLE_ABORTED_BY_CALLBACK:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioImport::ErrorAborted;
case CURLE_UNSUPPORTED_PROTOCOL:
@ -203,8 +205,9 @@ RDAudioImport::ErrorCode RDAudioImport::runImport(const QString &username,
case CURLE_OUT_OF_MEMORY:
case CURLE_OPERATION_TIMEDOUT:
case CURLE_HTTP_POST_ERROR:
curl_easy_cleanup(curl);
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioImport::ErrorInternal;
case CURLE_URL_MALFORMAT:
@ -212,6 +215,7 @@ RDAudioImport::ErrorCode RDAudioImport::runImport(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioImport::ErrorUrlInvalid;
}
/*

View File

@ -138,6 +138,7 @@ RDAudioInfo::ErrorCode RDAudioInfo::runInfo(const QString &username,
(const char *)QString().sprintf("%u",conv_cut_number),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDAudioInfo::ErrorInternal;
}
//
@ -168,6 +169,7 @@ RDAudioInfo::ErrorCode RDAudioInfo::runInfo(const QString &username,
case CURLE_OPERATION_TIMEDOUT:
case CURLE_HTTP_POST_ERROR:
curl_easy_cleanup(curl);
curl_formfree(first);
fprintf(stderr,"curl error: %d\n",curl_err);
return RDAudioInfo::ErrorInternal;
@ -176,14 +178,17 @@ RDAudioInfo::ErrorCode RDAudioInfo::runInfo(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioInfo::ErrorUrlInvalid;
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioInfo::ErrorService;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -89,6 +89,7 @@ RDAudioStore::ErrorCode RDAudioStore::runStore(const QString &username,
curl_formadd(&first,&last,CURLFORM_PTRNAME,"PASSWORD",
CURLFORM_COPYCONTENTS,(const char *)password,CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDAudioStore::ErrorInternal;
}
@ -120,6 +121,7 @@ RDAudioStore::ErrorCode RDAudioStore::runStore(const QString &username,
case CURLE_OPERATION_TIMEDOUT:
case CURLE_HTTP_POST_ERROR:
curl_easy_cleanup(curl);
curl_formfree(first);
fprintf(stderr,"curl error: %d\n",curl_err);
return RDAudioStore::ErrorInternal;
@ -128,14 +130,17 @@ RDAudioStore::ErrorCode RDAudioStore::runStore(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioStore::ErrorUrlInvalid;
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDAudioStore::ErrorService;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -1681,6 +1681,7 @@ bool RDCart::removeCutAudio(RDStation *station,RDUser *user,unsigned cart_num,
(const char *)QString().sprintf("%u",RDCut::cutNumber(cutname)),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return false;
}
//
@ -1700,6 +1701,7 @@ bool RDCart::removeCutAudio(RDStation *station,RDUser *user,unsigned cart_num,
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
ret&=response_code==200;
curl_easy_cleanup(curl);
curl_formfree(first);
}
#endif // WIN32
return ret;

View File

@ -108,6 +108,7 @@ RDCopyAudio::ErrorCode RDCopyAudio::runCopy(const QString &username,
(const char *)QString().sprintf("%u",conv_destination_cut_number),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDCopyAudio::ErrorInternal;
}
@ -138,6 +139,7 @@ RDCopyAudio::ErrorCode RDCopyAudio::runCopy(const QString &username,
case CURLE_HTTP_POST_ERROR:
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDCopyAudio::ErrorInternal;
case CURLE_URL_MALFORMAT:
@ -145,10 +147,12 @@ RDCopyAudio::ErrorCode RDCopyAudio::runCopy(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDCopyAudio::ErrorUrlInvalid;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -98,15 +98,15 @@ RDDelete::ErrorCode RDDelete::runDelete(const QString &username,
return RDDelete::ErrorInternal;
}
strncpy(urlstr,(const char *)(conv_target_url.protocol()+"://"+
conv_target_url.host()+"/"),1024);
conv_target_url.host()+"/").utf8(),1024);
curl_easy_setopt(curl,CURLOPT_URL,urlstr);
strncpy(userpwd,QString(username)+":"+password,256);
strncpy(userpwd,(QString(username)+":"+password).utf8(),256);
curl_easy_setopt(curl,CURLOPT_USERPWD,userpwd);
curl_easy_setopt(curl,CURLOPT_HTTPAUTH,CURLAUTH_ANY);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,DeleteWriteCallback);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&xml);
curl_easy_setopt(curl,CURLOPT_USERAGENT,
(const char *)conv_config->userAgent());
(const char *)conv_config->userAgent().utf8());
if(log_debug) {
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_DEBUGFUNCTION,DeleteErrorCallback);

View File

@ -133,10 +133,10 @@ RDDownload::ErrorCode RDDownload::runDownload(const QString &username,
// error.
//
strncpy(url,conv_src_url.
toString(conv_src_url.protocol().lower().left(4)=="http"),1024);
toString(conv_src_url.protocol().lower().left(4)=="http").utf8(),1024);
curl_easy_setopt(curl,CURLOPT_URL,url);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,f);
strncpy(userpwd,username+":"+password,256);
strncpy(userpwd,(username+":"+password).utf8(),256);
curl_easy_setopt(curl,CURLOPT_USERPWD,userpwd);
curl_easy_setopt(curl,CURLOPT_TIMEOUT,RD_CURL_TIMEOUT);
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
@ -144,7 +144,7 @@ RDDownload::ErrorCode RDDownload::runDownload(const QString &username,
curl_easy_setopt(curl,CURLOPT_PROGRESSDATA,this);
curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0);
curl_easy_setopt(curl,CURLOPT_USERAGENT,
(const char *)conv_config->userAgent());
(const char *)conv_config->userAgent().utf8());
if(log_debug) {
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_DEBUGFUNCTION,DownloadErrorCallback);

View File

@ -115,6 +115,7 @@ RDPeaksExport::ErrorCode RDPeaksExport::runExport(const QString &username,
(const char *)QString().sprintf("%u",conv_cut_number),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDPeaksExport::ErrorInternal;
}
curl_easy_setopt(curl,CURLOPT_WRITEDATA,this);
@ -140,6 +141,7 @@ RDPeaksExport::ErrorCode RDPeaksExport::runExport(const QString &username,
case CURLE_ABORTED_BY_CALLBACK:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDPeaksExport::ErrorAborted;
case CURLE_UNSUPPORTED_PROTOCOL:
@ -153,6 +155,7 @@ RDPeaksExport::ErrorCode RDPeaksExport::runExport(const QString &username,
case CURLE_HTTP_POST_ERROR:
default:
curl_easy_cleanup(curl);
curl_formfree(first);
return RDPeaksExport::ErrorInternal;
case CURLE_URL_MALFORMAT:
@ -160,10 +163,12 @@ RDPeaksExport::ErrorCode RDPeaksExport::runExport(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
curl_formfree(first);
return RDPeaksExport::ErrorUrlInvalid;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -309,13 +309,14 @@ bool RDPodcast::removeAudio(RDFeed *feed,QString *err_text,bool log_debug) const
return false;
}
url=new QUrl(feed->purgeUrl());
strncpy(urlstr,(const char *)(url->protocol()+"://"+url->host()+"/"),1024);
strncpy(urlstr,(const char *)(url->protocol()+"://"+url->host()+"/").utf8(),
1024);
curl_easy_setopt(curl,CURLOPT_URL,urlstr);
strncpy(userpwd,feed->purgeUsername()+":"+feed->purgePassword(),256);
strncpy(userpwd,(feed->purgeUsername()+":"+feed->purgePassword()).utf8(),256);
curl_easy_setopt(curl,CURLOPT_USERPWD,userpwd);
curl_easy_setopt(curl,CURLOPT_HTTPAUTH,CURLAUTH_ANY);
curl_easy_setopt(curl,CURLOPT_USERAGENT,
(const char *)podcast_config->userAgent());
(const char *)podcast_config->userAgent().utf8());
if(log_debug) {
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_DEBUGFUNCTION,PodcastErrorCallback);

View File

@ -93,6 +93,7 @@ RDRehash::ErrorCode RDRehash::runRehash(const QString &username,
(const char *)QString().sprintf("%u",conv_cut_number),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDRehash::ErrorInternal;
}
@ -123,6 +124,7 @@ RDRehash::ErrorCode RDRehash::runRehash(const QString &username,
case CURLE_OPERATION_TIMEDOUT:
case CURLE_HTTP_POST_ERROR:
curl_easy_cleanup(curl);
curl_formfree(first);
fprintf(stderr,"curl error: %d\n",curl_err);
return RDRehash::ErrorInternal;
@ -131,6 +133,7 @@ RDRehash::ErrorCode RDRehash::runRehash(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
curl_formfree(first);
return RDRehash::ErrorUrlInvalid;
default:
@ -139,6 +142,7 @@ RDRehash::ErrorCode RDRehash::runRehash(const QString &username,
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -121,6 +121,7 @@ RDTrimAudio::ErrorCode RDTrimAudio::runTrim(const QString &username,
(const char *)QString().sprintf("%u",conv_trim_level),
CURLFORM_END);
if((curl=curl_easy_init())==NULL) {
curl_formfree(first);
return RDTrimAudio::ErrorInternal;
}
@ -155,6 +156,7 @@ RDTrimAudio::ErrorCode RDTrimAudio::runTrim(const QString &username,
//fprintf(stderr,"CURL Error: %s [%d]\n",curl_easy_strerror(curl_err),
//curl_err);
curl_easy_cleanup(curl);
curl_formfree(first);
return RDTrimAudio::ErrorInternal;
case CURLE_URL_MALFORMAT:
@ -162,10 +164,12 @@ RDTrimAudio::ErrorCode RDTrimAudio::runTrim(const QString &username,
case CURLE_COULDNT_CONNECT:
case 9: // CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
curl_formfree(first);
return RDTrimAudio::ErrorUrlInvalid;
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code);
curl_easy_cleanup(curl);
curl_formfree(first);
switch(response_code) {
case 200:

View File

@ -134,20 +134,20 @@ RDUpload::ErrorCode RDUpload::runUpload(const QString &username,
// otherwise some versions of LibCurl will throw a 'bad/illegal format'
// error.
//
strncpy(url,conv_dst_url.toString(conv_dst_url.protocol().lower()=="http"),
strncpy(url,conv_dst_url.toString(conv_dst_url.protocol().lower()=="http").utf8(),
1024);
curl_easy_setopt(curl,CURLOPT_URL,url);
curl_easy_setopt(curl,CURLOPT_UPLOAD,1);
curl_easy_setopt(curl,CURLOPT_READDATA,f);
curl_easy_setopt(curl,CURLOPT_INFILESIZE,(long)conv_src_size);
strncpy(userpwd,(username+":"+password),256);
strncpy(userpwd,(username+":"+password).utf8(),256);
curl_easy_setopt(curl,CURLOPT_USERPWD,userpwd);
curl_easy_setopt(curl,CURLOPT_TIMEOUT,RD_CURL_TIMEOUT);
curl_easy_setopt(curl,CURLOPT_PROGRESSFUNCTION,UploadProgressCallback);
curl_easy_setopt(curl,CURLOPT_PROGRESSDATA,this);
curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0);
curl_easy_setopt(curl,CURLOPT_USERAGENT,
(const char *)rda->config()->userAgent());
(const char *)rda->config()->userAgent().utf8());
if(log_debug) {
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_DEBUGFUNCTION,UploadErrorCallback);