SNMP union leak (see https://github.com/clicon/clixon/pull/461)
Added docker-snmp-mem test
This commit is contained in:
parent
e9c5287c36
commit
16a7fa3837
12 changed files with 39 additions and 36 deletions
|
|
@ -156,15 +156,17 @@ static const map_str2str yang_snmp_types[] = {
|
||||||
{ NULL, NULL} /* if not found */
|
{ NULL, NULL} /* if not found */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A function that checks that all subtypes of the union are the same
|
|
||||||
|
/*! A function that checks that all subtypes of the union are the same
|
||||||
|
*
|
||||||
* @param[in] ytype Yang resolved type (a union in this case)
|
* @param[in] ytype Yang resolved type (a union in this case)
|
||||||
* @param[out] cb Buffer where type of subtypes is written
|
* @param[out] cb Buffer where type of subtypes is written
|
||||||
* @retval 1 - true(All subtypes are the same)
|
* @retval 1 true(All subtypes are the same)
|
||||||
* @retval 0 - false
|
* @retval 0 false
|
||||||
*/
|
*/
|
||||||
int
|
static int
|
||||||
is_same_subtypes_union(yang_stmt *ytype,
|
is_same_subtypes_union(yang_stmt *ytype,
|
||||||
cbuf *cb)
|
char **restype)
|
||||||
{
|
{
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
yang_stmt *y_sub_type = NULL;
|
yang_stmt *y_sub_type = NULL;
|
||||||
|
|
@ -188,34 +190,20 @@ is_same_subtypes_union(yang_stmt *ytype,
|
||||||
&y_resolved_type, &options,
|
&y_resolved_type, &options,
|
||||||
&cvv, patterns, NULL, &fraction_digits) < 0 || ( NULL == y_resolved_type) )
|
&cvv, patterns, NULL, &fraction_digits) < 0 || ( NULL == y_resolved_type) )
|
||||||
break;
|
break;
|
||||||
if( (NULL == (resolved_type_str = yang_argument_get(y_resolved_type))) )
|
if ((resolved_type_str = yang_argument_get(y_resolved_type)) == NULL)
|
||||||
break;
|
break;
|
||||||
if( NULL == type_str || strcmp(type_str, resolved_type_str) == 0)
|
if (type_str == NULL || strcmp(type_str, resolved_type_str) == 0)
|
||||||
type_str = resolved_type_str;
|
type_str = resolved_type_str;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (NULL == y_sub_type && NULL != type_str){
|
if (y_sub_type == NULL && type_str != NULL){
|
||||||
cbuf_append_str(cb, resolved_type_str);
|
*restype = resolved_type_str;
|
||||||
retval = 1;
|
retval = 1;
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
|
||||||
yang_type_to_snmp(yang_stmt *ytype,
|
|
||||||
char* yang_type_str)
|
|
||||||
{
|
|
||||||
char* type_str = yang_type_str;
|
|
||||||
if (yang_type_str && strcmp(yang_type_str, "union") == 0){
|
|
||||||
cbuf *cb = cbuf_new();
|
|
||||||
if (is_same_subtypes_union(ytype, cb) > 0)
|
|
||||||
type_str = cbuf_get(cb);
|
|
||||||
}
|
|
||||||
char* ret = clicon_str2str(yang_snmp_types, type_str);
|
|
||||||
return (NULL == ret) ? type_str : ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Translate from snmp string to int representation
|
/*! Translate from snmp string to int representation
|
||||||
*
|
*
|
||||||
* @note Internal snmpd, maybe find something in netsnmpd?
|
* @note Internal snmpd, maybe find something in netsnmpd?
|
||||||
|
|
@ -346,6 +334,7 @@ snmp_yang_type_get(yang_stmt *ys,
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
yang_stmt *yrestype; /* resolved type */
|
yang_stmt *yrestype; /* resolved type */
|
||||||
char *restype; /* resolved type */
|
char *restype; /* resolved type */
|
||||||
|
char *restype2;
|
||||||
char *origtype = NULL; /* original type */
|
char *origtype = NULL; /* original type */
|
||||||
yang_stmt *ypath;
|
yang_stmt *ypath;
|
||||||
yang_stmt *yref = NULL;
|
yang_stmt *yref = NULL;
|
||||||
|
|
@ -354,8 +343,13 @@ snmp_yang_type_get(yang_stmt *ys,
|
||||||
if (yang_type_get(ys, &origtype, &yrestype, NULL, NULL, NULL, NULL, NULL) < 0)
|
if (yang_type_get(ys, &origtype, &yrestype, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
restype = yrestype?yang_argument_get(yrestype):NULL;
|
restype = yrestype?yang_argument_get(yrestype):NULL;
|
||||||
restype = yang_type_to_snmp(yrestype, restype);
|
if (restype && strcmp(restype, "union") == 0){
|
||||||
if (strcmp(restype, "leafref")==0){
|
is_same_subtypes_union(yrestype, &restype);
|
||||||
|
|
||||||
|
}
|
||||||
|
if ((restype2 = clicon_str2str(yang_snmp_types, restype)) == NULL)
|
||||||
|
restype2 = restype;
|
||||||
|
if (strcmp(restype2, "leafref")==0){
|
||||||
if ((ypath = yang_find(yrestype, Y_PATH, NULL)) == NULL){
|
if ((ypath = yang_find(yrestype, Y_PATH, NULL)) == NULL){
|
||||||
clicon_err(OE_YANG, 0, "No path in leafref");
|
clicon_err(OE_YANG, 0, "No path in leafref");
|
||||||
goto done;
|
goto done;
|
||||||
|
|
@ -372,7 +366,7 @@ snmp_yang_type_get(yang_stmt *ys,
|
||||||
}
|
}
|
||||||
if (yang_type_get(yref, &origtype, &yrestype, NULL, NULL, NULL, NULL, NULL) < 0)
|
if (yang_type_get(yref, &origtype, &yrestype, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
restype = yrestype?yang_argument_get(yrestype):NULL;
|
restype2 = yrestype?yang_argument_get(yrestype):NULL;
|
||||||
}
|
}
|
||||||
if (yrefp){
|
if (yrefp){
|
||||||
if (yref)
|
if (yref)
|
||||||
|
|
@ -387,7 +381,7 @@ snmp_yang_type_get(yang_stmt *ys,
|
||||||
if (yrestypep)
|
if (yrestypep)
|
||||||
*yrestypep = yrestype;
|
*yrestypep = yrestype;
|
||||||
if (restypep)
|
if (restypep)
|
||||||
*restypep = restype;
|
*restypep = restype2;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
if (origtype)
|
if (origtype)
|
||||||
|
|
@ -406,7 +400,7 @@ snmp_yang_type_get(yang_stmt *ys,
|
||||||
* @retval 0 OK: Look in exist and value for return value
|
* @retval 0 OK: Look in exist and value for return value
|
||||||
* @retval -1 Error
|
* @retval -1 Error
|
||||||
*
|
*
|
||||||
* @note This optimizatoin may not work if the unknown statements are augmented in ys.
|
* @note This optimization may not work if the unknown statements are augmented in ys.
|
||||||
* @see yang_extension_value for the generic function
|
* @see yang_extension_value for the generic function
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
|
|
@ -1395,4 +1389,3 @@ clixon_snmp_api_oid_find(oid *oid0,
|
||||||
// done:
|
// done:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ RUN install -d /clixon/build/usr/local/bin/test
|
||||||
RUN install *.sh /clixon/build/usr/local/bin/test
|
RUN install *.sh /clixon/build/usr/local/bin/test
|
||||||
RUN install *.exp /clixon/build/usr/local/bin/test
|
RUN install *.exp /clixon/build/usr/local/bin/test
|
||||||
RUN install clixon.png /clixon/build/usr/local/bin/test
|
RUN install clixon.png /clixon/build/usr/local/bin/test
|
||||||
|
RUN install *.supp /clixon/build/usr/local/bin/test
|
||||||
|
|
||||||
RUN install -d /clixon/build/mibs
|
RUN install -d /clixon/build/mibs
|
||||||
RUN install mibs/* /clixon/build/mibs
|
RUN install mibs/* /clixon/build/mibs
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@ RUN install -d /clixon/build/usr/local/bin/test
|
||||||
RUN install *.sh /clixon/build/usr/local/bin/test
|
RUN install *.sh /clixon/build/usr/local/bin/test
|
||||||
RUN install *.exp /clixon/build/usr/local/bin/test
|
RUN install *.exp /clixon/build/usr/local/bin/test
|
||||||
RUN install clixon.png /clixon/build/usr/local/bin/test
|
RUN install clixon.png /clixon/build/usr/local/bin/test
|
||||||
|
RUN install *.supp /clixon/build/usr/local/bin/test
|
||||||
|
|
||||||
RUN install -d /clixon/build/mibs
|
RUN install -d /clixon/build/mibs
|
||||||
RUN install mibs/* /clixon/build/mibs
|
RUN install mibs/* /clixon/build/mibs
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ RUN install -d /clixon/build/usr/local/bin/test
|
||||||
RUN install *.sh /clixon/build/usr/local/bin/test
|
RUN install *.sh /clixon/build/usr/local/bin/test
|
||||||
RUN install *.exp /clixon/build/usr/local/bin/test
|
RUN install *.exp /clixon/build/usr/local/bin/test
|
||||||
RUN install clixon.png /clixon/build/usr/local/bin/test
|
RUN install clixon.png /clixon/build/usr/local/bin/test
|
||||||
|
RUN install *.supp /clixon/build/usr/local/bin/test
|
||||||
|
|
||||||
RUN install -d /clixon/build/mibs
|
RUN install -d /clixon/build/mibs
|
||||||
RUN install mibs/* /clixon/build/mibs
|
RUN install mibs/* /clixon/build/mibs
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,13 @@ test: docker
|
||||||
./cleanup.sh ; ./start.sh # kill (ignore error) and the start it
|
./cleanup.sh ; ./start.sh # kill (ignore error) and the start it
|
||||||
sudo docker exec -t clixon-test bash -c 'cd /usr/local/bin/test && detail=true ./sum.sh'
|
sudo docker exec -t clixon-test bash -c 'cd /usr/local/bin/test && detail=true ./sum.sh'
|
||||||
|
|
||||||
|
# Special-purpose memory test for snmp
|
||||||
|
memsnmp: docker
|
||||||
|
./cleanup.sh ; ./start.sh # kill (ignore error) and the start it
|
||||||
|
sudo docker exec -t clixon-test bash -c 'sudo apk add --update valgrind; cd /usr/local/bin/test && pattern=test_snmp_union.sh ./mem.sh snmp'
|
||||||
|
|
||||||
|
# sudo docker exec -t clixon-test bash -c 'sudo apk add --update valgrind; cd /usr/local/bin/test && pattern=test_snmp*.sh ./mem.sh snmp'
|
||||||
|
|
||||||
depend:
|
depend:
|
||||||
|
|
||||||
install-include:
|
install-include:
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ function testinit(){
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
# XXX augmented objects seem to be registered twice: error: duplicate registration: MIB modules snmpSetSerialNo and AgentX subagent 52, session 0x562087a70e20, subsession 0x562087a820c0 (oid .1.3.6.1.6.3.1.1.6.1).
|
# XXX augmented objects seem to be registered twice: error: duplicate registration: MIB modules snmpSetSerialNo and AgentX subagent 52, session 0x562087a70e20, subsession 0x562087a820c0 (oid .1.3.6.1.6.3.1.1.6.1).
|
||||||
|
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ function testinit(){
|
||||||
sudo killall -q clixon_snmp
|
sudo killall -q clixon_snmp
|
||||||
|
|
||||||
new "Starting clixon_snmp"
|
new "Starting clixon_snmp"
|
||||||
start_snmp $cfg &
|
start_snmp $cfg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new "wait snmp"
|
new "wait snmp"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue