Navigation


Changeset 738:d666051658bd in freeDiameter for libfdcore/peers.c


Ignore:
Timestamp:
Mar 2, 2011, 6:21:59 PM (11 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Fix broken 'almostcasecmp' logic

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdcore/peers.c

    r725 r738  
    9494{
    9595        struct fd_peer *p = NULL;
    96         struct fd_list * li;
     96        struct fd_list * li, *li_inf;
    9797        int ret = 0;
    9898       
     
    143143        /* Ok, now check if we don't already have an entry with the same Diameter Id, and insert this one */
    144144        CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_peers_rw) );
    145        
     145        li_inf = &fd_g_peers;
    146146        for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
    147147                struct fd_peer * next = (struct fd_peer *)li;
    148                 int cmp = fd_os_almostcasecmp( p->p_hdr.info.pi_diamid, p->p_hdr.info.pi_diamidlen,
    149                                                 next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen );
    150                 if (cmp > 0)
    151                         continue;
    152                 if (cmp == 0)
     148                int cont;
     149                int cmp = fd_os_almostcasesrch( p->p_hdr.info.pi_diamid, p->p_hdr.info.pi_diamidlen,
     150                                                next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen,
     151                                                &cont );
     152                if (cmp < 0)
     153                        li_inf = li;
     154               
     155                if (cmp == 0) {
    153156                        ret = EEXIST;
    154                 break;
     157                        break;
     158                }
     159                if (!cont)
     160                        break;
    155161        }
    156162       
     
    162168
    163169                        /* Insert the new element in the list */
    164                         fd_list_insert_before( li, &p->p_hdr.chain );
     170                        fd_list_insert_after( li_inf, &p->p_hdr.chain );
    165171                } while (0);
    166172
     
    185191        /* Search in the list */
    186192        CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) );
    187         for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
    188                 struct fd_peer * next = (struct fd_peer *)li;
    189                 int cmp;
    190                 if (igncase)
    191                         cmp = fd_os_almostcasecmp( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen );
    192                 else
    193                         cmp = fd_os_cmp( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen );
    194                 if (cmp > 0)
    195                         continue;
    196                 if (cmp == 0)
    197                         *peer = &next->p_hdr;
    198                 break;
    199         }
     193        if (igncase)
     194                for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
     195                        struct fd_peer * next = (struct fd_peer *)li;
     196                        int cmp, cont;
     197                        cmp = fd_os_almostcasesrch( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen, &cont );
     198                        if (cmp == 0) {
     199                                *peer = &next->p_hdr;
     200                                break;
     201                        }
     202                        if (!cont)
     203                                break;
     204                }
     205        else
     206                for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
     207                        struct fd_peer * next = (struct fd_peer *)li;
     208                        int cmp = fd_os_cmp( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen );
     209                        if (cmp > 0)
     210                                continue;
     211                        if (cmp == 0)
     212                                *peer = &next->p_hdr;
     213                        break;
     214                }
    200215        CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
    201216       
     
    429444        struct avp *avp_oh;
    430445        struct avp_hdr * avp_hdr;
    431         struct fd_list * li;
     446        struct fd_list * li, *li_inf;
    432447        int found = 0;
    433448        int ret = 0;
     
    470485        CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_peers_rw) );
    471486       
     487        li_inf = &fd_g_peers;
    472488        for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
    473                 int cmp;
     489                int cmp, cont;
    474490                peer = (struct fd_peer *)li->o;
    475                 cmp = fd_os_almostcasecmp( avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len, peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen );
    476                 if (cmp > 0)
     491                cmp = fd_os_almostcasesrch( avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len, peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen, &cont );
     492                if (cmp < 0) {
     493                        li_inf = li;
    477494                        continue;
    478                 if (cmp == 0)
     495                }
     496                if (cmp == 0) {
    479497                        found = 1;
    480                 break;
     498                        break;
     499                }
     500                if (!cont)
     501                        break;
    481502        }
    482503       
     
    500521               
    501522                /* Insert the new peer in the list (the PSM will take care of setting the expiry after validation) */
    502                 fd_list_insert_before( li, &peer->p_hdr.chain );
     523                fd_list_insert_after( li_inf, &peer->p_hdr.chain );
    503524               
    504525                /* Start the PSM, which will receive the event bellow */
Note: See TracChangeset for help on using the changeset viewer.