Module: kamailio Branch: master Commit: 7162dc0a7368f61e3b32231a2ad00e72ee29d82e URL: https://github.com/kamailio/kamailio/commit/7162dc0a7368f61e3b32231a2ad00e72...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2022-01-12T17:02:11+01:00
ctl: float/double values are stored over a long long int instead of int
- cope with larger values than MAX_INT/1000, supporint now up to MAX_LLONG/1000
---
Modified: src/modules/ctl/binrpc.h
---
Diff: https://github.com/kamailio/kamailio/commit/7162dc0a7368f61e3b32231a2ad00e72... Patch: https://github.com/kamailio/kamailio/commit/7162dc0a7368f61e3b32231a2ad00e72...
---
diff --git a/src/modules/ctl/binrpc.h b/src/modules/ctl/binrpc.h index cb7204fffd..bb34cd3be5 100644 --- a/src/modules/ctl/binrpc.h +++ b/src/modules/ctl/binrpc.h @@ -205,6 +205,31 @@ inline static int binrpc_add_tag(struct binrpc_pkt* pkt, int type, int end)
+/* writes a minimal long long, returns the new offset and sets + * len to the number of bytes written (<=8) + * to check for oveflow use: returned_value-p != *len + * (Note: if *len==0 using the test above succeeds even if p>=end) + */ +inline static unsigned char* binrpc_write_llong( unsigned char* p, + unsigned char* end, + long long i, int *len) +{ + int size; + unsigned long long u; + + u = (unsigned long long)i; + + for (size=8; size && ((u & (0xffull<<56))==0); u<<=8, size--); + *len=size; + for(; (p<end) && (size); p++, size--){ + *p=(unsigned char)(u>>56); + u<<=8; + } + return p; +} + + + /* writes a minimal int, returns the new offset and sets * len to the number of bytes written (<=4) * to check for oveflow use: returned_value-p != *len @@ -330,6 +355,23 @@ inline static int binrpc_hdr_change_len(unsigned char* hdr, int hdr_len, }
+/* int format: size TYPE <val> */ +inline static int binrpc_add_llong_type(struct binrpc_pkt* pkt, long long i, int type) +{ + + unsigned char* p; + int size; + + p=binrpc_write_llong(pkt->crt+1, pkt->end, i, &size); + if ((pkt->crt>=pkt->end) || ((int)(p-pkt->crt-1)!=size)) + goto error_len; + *(pkt->crt)=(size<<4) | type; + pkt->crt=p; + return 0; +error_len: + return E_BINRPC_OVERFLOW; +} +
/* int format: size BINRPC_T_INT <val> */ inline static int binrpc_add_int_type(struct binrpc_pkt* pkt, int i, int type) @@ -351,9 +393,9 @@ inline static int binrpc_add_int_type(struct binrpc_pkt* pkt, int i, int type)
/* double format: FIXME: for now a hack: fixed point represented in - * an int (=> max 3 decimals, < MAX_INT/1000) */ + * a long long (=> max 3 decimals, < MAX_LLONG/1000) */ #define binrpc_add_double_type(pkt, f, type)\ - binrpc_add_int_type((pkt), (int)((f)*1000), (type)) + binrpc_add_llong_type((pkt), (long long)((f)*1000), (type))
@@ -516,6 +558,35 @@ static inline int binrpc_addfault( struct binrpc_pkt* pkt, /* parsing incoming messages */
+static inline unsigned char* binrpc_read_llong( long long* i, + int len, + unsigned char* s, + unsigned char* end, + int *err + ) +{ + unsigned char* start; + unsigned long long u; + + start=s; + *i=0; + u = 0; + *err=0; + for(;len>0; len--, s++){ + if (s>=end){ + *err=E_BINRPC_MORE_DATA; + *i = (long long)u; + return start; + } + u<<=8; + u|=*s; + }; + *i = (long long)u; + return s; +} + + + static inline unsigned char* binrpc_read_int( int* i, int len, unsigned char* s, @@ -638,8 +709,8 @@ inline static unsigned char* binrpc_read_record(struct binrpc_parse_ctx* ctx, int end_tag; int tmp; unsigned char* p; - int i; - + long long ll; + p=buf; end_tag=0; *err=0; @@ -758,10 +829,10 @@ inline static unsigned char* binrpc_read_record(struct binrpc_parse_ctx* ctx, } break; case BINRPC_T_DOUBLE: /* FIXME: hack: represented as fixed point - inside an int */ + inside an long long */ if (ctx->in_struct && smode==0) goto error_record; - p=binrpc_read_int(&i, len, p, end, err); - v->u.fval=((double)i)/1000; + p=binrpc_read_llong(&ll, len, p, end, err); + v->u.fval=((double)ll)/1000; break; default: if (ctx->in_struct){