* Fixed: mandatory leaf in a uses statement caused abort
* Occurence was in ietf-yang-patch.yang
This commit is contained in:
parent
270c47b396
commit
6bb6faadc9
4 changed files with 64 additions and 31 deletions
|
|
@ -1767,29 +1767,33 @@ cg_var *
|
|||
ys_parse(yang_stmt *ys,
|
||||
enum cv_type cvtype)
|
||||
{
|
||||
int cvret;
|
||||
char *reason = NULL;
|
||||
int cvret;
|
||||
char *reason = NULL;
|
||||
cg_var *cv = NULL;
|
||||
|
||||
assert(yang_cv_get(ys) == NULL); /* Cv:s are parsed in different places, difficult to separate */
|
||||
if ((ys->ys_cv = cv_new(cvtype)) == NULL){
|
||||
if ((cv = yang_cv_get(ys)) != NULL){
|
||||
/* eg mandatory in uses is already set and then copied */
|
||||
cv_free(cv);
|
||||
yang_cv_set(ys, NULL);
|
||||
}
|
||||
if ((cv = cv_new(cvtype)) == NULL){
|
||||
clicon_err(OE_YANG, errno, "cv_new");
|
||||
goto done;
|
||||
}
|
||||
if ((cvret = cv_parse1(yang_argument_get(ys), ys->ys_cv, &reason)) < 0){ /* error */
|
||||
if ((cvret = cv_parse1(yang_argument_get(ys), cv, &reason)) < 0){ /* error */
|
||||
clicon_err(OE_YANG, errno, "parsing cv");
|
||||
ys->ys_cv = NULL;
|
||||
goto done;
|
||||
}
|
||||
if (cvret == 0){ /* parsing failed */
|
||||
clicon_err(OE_YANG, errno, "Parsing CV: %s", reason);
|
||||
ys->ys_cv = NULL;
|
||||
goto done;
|
||||
}
|
||||
yang_cv_set(ys, cv);
|
||||
/* cvret == 1 means parsing is OK */
|
||||
done:
|
||||
if (reason)
|
||||
free(reason);
|
||||
return ys->ys_cv;
|
||||
return yang_cv_get(ys);
|
||||
}
|
||||
|
||||
/*! First round yang syntactic statement specific checks. No context checks.
|
||||
|
|
@ -1819,6 +1823,7 @@ ys_parse_sub(yang_stmt *ys,
|
|||
char *reason = NULL;
|
||||
int ret;
|
||||
uint32_t minmax;
|
||||
cg_var *cv = NULL;
|
||||
|
||||
arg = yang_argument_get(ys);
|
||||
keyword = yang_keyword_get(ys);
|
||||
|
|
@ -1826,7 +1831,11 @@ ys_parse_sub(yang_stmt *ys,
|
|||
case Y_FRACTION_DIGITS:
|
||||
if (ys_parse(ys, CGV_UINT8) == NULL)
|
||||
goto done;
|
||||
fd = cv_uint8_get(ys->ys_cv);
|
||||
if ((cv = yang_cv_get(ys)) == NULL){
|
||||
clicon_err(OE_YANG, ENOENT, "Unexpected NULL cv");
|
||||
goto done;
|
||||
}
|
||||
fd = cv_uint8_get(cv);
|
||||
if (fd < 1 || fd > 18){
|
||||
clicon_err(OE_YANG, errno, "%u: Out of range, should be [1:18]", fd);
|
||||
goto done;
|
||||
|
|
@ -1841,11 +1850,12 @@ ys_parse_sub(yang_stmt *ys,
|
|||
case Y_REVISION_DATE: /* YYYY-MM-DD encoded as uint32 YYYYMMDD */
|
||||
if (ys_parse_date_arg(arg, &date) < 0)
|
||||
goto done;
|
||||
if ((ys->ys_cv = cv_new(CGV_UINT32)) == NULL){
|
||||
if ((cv = cv_new(CGV_UINT32)) == NULL){
|
||||
clicon_err(OE_YANG, errno, "cv_new");
|
||||
goto done;
|
||||
}
|
||||
cv_uint32_set(ys->ys_cv, date);
|
||||
yang_cv_set(ys, cv);
|
||||
cv_uint32_set(cv, date);
|
||||
break;
|
||||
case Y_STATUS: /* RFC7950 7.21.2: "current", "deprecated", or "obsolete". */
|
||||
if (strcmp(arg, "current") &&
|
||||
|
|
@ -1858,13 +1868,14 @@ ys_parse_sub(yang_stmt *ys,
|
|||
break;
|
||||
case Y_MAX_ELEMENTS:
|
||||
case Y_MIN_ELEMENTS:
|
||||
if ((ys->ys_cv = cv_new(CGV_UINT32)) == NULL){
|
||||
if ((cv = cv_new(CGV_UINT32)) == NULL){
|
||||
clicon_err(OE_YANG, errno, "cv_new");
|
||||
goto done;
|
||||
}
|
||||
yang_cv_set(ys, cv);
|
||||
if (keyword == Y_MAX_ELEMENTS &&
|
||||
strcmp(arg, "unbounded") == 0)
|
||||
cv_uint32_set(ys->ys_cv, 0); /* 0 means unbounded for max */
|
||||
cv_uint32_set(cv, 0); /* 0 means unbounded for max */
|
||||
else{
|
||||
if ((ret = parse_uint32(arg, &minmax, &reason)) < 0){
|
||||
clicon_err(OE_YANG, errno, "parse_uint32");
|
||||
|
|
@ -1876,7 +1887,7 @@ ys_parse_sub(yang_stmt *ys,
|
|||
free(reason);
|
||||
goto done;
|
||||
}
|
||||
cv_uint32_set(ys->ys_cv, minmax);
|
||||
cv_uint32_set(cv, minmax);
|
||||
}
|
||||
break;
|
||||
case Y_MODIFIER:
|
||||
|
|
@ -1888,11 +1899,12 @@ ys_parse_sub(yang_stmt *ys,
|
|||
case Y_UNKNOWN:{ /* save (optional) argument in ys_cv */
|
||||
if (extra == NULL)
|
||||
break;
|
||||
if ((ys->ys_cv = cv_new(CGV_STRING)) == NULL){
|
||||
if ((cv = cv_new(CGV_STRING)) == NULL){
|
||||
clicon_err(OE_YANG, errno, "cv_new");
|
||||
goto done;
|
||||
}
|
||||
if ((ret = cv_parse1(extra, ys->ys_cv, &reason)) < 0){ /* error */
|
||||
yang_cv_set(ys, cv);
|
||||
if ((ret = cv_parse1(extra, cv, &reason)) < 0){ /* error */
|
||||
clicon_err(OE_YANG, errno, "parsing cv");
|
||||
goto done;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue