Navigation



Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdproto/messages.c

    r1001 r995  
    303303static int bufferize_avp(unsigned char * buffer, size_t buflen, size_t * offset,  struct avp * avp);
    304304static int parsebuf_list(unsigned char * buf, size_t buflen, struct fd_list * head);
    305 static int parsedict_do_chain(struct dictionary * dict, struct fd_list * head, int mandatory, struct fd_pei *error_info);
    306 
    307305
    308306/* Create answer from a request */
     
    368366        if (! (flags & MSGFL_ANSW_NOPROXYINFO)) {
    369367                struct avp * avp;
    370                 struct fd_pei pei;
    371                 struct fd_list avpcpylist = FD_LIST_INITIALIZER(avpcpylist);
    372                
    373368                CHECK_FCT(  fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL)  );
    374369                while (avp) {
     
    381376                                size_t offset = 0;
    382377
    383                                 /* Create a buffer with the content of the AVP. This is easier than going through the list */
    384378                                CHECK_FCT(  fd_msg_update_length(avp)  );
    385379                                CHECK_MALLOC(  buf = malloc(avp->avp_public.avp_len)  );
    386380                                CHECK_FCT( bufferize_avp(buf, avp->avp_public.avp_len, &offset, avp)  );
    387381
    388                                 /* Now we parse this buffer to create a copy AVP */
    389                                 CHECK_FCT( parsebuf_list(buf, avp->avp_public.avp_len, &avpcpylist) );
    390                                
    391                                 /* Parse dictionary objects now to remove the dependency on the buffer */
    392                                 CHECK_FCT( parsedict_do_chain(dict, &avpcpylist, 0, &pei) );
     382                                /* Now we directly parse this buffer into the new message list */
     383                                CHECK_FCT( parsebuf_list(buf, avp->avp_public.avp_len, &ans->msg_chain.children) );
    393384
    394385                                /* Done for this AVP */
    395386                                free(buf);
    396 
    397                                 /* We move this AVP now so that we do not parse again in next loop */
    398                                 fd_list_move_end(&ans->msg_chain.children, &avpcpylist);
    399387                        }
    400388                        /* move to next AVP in the message, we can have several Proxy-Info instances */
    401389                        CHECK_FCT( fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL) );
    402390                }
     391                CHECK_FCT( fd_msg_parse_dict( ans, dict, NULL ) );
    403392        }
    404393
     
    15691558                CHECK_PARAMS( avp->avp_source || avp->avp_rawdata );
    15701559               
    1571                 if ( avp->avp_rawdata != NULL ) {
    1572                         /* the content was stored in rawdata */
    1573                         memcpy(&buffer[*offset], avp->avp_rawdata, avp->avp_rawlen);
    1574                         *offset += PAD4(avp->avp_rawlen);
    1575                 } else {
     1560                if ( avp->avp_source != NULL ) {
    15761561                        /* the message was not parsed completely */
    15771562                        size_t datalen = avp->avp_public.avp_len - GETAVPHDRSZ(avp->avp_public.avp_flags);
    15781563                        memcpy(&buffer[*offset], avp->avp_source, datalen);
    15791564                        *offset += PAD4(datalen);
     1565                } else {
     1566                        /* the content was stored in rawdata */
     1567                        memcpy(&buffer[*offset], avp->avp_rawdata, avp->avp_rawlen);
     1568                        *offset += PAD4(avp->avp_rawlen);
    15801569                }
    15811570               
     
    18241813 */
    18251814
     1815static int parsedict_do_chain(struct dictionary * dict, struct fd_list * head, int mandatory, struct fd_pei *error_info);
     1816
    18261817static char error_message[256];
    18271818
     
    18301821{
    18311822        struct dict_avp_data dictdata;
    1832         uint8_t * source;
    18331823       
    18341824        TRACE_ENTRY("%p %p %d %p", dict, avp, mandatory, error_info);
     
    19231913        }
    19241914       
    1925         source = avp->avp_source;
    1926         avp->avp_source = NULL;
    1927 
    19281915        /* Now get the value inside */
    19291916        switch (dictdata.avp_basetype) {
     
    19321919                       
    19331920                        /* This is a grouped AVP, so let's parse the list of AVPs inside */
    1934                         CHECK_FCT_DO(  ret = parsebuf_list(source, avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ), &avp->avp_chain.children),
     1921                        CHECK_FCT_DO(  ret = parsebuf_list(avp->avp_source, avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ), &avp->avp_chain.children),
    19351922                                {
    19361923                                        if ((ret == EBADMSG) && (error_info)) {
     
    19401927                                                error_info->pei_message = error_message;
    19411928                                        }
    1942                                         avp->avp_source = source;
    19431929                                        return ret;
    19441930                                }  );
     
    19551941                                                error_info->pei_avp = avp;
    19561942                                        }
    1957                                         avp->avp_source = source;
    19581943                                        return EBADMSG;
    19591944                                } );
    19601945                        avp->avp_storage.os.len = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags );
    1961                         CHECK_MALLOC(  avp->avp_storage.os.data = os0dup(source, avp->avp_storage.os.len)  );
     1946                        CHECK_MALLOC(  avp->avp_storage.os.data = os0dup(avp->avp_source, avp->avp_storage.os.len)  );
    19621947                        avp->avp_mustfreeos = 1;
    19631948                        break;
    19641949               
    19651950                case AVP_TYPE_INTEGER32:
    1966                         avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *)source);
     1951                        avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *)avp->avp_source);
    19671952                        break;
    19681953       
     
    19711956                        {
    19721957                                uint64_t __stor;
    1973                                 memcpy(&__stor, source, sizeof(__stor));
     1958                                memcpy(&__stor, avp->avp_source, sizeof(__stor));
    19741959                                avp->avp_storage.i64 = (int64_t)ntohll(__stor);
    19751960                        }
     
    19781963                case AVP_TYPE_UNSIGNED32:
    19791964                case AVP_TYPE_FLOAT32: /* For float, we must not cast, or the value is changed. Instead we use implicit cast by changing the member of the union */
    1980                         avp->avp_storage.u32 = (uint32_t)ntohl(*(uint32_t *)source);
     1965                        avp->avp_storage.u32 = (uint32_t)ntohl(*(uint32_t *)avp->avp_source);
    19811966                        break;
    19821967       
     
    19851970                        {
    19861971                                uint64_t __stor;
    1987                                 memcpy(&__stor, source, sizeof(__stor));
     1972                                memcpy(&__stor, avp->avp_source, sizeof(__stor));
    19881973                                avp->avp_storage.u64 = (uint64_t)ntohll(__stor);
    19891974                        }
Note: See TracChangeset for help on using the changeset viewer.