aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.txt4
-rw-r--r--linden/indra/llmessage/llassetstorage.cpp41
2 files changed, 25 insertions, 20 deletions
diff --git a/ChangeLog.txt b/ChangeLog.txt
index e69de29..e06910f 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -0,0 +1,4 @@
12008-09-16 Nicholaz Beresford <nicholaz@blueflash.cc>
2
3 * linden/indra/llmessage/llassetstorage.cpp:
4 VWR-3877: A nasty possible memory overwrite and two minor leaks.
diff --git a/linden/indra/llmessage/llassetstorage.cpp b/linden/indra/llmessage/llassetstorage.cpp
index a6077e5..83026ba 100644
--- a/linden/indra/llmessage/llassetstorage.cpp
+++ b/linden/indra/llmessage/llassetstorage.cpp
@@ -515,16 +515,19 @@ void LLAssetStorage::downloadCompleteCallback(
515 S32 result, 515 S32 result,
516 const LLUUID& file_id, 516 const LLUUID& file_id,
517 LLAssetType::EType file_type, 517 LLAssetType::EType file_type,
518 void* user_data, LLExtStat ext_status) 518 void* callback_parm_req, LLExtStat ext_status)
519{ 519{
520 lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id 520 lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id
521 << "," << LLAssetType::lookup(file_type) << llendl; 521 << "," << LLAssetType::lookup(file_type) << llendl;
522 LLAssetRequest* req = (LLAssetRequest*)user_data; 522
523 // be careful! req may be a ptr to memory already freed (a timeout does this)
524 LLAssetRequest* req = (LLAssetRequest*)callback_parm_req;
523 if(!req) 525 if(!req)
524 { 526 {
525 llwarns << "LLAssetStorage::downloadCompleteCallback called without" 527 llwarns << "LLAssetStorage::downloadCompleteCallback called without"
526 "a valid request." << llendl; 528 "a valid request." << llendl;
527 return; 529 // we can live with a null pointer, we're not allowed to deref the ptr anyway (see above)
530 // return;
528 } 531 }
529 if (!gAssetStorage) 532 if (!gAssetStorage)
530 { 533 {
@@ -532,12 +535,10 @@ void LLAssetStorage::downloadCompleteCallback(
532 return; 535 return;
533 } 536 }
534 537
535 req->setUUID(file_id);
536 req->setType(file_type);
537 if (LL_ERR_NOERR == result) 538 if (LL_ERR_NOERR == result)
538 { 539 {
539 // we might have gotten a zero-size file 540 // we might have gotten a zero-size file
540 LLVFile vfile(gAssetStorage->mVFS, req->getUUID(), req->getType()); 541 LLVFile vfile(gAssetStorage->mVFS, file_id, file_type);
541 if (vfile.getSize() <= 0) 542 if (vfile.getSize() <= 0)
542 { 543 {
543 llwarns << "downloadCompleteCallback has non-existent or zero-size asset " << req->getUUID() << llendl; 544 llwarns << "downloadCompleteCallback has non-existent or zero-size asset " << req->getUUID() << llendl;
@@ -556,7 +557,7 @@ void LLAssetStorage::downloadCompleteCallback(
556 { 557 {
557 request_list_t::iterator curiter = iter++; 558 request_list_t::iterator curiter = iter++;
558 LLAssetRequest* tmp = *curiter; 559 LLAssetRequest* tmp = *curiter;
559 if ((tmp->getUUID() == req->getUUID()) && (tmp->getType()== req->getType())) 560 if ((tmp->getUUID() == file_id) && (tmp->getType() == file_type))
560 { 561 {
561 requests.push_front(tmp); 562 requests.push_front(tmp);
562 iter = gAssetStorage->mPendingDownloads.erase(curiter); 563 iter = gAssetStorage->mPendingDownloads.erase(curiter);
@@ -569,7 +570,7 @@ void LLAssetStorage::downloadCompleteCallback(
569 LLAssetRequest* tmp = *curiter; 570 LLAssetRequest* tmp = *curiter;
570 if (tmp->mDownCallback) 571 if (tmp->mDownCallback)
571 { 572 {
572 tmp->mDownCallback(gAssetStorage->mVFS, req->getUUID(), req->getType(), tmp->mUserData, result, ext_status); 573 tmp->mDownCallback(gAssetStorage->mVFS, tmp->getUUID(), tmp->getType(), tmp->mUserData, result, ext_status);
573 } 574 }
574 delete tmp; 575 delete tmp;
575 } 576 }
@@ -665,10 +666,10 @@ void LLAssetStorage::downloadEstateAssetCompleteCallback(
665 S32 result, 666 S32 result,
666 const LLUUID& file_id, 667 const LLUUID& file_id,
667 LLAssetType::EType file_type, 668 LLAssetType::EType file_type,
668 void* user_data, 669 void* callback_parm_req,
669 LLExtStat ext_status) 670 LLExtStat ext_status)
670{ 671{
671 LLEstateAssetRequest *req = (LLEstateAssetRequest*)user_data; 672 LLEstateAssetRequest *req = (LLEstateAssetRequest*)callback_parm_req;
672 if(!req) 673 if(!req)
673 { 674 {
674 llwarns << "LLAssetStorage::downloadEstateAssetCompleteCallback called" 675 llwarns << "LLAssetStorage::downloadEstateAssetCompleteCallback called"
@@ -682,12 +683,10 @@ void LLAssetStorage::downloadEstateAssetCompleteCallback(
682 return; 683 return;
683 } 684 }
684 685
685 req->setUUID(file_id);
686 req->setType(file_type);
687 if (LL_ERR_NOERR == result) 686 if (LL_ERR_NOERR == result)
688 { 687 {
689 // we might have gotten a zero-size file 688 // we might have gotten a zero-size file
690 LLVFile vfile(gAssetStorage->mVFS, req->getUUID(), req->getAType()); 689 LLVFile vfile(gAssetStorage->mVFS, file_id, file_type);
691 if (vfile.getSize() <= 0) 690 if (vfile.getSize() <= 0)
692 { 691 {
693 llwarns << "downloadCompleteCallback has non-existent or zero-size asset!" << llendl; 692 llwarns << "downloadCompleteCallback has non-existent or zero-size asset!" << llendl;
@@ -697,7 +696,9 @@ void LLAssetStorage::downloadEstateAssetCompleteCallback(
697 } 696 }
698 } 697 }
699 698
700 req->mDownCallback(gAssetStorage->mVFS, req->getUUID(), req->getAType(), req->mUserData, result, ext_status); 699 req->mDownCallback(gAssetStorage->mVFS, file_id, file_type, req->mUserData, result, ext_status);
700
701 delete req;
701} 702}
702 703
703void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &agent_id, const LLUUID &session_id, 704void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &agent_id, const LLUUID &session_id,
@@ -802,10 +803,10 @@ void LLAssetStorage::downloadInvItemCompleteCallback(
802 S32 result, 803 S32 result,
803 const LLUUID& file_id, 804 const LLUUID& file_id,
804 LLAssetType::EType file_type, 805 LLAssetType::EType file_type,
805 void* user_data, 806 void* callback_parm_req,
806 LLExtStat ext_status) 807 LLExtStat ext_status)
807{ 808{
808 LLInvItemRequest *req = (LLInvItemRequest*)user_data; 809 LLInvItemRequest *req = (LLInvItemRequest*)callback_parm_req;
809 if(!req) 810 if(!req)
810 { 811 {
811 llwarns << "LLAssetStorage::downloadEstateAssetCompleteCallback called" 812 llwarns << "LLAssetStorage::downloadEstateAssetCompleteCallback called"
@@ -818,12 +819,10 @@ void LLAssetStorage::downloadInvItemCompleteCallback(
818 return; 819 return;
819 } 820 }
820 821
821 req->setUUID(file_id);
822 req->setType(file_type);
823 if (LL_ERR_NOERR == result) 822 if (LL_ERR_NOERR == result)
824 { 823 {
825 // we might have gotten a zero-size file 824 // we might have gotten a zero-size file
826 LLVFile vfile(gAssetStorage->mVFS, req->getUUID(), req->getType()); 825 LLVFile vfile(gAssetStorage->mVFS, file_id, file_type);
827 if (vfile.getSize() <= 0) 826 if (vfile.getSize() <= 0)
828 { 827 {
829 llwarns << "downloadCompleteCallback has non-existent or zero-size asset!" << llendl; 828 llwarns << "downloadCompleteCallback has non-existent or zero-size asset!" << llendl;
@@ -833,7 +832,9 @@ void LLAssetStorage::downloadInvItemCompleteCallback(
833 } 832 }
834 } 833 }
835 834
836 req->mDownCallback(gAssetStorage->mVFS, req->getUUID(), req->getType(), req->mUserData, result, ext_status); 835 req->mDownCallback(gAssetStorage->mVFS, file_id, file_type, req->mUserData, result, ext_status);
836
837 delete req;
837} 838}
838 839
839///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 840/////////////////////////////////////////////////////////////////////////////////////////////////////////////////