Changeset 7f6e52f for db/threaded.cc


Ignore:
Timestamp:
10/04/09 14:52:53 (5 years ago)
Author:
Antti-Juhani Kaijanaho <antti-juhani@…>
Branches:
master
Children:
b3686ec
Parents:
2557eca
git-author:
Antti-Juhani Kaijanaho <antti-juhani@…> (10/04/09 14:52:53)
git-committer:
Antti-Juhani Kaijanaho <antti-juhani@…> (10/04/09 14:52:53)
Message:

[SECURITY] [db::threaded] Fix handling of sibling_iterator

This caused a DoS vulnerability that was remote exploitable by at least
mirroring the https facet.

Signed-off-by: Antti-Juhani Kaijanaho <antti-juhani@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • db/threaded.cc

    r868b365 r7f6e52f  
    5050                        if (!tn->parent) return ptr(); 
    5151                        std::list<ptr>::iterator it = tn->sibling_iterator; 
     52                        assert(it != tn->parent->children.end()); 
    5253                        it++; 
    5354                        if (it == tn->parent->children.end()) 
     
    7879                p->children.push_back(shared_from_this()); 
    7980                sibling_iterator = p->children.end(); 
     81                assert(sibling_iterator != p->children.begin()); 
    8082                sibling_iterator--; 
    8183        } 
     
    126128                        else 
    127129                        { 
    128                                 children.insert(it,  
    129                                                 (*it)->children.begin(), 
    130                                                 (*it)->children.end()); 
     130                                for (std::list<ptr>::iterator jt = 
     131                                             (*it)->children.begin(); 
     132                                     jt != (*it)->children.end(); 
     133                                     jt++) 
     134                                { 
     135                                        (*jt)->sibling_iterator = 
     136                                                children.insert(it, *jt); 
     137                                        (*jt)->parent = shared_from_this(); 
     138                                } 
     139 
    131140                                std::list<ptr>::iterator next = it; 
    132141                                next++; 
    133142                                children.erase(it); 
     143                                (*it)->parent.reset(); 
    134144                                it = next; 
    135145                        } 
Note: See TracChangeset for help on using the changeset viewer.