Two CLICON_YANG_UNKNOWN_ANYDATA issues: segv when exiting cli and diff errors on commit
This commit is contained in:
parent
62446db752
commit
490f7d8023
3 changed files with 25 additions and 14 deletions
|
|
@ -528,8 +528,7 @@ cvec2xml_1(cvec *cvv,
|
||||||
* @see xml_diff API function, this one is internal and recursive
|
* @see xml_diff API function, this one is internal and recursive
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
xml_diff1(yang_stmt *ys,
|
xml_diff1(cxobj *x0,
|
||||||
cxobj *x0,
|
|
||||||
cxobj *x1,
|
cxobj *x1,
|
||||||
cxobj ***x0vec,
|
cxobj ***x0vec,
|
||||||
int *x0veclen,
|
int *x0veclen,
|
||||||
|
|
@ -581,11 +580,11 @@ xml_diff1(yang_stmt *ys,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else{ /* equal */
|
else{ /* equal */
|
||||||
if ((yc = xml_spec(x0c)) == NULL){
|
/* xml-spec NULL could happen with anydata children for example,
|
||||||
clicon_err(OE_UNIX, errno, "Unknown element: %s", xml_name(x0c));
|
* if so, continute compare children but without yang
|
||||||
goto done;
|
*/
|
||||||
}
|
yc = xml_spec(x0c);
|
||||||
if (yang_choice(yc)){
|
if (yc && yang_choice(yc)){
|
||||||
/* if x0c and x1c are choice/case, then they are changed */
|
/* if x0c and x1c are choice/case, then they are changed */
|
||||||
if (cxvec_append(x0c, changed_x0, changedlen) < 0)
|
if (cxvec_append(x0c, changed_x0, changedlen) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
@ -593,7 +592,7 @@ xml_diff1(yang_stmt *ys,
|
||||||
if (cxvec_append(x1c, changed_x1, changedlen) < 0)
|
if (cxvec_append(x1c, changed_x1, changedlen) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
else if (yang_keyword_get(yc) == Y_LEAF){
|
else if (yc && yang_keyword_get(yc) == Y_LEAF){
|
||||||
/* if x0c and x1c are leafs w bodies, then they are changed */
|
/* if x0c and x1c are leafs w bodies, then they are changed */
|
||||||
if ((b1 = xml_body(x0c)) == NULL) /* empty type */
|
if ((b1 = xml_body(x0c)) == NULL) /* empty type */
|
||||||
break;
|
break;
|
||||||
|
|
@ -607,7 +606,7 @@ xml_diff1(yang_stmt *ys,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (xml_diff1(yc, x0c, x1c,
|
else if (xml_diff1(x0c, x1c,
|
||||||
x0vec, x0veclen,
|
x0vec, x0veclen,
|
||||||
x1vec, x1veclen,
|
x1vec, x1veclen,
|
||||||
changed_x0, changed_x1, changedlen)< 0)
|
changed_x0, changed_x1, changedlen)< 0)
|
||||||
|
|
@ -664,7 +663,7 @@ xml_diff(yang_stmt *yspec,
|
||||||
goto done;
|
goto done;
|
||||||
goto ok;
|
goto ok;
|
||||||
}
|
}
|
||||||
if (xml_diff1((yang_stmt*)yspec, x0, x1,
|
if (xml_diff1(x0, x1,
|
||||||
first, firstlen,
|
first, firstlen,
|
||||||
second, secondlen,
|
second, secondlen,
|
||||||
changed_x0, changed_x1, changedlen) < 0)
|
changed_x0, changed_x1, changedlen) < 0)
|
||||||
|
|
|
||||||
|
|
@ -2854,19 +2854,24 @@ yang_type_cache_free(yang_type_cache *ycache)
|
||||||
*
|
*
|
||||||
* One usecase is CLICON_YANG_UNKNOWN_ANYDATA when unknown data is treated as anydata
|
* One usecase is CLICON_YANG_UNKNOWN_ANYDATA when unknown data is treated as anydata
|
||||||
* @param[in] yp Yang parent statement
|
* @param[in] yp Yang parent statement
|
||||||
* @param[in] name Node name
|
* @param[in] name Node name, will be copied
|
||||||
* @retval ys OK
|
* @retval ys OK
|
||||||
* @retval NULL Error
|
* @retval NULL Error
|
||||||
* @see ysp_add
|
* @see ysp_add
|
||||||
*/
|
*/
|
||||||
yang_stmt *
|
yang_stmt *
|
||||||
yang_anydata_add(yang_stmt *yp,
|
yang_anydata_add(yang_stmt *yp,
|
||||||
char *name)
|
char *name0)
|
||||||
{
|
{
|
||||||
yang_stmt *ys = NULL;
|
yang_stmt *ys = NULL;
|
||||||
|
char *name = NULL;
|
||||||
|
|
||||||
if ((ys = ys_new(Y_ANYDATA)) == NULL)
|
if ((ys = ys_new(Y_ANYDATA)) == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
|
if ((name = strdup(name0)) == NULL){
|
||||||
|
clicon_err(OE_UNIX, errno, "strdup");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
yang_argument_set(ys, name);
|
yang_argument_set(ys, name);
|
||||||
if (yn_insert(yp, ys) < 0){ /* Insert into hierarchy */
|
if (yn_insert(yp, ys) < 0){ /* Insert into hierarchy */
|
||||||
ys = NULL;
|
ys = NULL;
|
||||||
|
|
|
||||||
|
|
@ -77,9 +77,9 @@ module unknown{
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# For edit config
|
# For edit config
|
||||||
XMLA='<ca xmlns="urn:example:any"><b><k>22</k><u3>55</u3></b><u2><u21>a string</u21></u2></ca><u1 xmlns="urn:example:any"><u11>23</u11></u1>'
|
XMLA='<ca xmlns="urn:example:any"><b><k>22</k><u3><u31>42</u31></u3></b><u2><u21>a string</u21></u2></ca><u1 xmlns="urn:example:any"><u11>23</u11></u1>'
|
||||||
|
|
||||||
XMLU='<cu xmlns="urn:example:unknown"><b><k>22</k><u3>55</u3></b><u2><u21>a string</u21></u2></cu><u1 xmlns="urn:example:unknown"><u11>23</u11></u1>'
|
XMLU='<cu xmlns="urn:example:unknown"><b><k>22</k><u3><u31>42</u31></u3></b><u2><u21>a string</u21></u2></cu><u1 xmlns="urn:example:unknown"><u11>23</u11></u1>'
|
||||||
|
|
||||||
# Full state
|
# Full state
|
||||||
STATE0='<sa xmlns="urn:example:any"><sb><k>22</k><u5>55</u5></sb><u4><u5>a string</u5></u4></sa><su xmlns="urn:example:unknown"><sb><k>22</k><u5>55</u5></sb><u4><u5>a string</u5></u4></su>'
|
STATE0='<sa xmlns="urn:example:any"><sb><k>22</k><u5>55</u5></sb><u4><u5>a string</u5></u4></sa><su xmlns="urn:example:unknown"><sb><k>22</k><u5>55</u5></sb><u4><u5>a string</u5></u4></su>'
|
||||||
|
|
@ -178,6 +178,13 @@ EOF
|
||||||
new "Get running"
|
new "Get running"
|
||||||
expecteof "$clixon_netconf -qf $cfg" 0 '<rpc><get-config><source><running/></source></get-config></rpc>]]>]]>' "^<rpc-reply><data>$XML</data></rpc-reply>]]>]]>$"
|
expecteof "$clixon_netconf -qf $cfg" 0 '<rpc><get-config><source><running/></source></get-config></rpc>]]>]]>' "^<rpc-reply><data>$XML</data></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
|
# Add other functions, (based on previous errors), eg cli show config, cli commit.
|
||||||
|
new "cli show configuration"
|
||||||
|
expectpart "$($clixon_cli -1 -f $cfg show conf xml)" 0 "<u31>42</u31>"
|
||||||
|
|
||||||
|
new "cli commit"
|
||||||
|
expectpart "$($clixon_cli -1 -f $cfg commit)" 0 "^$"
|
||||||
|
|
||||||
if $unknown; then
|
if $unknown; then
|
||||||
STATE="$STATE0" # full state
|
STATE="$STATE0" # full state
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue