Navigation


Changeset 738:d666051658bd in freeDiameter for libfdcore


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

Fix broken 'almostcasecmp' logic

Location:
libfdcore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libfdcore/p_ce.c

    r725 r738  
    304304                               
    305305                                /* We check that the value matches what we know, otherwise disconnect the peer */
    306                                 if (fd_os_almostcasecmp(hdr->avp_value->os.data, hdr->avp_value->os.len,
    307                                                         peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen)) {
     306                                if (fd_os_almostcasesrch(hdr->avp_value->os.data, hdr->avp_value->os.len,
     307                                                        peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen, NULL)) {
    308308                                        TRACE_DEBUG(INFO, "Received a message with Origin-Host set to '%.*s' while expecting '%s'\n",
    309309                                                        hdr->avp_value->os.len, hdr->avp_value->os.data, peer->p_hdr.info.pi_diamid);
     
    813813        if (peer->p_hdr.info.config.pic_realm) {
    814814                size_t len = strlen(peer->p_hdr.info.config.pic_realm);
    815                 if (fd_os_almostcasecmp(peer->p_hdr.info.config.pic_realm, len, peer->p_hdr.info.runtime.pir_realm, peer->p_hdr.info.runtime.pir_realmlen)) {
     815                if (fd_os_almostcasesrch(peer->p_hdr.info.config.pic_realm, len, peer->p_hdr.info.runtime.pir_realm, peer->p_hdr.info.runtime.pir_realmlen, NULL)) {
    816816                        TRACE_DEBUG(INFO, "Rejected CER from peer '%s', realm mismatch with configured value (returning DIAMETER_UNKNOWN_PEER).\n", peer->p_hdr.info.pi_diamid);
    817817                        pei.pei_errcode = "DIAMETER_UNKNOWN_PEER"; /* maybe AVP_NOT_ALLOWED would be better fit? */
  • 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 */
  • libfdcore/routing_dispatch.c

    r717 r738  
    274274               
    275275                /* In the AVPs, the value comes from the network, so let's be case permissive */
    276                 if (dh && !fd_os_almostcasecmp(dh->os.data, dh->os.len, c->diamid, c->diamidlen) ) {
     276                if (dh && !fd_os_almostcasesrch(dh->os.data, dh->os.len, c->diamid, c->diamidlen, NULL) ) {
    277277                        /* The candidate is the Destination-Host */
    278278                        c->score += FD_SCORE_FINALDEST;
    279279                } else {
    280                         if (dr && !fd_os_almostcasecmp(dr->os.data, dr->os.len, c->realm, c->realmlen) ) {
     280                        if (dr && !fd_os_almostcasesrch(dr->os.data, dr->os.len, c->realm, c->realmlen, NULL) ) {
    281281                                /* The candidate's realm matchs the Destination-Realm */
    282282                                c->score += FD_SCORE_REALM;
     
    592592                                                ASSERT( ahdr->avp_value );
    593593                                                /* Compare the Destination-Host AVP of the message with our identity */
    594                                                 if (!fd_os_almostcasecmp(ahdr->avp_value->os.data, ahdr->avp_value->os.len, fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len)) {
     594                                                if (!fd_os_almostcasesrch(ahdr->avp_value->os.data, ahdr->avp_value->os.len, fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len, NULL)) {
    595595                                                        is_dest_host = YES;
    596596                                                } else {
     
    613613                                                dr_val = ahdr->avp_value;
    614614                                                /* Compare the Destination-Realm AVP of the message with our identity */
    615                                                 if (!fd_os_almostcasecmp(dr_val->os.data, dr_val->os.len, fd_g_config->cnf_diamrlm, fd_g_config->cnf_diamrlm_len)) {
     615                                                if (!fd_os_almostcasesrch(dr_val->os.data, dr_val->os.len, fd_g_config->cnf_diamrlm, fd_g_config->cnf_diamrlm_len, NULL)) {
    616616                                                        is_dest_realm = YES;
    617617                                                } else {
Note: See TracChangeset for help on using the changeset viewer.