Changes in libfdproto/messages.c [995:2016a0c46bda:1001:d03f7e3805ad] in freeDiameter
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdproto/messages.c
r995 r1001 303 303 static int bufferize_avp(unsigned char * buffer, size_t buflen, size_t * offset, struct avp * avp); 304 304 static 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 305 307 306 308 /* Create answer from a request */ … … 366 368 if (! (flags & MSGFL_ANSW_NOPROXYINFO)) { 367 369 struct avp * avp; 370 struct fd_pei pei; 371 struct fd_list avpcpylist = FD_LIST_INITIALIZER(avpcpylist); 372 368 373 CHECK_FCT( fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL) ); 369 374 while (avp) { … … 376 381 size_t offset = 0; 377 382 383 /* Create a buffer with the content of the AVP. This is easier than going through the list */ 378 384 CHECK_FCT( fd_msg_update_length(avp) ); 379 385 CHECK_MALLOC( buf = malloc(avp->avp_public.avp_len) ); 380 386 CHECK_FCT( bufferize_avp(buf, avp->avp_public.avp_len, &offset, avp) ); 381 387 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) ); 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) ); 384 393 385 394 /* Done for this AVP */ 386 395 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); 387 399 } 388 400 /* move to next AVP in the message, we can have several Proxy-Info instances */ 389 401 CHECK_FCT( fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL) ); 390 402 } 391 CHECK_FCT( fd_msg_parse_dict( ans, dict, NULL ) );392 403 } 393 404 … … 1558 1569 CHECK_PARAMS( avp->avp_source || avp->avp_rawdata ); 1559 1570 1560 if ( avp->avp_source != NULL ) { 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 { 1561 1576 /* the message was not parsed completely */ 1562 1577 size_t datalen = avp->avp_public.avp_len - GETAVPHDRSZ(avp->avp_public.avp_flags); 1563 1578 memcpy(&buffer[*offset], avp->avp_source, datalen); 1564 1579 *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);1569 1580 } 1570 1581 … … 1813 1824 */ 1814 1825 1815 static int parsedict_do_chain(struct dictionary * dict, struct fd_list * head, int mandatory, struct fd_pei *error_info);1816 1817 1826 static char error_message[256]; 1818 1827 … … 1821 1830 { 1822 1831 struct dict_avp_data dictdata; 1832 uint8_t * source; 1823 1833 1824 1834 TRACE_ENTRY("%p %p %d %p", dict, avp, mandatory, error_info); … … 1913 1923 } 1914 1924 1925 source = avp->avp_source; 1926 avp->avp_source = NULL; 1927 1915 1928 /* Now get the value inside */ 1916 1929 switch (dictdata.avp_basetype) { … … 1919 1932 1920 1933 /* This is a grouped AVP, so let's parse the list of AVPs inside */ 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),1934 CHECK_FCT_DO( ret = parsebuf_list(source, avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ), &avp->avp_chain.children), 1922 1935 { 1923 1936 if ((ret == EBADMSG) && (error_info)) { … … 1927 1940 error_info->pei_message = error_message; 1928 1941 } 1942 avp->avp_source = source; 1929 1943 return ret; 1930 1944 } ); … … 1941 1955 error_info->pei_avp = avp; 1942 1956 } 1957 avp->avp_source = source; 1943 1958 return EBADMSG; 1944 1959 } ); 1945 1960 avp->avp_storage.os.len = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ); 1946 CHECK_MALLOC( avp->avp_storage.os.data = os0dup( avp->avp_source, avp->avp_storage.os.len) );1961 CHECK_MALLOC( avp->avp_storage.os.data = os0dup(source, avp->avp_storage.os.len) ); 1947 1962 avp->avp_mustfreeos = 1; 1948 1963 break; 1949 1964 1950 1965 case AVP_TYPE_INTEGER32: 1951 avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *) avp->avp_source);1966 avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *)source); 1952 1967 break; 1953 1968 … … 1956 1971 { 1957 1972 uint64_t __stor; 1958 memcpy(&__stor, avp->avp_source, sizeof(__stor));1973 memcpy(&__stor, source, sizeof(__stor)); 1959 1974 avp->avp_storage.i64 = (int64_t)ntohll(__stor); 1960 1975 } … … 1963 1978 case AVP_TYPE_UNSIGNED32: 1964 1979 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 */ 1965 avp->avp_storage.u32 = (uint32_t)ntohl(*(uint32_t *) avp->avp_source);1980 avp->avp_storage.u32 = (uint32_t)ntohl(*(uint32_t *)source); 1966 1981 break; 1967 1982 … … 1970 1985 { 1971 1986 uint64_t __stor; 1972 memcpy(&__stor, avp->avp_source, sizeof(__stor));1987 memcpy(&__stor, source, sizeof(__stor)); 1973 1988 avp->avp_storage.u64 = (uint64_t)ntohll(__stor); 1974 1989 }
Note: See TracChangeset
for help on using the changeset viewer.