From 6a01019bf63cf897d2430d6ada085cd23465fa79 Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Tue, 24 May 2016 00:00:34 +0200 Subject: [PATCH 1/3] Makefile.defs: detect gcc 6.x - reported by Anthony Messina, GH #633 (cherry picked from commit 1975ebdf37b9ffd325a38960bc0bf417466b432f) --- Makefile.defs | 70 ++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 495baaa2e2a..8aac11a4cc8 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -239,8 +239,10 @@ ifneq (,$(findstring gcc, $(CC_LONGVER))) -e 's/4\.[5-9]\..*/4.5+/' \ -e 's/4\.[5-9]$$/4.5+/' \ -e 's/5\.[0-9]\..*/5.0+/' \ - -e 's/5\.[0-9]$$/5.0+/') -ifeq (,$(strip $(filter-out 3.0 3.4 4.x 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + -e 's/5\.[0-9]$$/5.0+/' \ + -e 's/6\.[0-9]\..*/6.0+/' \ + -e 's/6\.[0-9]$$/6.0+/') +ifeq (,$(strip $(filter-out 3.0 3.4 4.x 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) # dependencies can be generated on-the-fly while compiling *.c CC_MKDEP_OPTS=-MMD -MP endif # 3.0 <= $(CC_SHORTVER) <= 4.x @@ -842,8 +844,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS=-g $(CC_OPT) -funroll-loops -Wcast-align $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) $(call set_if_empty,CPUTYPE,athlon64) CFLAGS+=-m32 -minline-all-stringops \ -falign-loops \ @@ -892,7 +894,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc ifeq ($(CC_NAME), clang) @@ -926,7 +928,7 @@ ifeq ($(CC_NAME), gcc) CFLAGS=-g $(CC_OPT) -funroll-loops -Wcast-align $(PROFILE) #if gcc 4.5+ # don't add '-mtune=$(CPUTYPE)' - gcc failure -ifeq ($(CC_SHORTVER),$(filter $(CC_SHORTVER),4.5+ 5.0+)) +ifeq ($(CC_SHORTVER),$(filter $(CC_SHORTVER),4.5+ 5.0+ 6.0+)) $(call set_if_empty,CPUTYPE,opteron) CFLAGS+=-m64 -minline-all-stringops \ -falign-loops \ @@ -985,7 +987,7 @@ endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x endif # CC_SHORTVER, 4.2+ -endif # CC_SHORTVER, 5.0+, 4.5+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ else # CC_NAME, gcc ifeq ($(CC_NAME), clang) @@ -1020,8 +1022,8 @@ ifeq ($(CC_NAME), gcc) CFLAGS=-g $(CC_OPT) -funroll-loops $(PROFILE) \ #-Wcast-align \ #-Wmissing-prototypes - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) $(call set_if_empty,CPUTYPE,ultrasparc) #use 32bit for now CFLAGS+=-m64 -mcpu=ultrasparc \ @@ -1087,7 +1089,7 @@ endif #CC_SHORTVER, 2.9x endif #CC_SHORTVER, 3.0 endif #CC_SHORTVER, 3.4 endif #CC_SHORTVER, 4.x -endif #CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif #CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else #CC_NAME, gcc ifeq ($(CC_NAME), suncc) @@ -1112,7 +1114,7 @@ ifeq ($(CC_NAME), gcc) #-Wcast-align \ #-Wmissing-prototypes #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) $(call set_if_empty,CPUTYPE,v8) #use 32bit for now CFLAGS+= -mtune=$(CPUTYPE) \ @@ -1153,7 +1155,7 @@ endif #CC_SHORTVER, 2.9x endif #CC_SHORTVER, 3.0 endif #CC_SHORTVER, 3.4 endif #CC_SHORTVER, 4.x -endif #CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif #CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else #CC_NAME, gcc ifeq ($(CC_NAME), suncc) @@ -1175,7 +1177,7 @@ ifeq ($(CC_NAME), gcc) #common stuff CFLAGS=-marm -march=armv5t $(CC_OPT) -funroll-loops -fsigned-char $(PROFILE) #if gcc 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+= -ftree-vectorize -fno-strict-overflow # not supported on arm: -minline-all-stringops else @@ -1207,7 +1209,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1223,8 +1225,8 @@ ifeq ($(CC_NAME), gcc) #common stuff CFLAGS=-march=armv6 $(CC_OPT) -funroll-loops -fsigned-char \ $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+= -ftree-vectorize -fno-strict-overflow else #if gcc 4.x+ @@ -1254,7 +1256,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1269,8 +1271,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS=$(CC_OPT) -funroll-loops $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+=-mfp32 -march=r3000 \ -ftree-vectorize -fno-strict-overflow # not supported on mips: -minline-all-stringops @@ -1303,7 +1305,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1318,8 +1320,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS= -mips2 $(CC_OPT) -funroll-loops $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+=-ftree-vectorize -fno-strict-overflow # not supported on mips: -minline-all-stringops else @@ -1349,7 +1351,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1364,8 +1366,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS= -mips64 $(CC_OPT) -funroll-loops $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+=-ftree-vectorize -fno-strict-overflow # not supported on mips: -minline-all-stringops @@ -1396,7 +1398,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1412,7 +1414,7 @@ ifeq ($(CC_NAME), gcc) #common stuff CFLAGS= $(CC_OPT) -funroll-loops $(PROFILE) #if gcc 5.0+, 4.5 or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) CFLAGS+= -fno-strict-overflow # not supported: -minline-all-stringops else @@ -1442,7 +1444,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1457,8 +1459,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS= - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) $(call set_if_empty,CPUTYPE,powerpc) ifeq ($(NOALTIVEC),) CFLAGS += $(CC_OPT) -funroll-loops -fsigned-char $(PROFILE) @@ -1499,7 +1501,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers @@ -1514,8 +1516,8 @@ ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff CFLAGS= $(CC_OPT) -funroll-loops -fsigned-char $(PROFILE) - #if gcc 5.0+, 4.5+ or 4.2+ -ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+,$(CC_SHORTVER)))) + #if gcc 6.0+, 5.0+, 4.5+ or 4.2+ +ifeq (,$(strip $(filter-out 4.2+ 4.5+ 5.0+ 6.0+,$(CC_SHORTVER)))) $(call set_if_empty,CPUTYPE,powerpc64) CFLAGS+=-ftree-vectorize \ -fno-strict-overflow \ @@ -1548,7 +1550,7 @@ endif # CC_SHORTVER, 2.9x endif # CC_SHORTVER, 3.0 endif # CC_SHORTVER, 3.4 endif # CC_SHORTVER, 4.x -endif # CC_SHORTVER, 5.0+, 4.5+ or 4.2+ +endif # CC_SHORTVER, 6.0+, 5.0+, 4.5+ or 4.2+ else # CC_NAME, gcc #other compilers From 3acfc0003915401f1a27120b9a5d329b2e52e78d Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Fri, 27 May 2016 11:14:26 +0200 Subject: [PATCH 2/3] uac: proper handling of empty attribute for uacreg refresh - reg_db_set_attr() does a continue on empty value, but for this operation was not used inside a loop - reported by Dmitri Savolainen, GH #643 (cherry picked from commit a34b382002cf9efe13c913f547ffacec3bd7757f) --- modules/uac/uac_reg.c | 74 ++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/modules/uac/uac_reg.c b/modules/uac/uac_reg.c index 8ff63bdef28..63b0ff0979d 100644 --- a/modules/uac/uac_reg.c +++ b/modules/uac/uac_reg.c @@ -1310,46 +1310,48 @@ int uac_reg_db_refresh(str *pl_uuid) } } - memset(®, 0, sizeof(reg_uac_t));; - i = 0; - /* check for NULL values ?!?! */ - reg_db_set_attr(l_uuid, 0); - reg_db_set_attr(l_username, 1); - reg_db_set_attr(l_domain, 2); - reg_db_set_attr(r_username, 3); - reg_db_set_attr(r_domain, 4); - /* realm may be empty */ - if(!VAL_NULL(&RES_ROWS(db_res)[i].values[5])) { - reg.realm.s = (char*)(RES_ROWS(db_res)[i].values[5].val.string_val); - reg.realm.len = strlen(reg.realm.s); - } - reg_db_set_attr(auth_username, 6); - reg_db_set_attr(auth_password, 7); - reg_db_set_attr(auth_proxy, 8); - reg.expires = (unsigned int)RES_ROWS(db_res)[i].values[9].val.int_val; - reg.h_uuid = reg_compute_hash(®.l_uuid); - reg.h_user = reg_compute_hash(®.l_username); - reg.flags = (unsigned int)RES_ROWS(db_res)[i].values[10].val.int_val; - reg.reg_delay = (unsigned int)RES_ROWS(db_res)[i].values[11].val.int_val; - - lock_get(_reg_htable_gc_lock); - if(reg_ht_get_byuuid(pl_uuid)!=NULL) - { - if(reg_ht_update_attrs(®)<0) - { - lock_release(_reg_htable_gc_lock); - LM_ERR("Error updating reg to htable\n"); - goto error; + memset(®, 0, sizeof(reg_uac_t)); + /* only one record - use FOR to catch 'contunue' on invalid set attr */ + for(i=0; i<1; i++) { + /* check for NULL values ?!?! */ + reg_db_set_attr(l_uuid, 0); + reg_db_set_attr(l_username, 1); + reg_db_set_attr(l_domain, 2); + reg_db_set_attr(r_username, 3); + reg_db_set_attr(r_domain, 4); + /* realm may be empty */ + if(!VAL_NULL(&RES_ROWS(db_res)[i].values[5])) { + reg.realm.s = (char*)(RES_ROWS(db_res)[i].values[5].val.string_val); + reg.realm.len = strlen(reg.realm.s); } - } else { - if(reg_ht_add(®)<0) + reg_db_set_attr(auth_username, 6); + reg_db_set_attr(auth_password, 7); + reg_db_set_attr(auth_proxy, 8); + reg.expires = (unsigned int)RES_ROWS(db_res)[i].values[9].val.int_val; + reg.h_uuid = reg_compute_hash(®.l_uuid); + reg.h_user = reg_compute_hash(®.l_username); + reg.flags = (unsigned int)RES_ROWS(db_res)[i].values[10].val.int_val; + reg.reg_delay = (unsigned int)RES_ROWS(db_res)[i].values[11].val.int_val; + + lock_get(_reg_htable_gc_lock); + if(reg_ht_get_byuuid(pl_uuid)!=NULL) { - lock_release(_reg_htable_gc_lock); - LM_ERR("Error adding reg to htable\n"); - goto error; + if(reg_ht_update_attrs(®)<0) + { + lock_release(_reg_htable_gc_lock); + LM_ERR("Error updating reg to htable\n"); + goto error; + } + } else { + if(reg_ht_add(®)<0) + { + lock_release(_reg_htable_gc_lock); + LM_ERR("Error adding reg to htable\n"); + goto error; + } } + lock_release(_reg_htable_gc_lock); } - lock_release(_reg_htable_gc_lock); reg_dbf.free_result(reg_db_con, db_res); reg_dbf.close(reg_db_con); From cad6a67a41c8085f126798859b38a64a7350fbf6 Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Fri, 27 May 2016 11:39:09 +0200 Subject: [PATCH 3/3] uac: proper skip of uacreg records with empty attributes (cherry picked from commit 451b19597c5436ba481a49ecc89cc113829a9425) --- modules/uac/uac_reg.c | 80 +++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/modules/uac/uac_reg.c b/modules/uac/uac_reg.c index 63b0ff0979d..c02fe69b907 100644 --- a/modules/uac/uac_reg.c +++ b/modules/uac/uac_reg.c @@ -1079,7 +1079,7 @@ void uac_reg_timer(unsigned int ticks) if(reg.attr.len == 0) { \ LM_ERR("empty value not allowed for column[%d]='%.*s' - ignoring record\n", \ pos, db_cols[pos]->len, db_cols[pos]->s); \ - continue; \ + goto nextrec; \ } \ } \ } while(0); @@ -1178,7 +1178,7 @@ int uac_reg_load_db(void) do { for(i=0; i