author | Michael Krelin <hacker@klever.net> | 2011-04-27 10:10:00 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2011-04-27 10:10:00 (UTC) |
commit | d097b824b7fcad001c9581fb2e322bf3e3e5961d (patch) (unidiff) | |
tree | 5a1c55e82c4b0ff4acca276b8e1122547530cc0b | |
parent | 65981784977659461f08b48f537be9f9f77a2112 (diff) | |
download | pumpkin-d097b824b7fcad001c9581fb2e322bf3e3e5961d.zip pumpkin-d097b824b7fcad001c9581fb2e322bf3e3e5961d.tar.gz pumpkin-d097b824b7fcad001c9581fb2e322bf3e3e5961d.tar.bz2 |
fix for misleading error message about unexpected source
along with a double-freeing offense. When I fail to receive packet not only
I diagnose this unfortunate development, but also start talking about
packet from unexpected source which is kinda weird considering there's
no packet at all.
Signed-off-by: Michael Krelin <hacker@klever.net>
-rwxr-xr-x[-rw-r--r--] | PumpKINDlg.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp index f41b69f..3ff1500 100644..100755 --- a/PumpKINDlg.cpp +++ b/PumpKINDlg.cpp | |||
@@ -540,128 +540,129 @@ tftp::tftp() | |||
540 | } | 540 | } |
541 | 541 | ||
542 | 542 | ||
543 | void CXferSocket::OnSend(int nErrorCode) | 543 | void CXferSocket::OnSend(int nErrorCode) |
544 | { | 544 | { |
545 | if(nErrorCode){ | 545 | if(nErrorCode){ |
546 | ASSERT(m_Daddy); | 546 | ASSERT(m_Daddy); |
547 | m_Daddy->LogLine(IDS_LOG_XFERSEND); | 547 | m_Daddy->LogLine(IDS_LOG_XFERSEND); |
548 | return; | 548 | return; |
549 | } | 549 | } |
550 | if(!m_Queue.IsEmpty()){ | 550 | if(!m_Queue.IsEmpty()){ |
551 | tftp *p = m_Queue.GetHead(); | 551 | tftp *p = m_Queue.GetHead(); |
552 | ASSERT(p); | 552 | ASSERT(p); |
553 | m_Queue.RemoveHead(); | 553 | m_Queue.RemoveHead(); |
554 | if(!p->Send(this,&m_Peer)){ | 554 | if(!p->Send(this,&m_Peer)){ |
555 | ASSERT(m_Daddy); | 555 | ASSERT(m_Daddy); |
556 | m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); | 556 | m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); |
557 | } | 557 | } |
558 | delete p; | 558 | delete p; |
559 | } | 559 | } |
560 | DoSelect(); | 560 | DoSelect(); |
561 | if(m_Queue.IsEmpty()){ | 561 | if(m_Queue.IsEmpty()){ |
562 | switch(state){ | 562 | switch(state){ |
563 | case stateDeny: | 563 | case stateDeny: |
564 | Destroy(FALSE); | 564 | Destroy(FALSE); |
565 | break; | 565 | break; |
566 | case stateFinish: | 566 | case stateFinish: |
567 | Destroy(TRUE); | 567 | Destroy(TRUE); |
568 | break; | 568 | break; |
569 | } | 569 | } |
570 | } | 570 | } |
571 | } | 571 | } |
572 | 572 | ||
573 | BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) | 573 | BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) |
574 | { | 574 | { |
575 | ASSERT(socket); | 575 | ASSERT(socket); |
576 | int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); | 576 | int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); |
577 | if(rv!=length) | 577 | if(rv!=length) |
578 | return FALSE; | 578 | return FALSE; |
579 | return TRUE; | 579 | return TRUE; |
580 | } | 580 | } |
581 | 581 | ||
582 | void CXferSocket::DoSelect(BOOL do_select) | 582 | void CXferSocket::DoSelect(BOOL do_select) |
583 | { | 583 | { |
584 | if(m_Peer.sin_addr.s_addr!=INADDR_NONE) | 584 | if(m_Peer.sin_addr.s_addr!=INADDR_NONE) |
585 | AsyncSelect(FD_CLOSE|FD_READ|((m_Queue.IsEmpty()&&!do_select)?0:FD_WRITE)); | 585 | AsyncSelect(FD_CLOSE|FD_READ|((m_Queue.IsEmpty()&&!do_select)?0:FD_WRITE)); |
586 | } | 586 | } |
587 | 587 | ||
588 | void CXferSocket::OnReceive(int nErrorCode) | 588 | void CXferSocket::OnReceive(int nErrorCode) |
589 | { | 589 | { |
590 | if(nErrorCode){ | 590 | if(nErrorCode){ |
591 | ASSERT(m_Daddy); | 591 | ASSERT(m_Daddy); |
592 | m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); | 592 | m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); |
593 | return; | 593 | return; |
594 | } | 594 | } |
595 | ASSERT(m_Daddy); | 595 | ASSERT(m_Daddy); |
596 | DWORD fionread = 0; | 596 | DWORD fionread = 0; |
597 | VERIFY(IOCtl(FIONREAD,&fionread)); | 597 | VERIFY(IOCtl(FIONREAD,&fionread)); |
598 | tftp *p = tftp::Allocate(fionread); | 598 | tftp *p = tftp::Allocate(fionread); |
599 | ASSERT(p); | 599 | ASSERT(p); |
600 | SOCKADDR_IN sin; | 600 | SOCKADDR_IN sin; |
601 | if(!p->Receive(this,fionread,&sin)){ | 601 | if(!p->Receive(this,fionread,&sin)){ |
602 | m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); | 602 | m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); |
603 | delete p; | 603 | delete p; |
604 | return; | ||
604 | }else | 605 | }else |
605 | if(m_Peer.sin_addr.s_addr==INADDR_NONE){ | 606 | if(m_Peer.sin_addr.s_addr==INADDR_NONE){ |
606 | m_Peer.sin_addr=sin.sin_addr; | 607 | m_Peer.sin_addr=sin.sin_addr; |
607 | m_Peer.sin_port=sin.sin_port; | 608 | m_Peer.sin_port=sin.sin_port; |
608 | } | 609 | } |
609 | BOOL alive = TRUE; | 610 | BOOL alive = TRUE; |
610 | if(state==stateInit){ | 611 | if(state==stateInit){ |
611 | state=stateXfer; | 612 | state=stateXfer; |
612 | m_Peer.sin_port=sin.sin_port; | 613 | m_Peer.sin_port=sin.sin_port; |
613 | UpdateList(); | 614 | UpdateList(); |
614 | } | 615 | } |
615 | if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){ | 616 | if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){ |
616 | m_Daddy->LogLine(IDS_LOG_XFERSOURCETID); | 617 | m_Daddy->LogLine(IDS_LOG_XFERSOURCETID); |
617 | // *** Bounce it! | 618 | // *** Bounce it! |
618 | }else{ | 619 | }else{ |
619 | alive = OnTFTP(p); | 620 | alive = OnTFTP(p); |
620 | } | 621 | } |
621 | delete p; | 622 | delete p; |
622 | if(alive){ | 623 | if(alive){ |
623 | DoSelect(); | 624 | DoSelect(); |
624 | ResetTimeout(); | 625 | ResetTimeout(); |
625 | } | 626 | } |
626 | } | 627 | } |
627 | 628 | ||
628 | void CXferSocket::SetPeer(SOCKADDR_IN *sin) | 629 | void CXferSocket::SetPeer(SOCKADDR_IN *sin) |
629 | { | 630 | { |
630 | ASSERT(sin); | 631 | ASSERT(sin); |
631 | memmove(&m_Peer,sin,sizeof(m_Peer)); | 632 | memmove(&m_Peer,sin,sizeof(m_Peer)); |
632 | } | 633 | } |
633 | 634 | ||
634 | void CXferSocket::UpdateList() | 635 | void CXferSocket::UpdateList() |
635 | { | 636 | { |
636 | ASSERT(m_Daddy); | 637 | ASSERT(m_Daddy); |
637 | LV_FINDINFO lvf; | 638 | LV_FINDINFO lvf; |
638 | memset(&lvf,0,sizeof(lvf)); | 639 | memset(&lvf,0,sizeof(lvf)); |
639 | lvf.flags=LVFI_PARAM; | 640 | lvf.flags=LVFI_PARAM; |
640 | lvf.lParam=(LPARAM)this; | 641 | lvf.lParam=(LPARAM)this; |
641 | int i = m_Daddy->m_List.FindItem(&lvf); | 642 | int i = m_Daddy->m_List.FindItem(&lvf); |
642 | if(i<0){ | 643 | if(i<0){ |
643 | ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); | 644 | ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); |
644 | i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ); | 645 | i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ); |
645 | ASSERT(!(i<0)); | 646 | ASSERT(!(i<0)); |
646 | m_Daddy->m_List.SetItemData(i,(DWORD)this); | 647 | m_Daddy->m_List.SetItemData(i,(DWORD)this); |
647 | } | 648 | } |
648 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); | 649 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); |
649 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); | 650 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); |
650 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr)); | 651 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr)); |
651 | CString tmp; | 652 | CString tmp; |
652 | tmp.Format(IDS_FMT_BYTES,GetACK()); | 653 | tmp.Format(IDS_FMT_BYTES,GetACK()); |
653 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); | 654 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); |
654 | if(m_xferSize>=0){ | 655 | if(m_xferSize>=0){ |
655 | tmp.Format(IDS_FMT_BYTES,m_xferSize); | 656 | tmp.Format(IDS_FMT_BYTES,m_xferSize); |
656 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); | 657 | m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); |
657 | } | 658 | } |
658 | } | 659 | } |
659 | 660 | ||
660 | CXferSocket::CXferSocket() | 661 | CXferSocket::CXferSocket() |
661 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), | 662 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), |
662 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), | 663 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), |
663 | m__blkSize(512), m__timeOut(30) | 664 | m__blkSize(512), m__timeOut(30) |
664 | { | 665 | { |
665 | m_Daddy=NULL; | 666 | m_Daddy=NULL; |
666 | m_Peer.sin_addr.s_addr=INADDR_NONE; | 667 | m_Peer.sin_addr.s_addr=INADDR_NONE; |
667 | m_Peer.sin_family=AF_INET; | 668 | m_Peer.sin_family=AF_INET; |