|
@@ -152,6 +152,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
|
|
|
struct str_int_data *sid;
|
|
|
struct str_str_data *ssd;
|
|
|
int len;
|
|
|
+ void** p_data;
|
|
|
|
|
|
if (name.s.s == 0 && name.s.len == 0) {
|
|
|
LOG(L_ERR,"ERROR:avp:add_avp: 0 ID or NULL NAME AVP!");
|
|
@@ -186,6 +187,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
|
|
|
avp->flags = flags;
|
|
|
avp->id = (flags&AVP_NAME_STR)? compute_ID(&name.s) : name.n ;
|
|
|
avp->next = NULL;
|
|
|
+ p_data=&avp->data; /* strict aliasing /type punning warnings workarround */
|
|
|
|
|
|
switch ( flags&(AVP_NAME_STR|AVP_VAL_STR) )
|
|
|
{
|
|
@@ -195,7 +197,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
|
|
|
break;
|
|
|
case AVP_NAME_STR:
|
|
|
/* avp type str, int value */
|
|
|
- sid = (struct str_int_data*)&(avp->data);
|
|
|
+ sid = (struct str_int_data*)p_data;
|
|
|
sid->val = val.n;
|
|
|
sid->name.len =name.s.len;
|
|
|
sid->name.s = (char*)sid + sizeof(struct str_int_data);
|
|
@@ -204,7 +206,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
|
|
|
break;
|
|
|
case AVP_VAL_STR:
|
|
|
/* avp type ID, str value */
|
|
|
- s = (str*)&(avp->data);
|
|
|
+ s = (str*)p_data;
|
|
|
s->len = val.s.len;
|
|
|
s->s = (char*)s + sizeof(str);
|
|
|
memcpy( s->s, val.s.s , s->len);
|
|
@@ -212,7 +214,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
|
|
|
break;
|
|
|
case AVP_NAME_STR|AVP_VAL_STR:
|
|
|
/* avp type str, str value */
|
|
|
- ssd = (struct str_str_data*)&(avp->data);
|
|
|
+ ssd = (struct str_str_data*)p_data;
|
|
|
ssd->name.len = name.s.len;
|
|
|
ssd->name.s = (char*)ssd + sizeof(struct str_str_data);
|
|
|
memcpy( ssd->name.s , name.s.s, name.s.len);
|
|
@@ -293,6 +295,8 @@ int add_avp_before(avp_t *avp, avp_flags_t flags, avp_name_t name, avp_value_t v
|
|
|
/* get value functions */
|
|
|
inline str* get_avp_name(avp_t *avp)
|
|
|
{
|
|
|
+ void** p_data; /* strict aliasing /type punning warnings workarround */
|
|
|
+
|
|
|
switch ( avp->flags&(AVP_NAME_STR|AVP_VAL_STR) )
|
|
|
{
|
|
|
case 0:
|
|
@@ -302,10 +306,12 @@ inline str* get_avp_name(avp_t *avp)
|
|
|
return 0;
|
|
|
case AVP_NAME_STR:
|
|
|
/* avp type str, int value */
|
|
|
- return &((struct str_int_data*)&avp->data)->name;
|
|
|
+ p_data=&avp->data;
|
|
|
+ return &((struct str_int_data*)p_data)->name;
|
|
|
case AVP_NAME_STR|AVP_VAL_STR:
|
|
|
/* avp type str, str value */
|
|
|
- return &((struct str_str_data*)&avp->data)->name;
|
|
|
+ p_data=&avp->data;
|
|
|
+ return &((struct str_str_data*)p_data)->name;
|
|
|
}
|
|
|
|
|
|
LOG(L_ERR,"BUG:avp:get_avp_name: unknown avp type (name&val) %d\n",
|
|
@@ -316,9 +322,12 @@ inline str* get_avp_name(avp_t *avp)
|
|
|
|
|
|
inline void get_avp_val(avp_t *avp, avp_value_t *val)
|
|
|
{
|
|
|
+ void** p_data; /* strict aliasing /type punning warnings workarround */
|
|
|
+
|
|
|
if (avp==0 || val==0)
|
|
|
return;
|
|
|
|
|
|
+ p_data=&avp->data;
|
|
|
switch ( avp->flags&(AVP_NAME_STR|AVP_VAL_STR) ) {
|
|
|
case 0:
|
|
|
/* avp type ID, int value */
|
|
@@ -326,15 +335,15 @@ inline void get_avp_val(avp_t *avp, avp_value_t *val)
|
|
|
break;
|
|
|
case AVP_NAME_STR:
|
|
|
/* avp type str, int value */
|
|
|
- val->n = ((struct str_int_data*)(&avp->data))->val;
|
|
|
+ val->n = ((struct str_int_data*)p_data)->val;
|
|
|
break;
|
|
|
case AVP_VAL_STR:
|
|
|
/* avp type ID, str value */
|
|
|
- val->s = *(str*)(&avp->data);
|
|
|
+ val->s = *(str*)(void*)(&avp->data);
|
|
|
break;
|
|
|
case AVP_NAME_STR|AVP_VAL_STR:
|
|
|
/* avp type str, str value */
|
|
|
- val->s = (((struct str_str_data*)(&avp->data))->val);
|
|
|
+ val->s = (((struct str_str_data*)p_data)->val);
|
|
|
break;
|
|
|
}
|
|
|
}
|