* Fixed: [Double free when using libxml2 as regex engine #117](https://github.com/clicon/clixon/issues/117)

* added libxml2 support in test_pattern.sh when libxml2 is configured
This commit is contained in:
Olof hagsand 2020-07-02 13:26:15 +02:00
parent eda4a58ebf
commit 99b01040a7
7 changed files with 29 additions and 10 deletions

View file

@ -87,6 +87,7 @@ Expected: July 2020
### Corrected Bugs ### Corrected Bugs
* Fixed: [Double free when using libxml2 as regex engine #117](https://github.com/clicon/clixon/issues/117)
* Fixed: Reading in a yang-spec file exactly the same size as the buffer (1024/2048/4096/...) could leave the buffer not terminated with a 0 byte * Fixed: Reading in a yang-spec file exactly the same size as the buffer (1024/2048/4096/...) could leave the buffer not terminated with a 0 byte
* Fixed: The module `clixon-rfc5277` was always enabled, but should only be enabled when `CLICON_STREAM_DISCOVERY_RFC5277` is enabled. * Fixed: The module `clixon-rfc5277` was always enabled, but should only be enabled when `CLICON_STREAM_DISCOVERY_RFC5277` is enabled.

2
configure vendored
View file

@ -637,6 +637,7 @@ CPP
wwwuser wwwuser
wwwdir wwwdir
enable_optyangs enable_optyangs
with_libxml2
with_restconf with_restconf
SH_SUFFIX SH_SUFFIX
CLIXON_DEFAULT_CONFIG CLIXON_DEFAULT_CONFIG
@ -3350,6 +3351,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
# If yes, compile apps/restconf # If yes, compile apps/restconf
wwwdir=/www-data wwwdir=/www-data
wwwuser=www-data wwwuser=www-data

View file

@ -94,6 +94,7 @@ AC_SUBST(CLIXON_DEFAULT_CONFIG)
AC_SUBST(LIBS) AC_SUBST(LIBS)
AC_SUBST(SH_SUFFIX) AC_SUBST(SH_SUFFIX)
AC_SUBST(with_restconf) # If yes, compile apps/restconf AC_SUBST(with_restconf) # If yes, compile apps/restconf
AC_SUBST(with_libxml2)
AC_SUBST(enable_optyangs) AC_SUBST(enable_optyangs)
AC_SUBST(wwwdir,/www-data) AC_SUBST(wwwdir,/www-data)
AC_SUBST(wwwuser,www-data) AC_SUBST(wwwuser,www-data)

View file

@ -984,7 +984,9 @@ xml_yang_validate_add(clicon_handle h,
goto fail; goto fail;
} }
} }
if ((ys_cv_validate(h, cv, yt, &reason)) != 1){ if ((ret = ys_cv_validate(h, cv, yt, &reason)) < 0)
goto done;
if (ret == 0){
if (netconf_bad_element_xml(xret, "application", yang_argument_get(yt), reason) < 0) if (netconf_bad_element_xml(xret, "application", yang_argument_get(yt), reason) < 0)
goto done; goto done;
goto fail; goto fail;

View file

@ -2827,17 +2827,22 @@ yang_type_cache_free(yang_type_cache *ycache)
switch (ycache->yc_rxmode){ switch (ycache->yc_rxmode){
case REGEXP_POSIX: case REGEXP_POSIX:
cligen_regex_posix_free(cv_void_get(cv)); cligen_regex_posix_free(cv_void_get(cv));
break;
case REGEXP_LIBXML2:
cligen_regex_libxml2_free(cv_void_get(cv));
break;
default:
break;
}
if ((p = cv_void_get(cv)) != NULL){ if ((p = cv_void_get(cv)) != NULL){
free(p); free(p);
cv_void_set(cv, NULL); cv_void_set(cv, NULL);
} }
break;
case REGEXP_LIBXML2:
cligen_regex_libxml2_free(cv_void_get(cv));
/* Note, already freed in libxml2 case */
if ((p = cv_void_get(cv)) != NULL){
cv_void_set(cv, NULL);
}
break;
default:
break;
}
} }
cvec_free(ycache->yc_regexps); cvec_free(ycache->yc_regexps);
} }

View file

@ -1,5 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Generated from autotools # Generated from autotools
WITH_RESTCONF=@with_restconf@ WITH_RESTCONF=@with_restconf@ # evhtp, fcgi or ""
WITH_LIBXML2=@with_libxml2@ # yes or ""
CXX=@CXX@ CXX=@CXX@

View file

@ -7,7 +7,6 @@
# Test strings have been generated by: # Test strings have been generated by:
# https://www.browserling.com/tools/text-from-regex # https://www.browserling.com/tools/text-from-regex
# This is an unit test, not a clixon system test # This is an unit test, not a clixon system test
# See test_regexp.sh for unit regexp tests
# #
# NOTE: no tests for ' quote in strings # NOTE: no tests for ' quote in strings
# NOTE, the following does not match in libxml2 (but in clixon): # NOTE, the following does not match in libxml2 (but in clixon):
@ -22,8 +21,14 @@ APPNAME=example
cfg=$dir/pattern.xml cfg=$dir/pattern.xml
fyang=$dir/pattern.yang fyang=$dir/pattern.yang
# Regexp mode: posix or libxml2
: ${regex:=posix} regexlist="posix"
if [ "${WITH_LIBXML2}" = yes ] ; then
regexlist="$regexlist libxml2"
fi
# Loop over supported regexps. Always run posix, run libxml2 if configured
for regex in $regexlist; do
new "pattern tests for regex:$regex"
cat <<EOF > $cfg cat <<EOF > $cfg
<clixon-config xmlns="http://clicon.org/config"> <clixon-config xmlns="http://clicon.org/config">
@ -720,7 +725,6 @@ testrun "p$pnr" 0 '<![CDATA01234567890]]>'
#testrun "p$pnr" 0 '<![CDATA[0123456789]]' # XML parse error #testrun "p$pnr" 0 '<![CDATA[0123456789]]' # XML parse error
# CLI tests # CLI tests
new "CLI tests for RFC7950 Sec 9.4.7 ex 2 AB" new "CLI tests for RFC7950 Sec 9.4.7 ex 2 AB"
expectfn "$clixon_cli -1f $cfg -l o set c rfc2 AB" 0 '^$' expectfn "$clixon_cli -1f $cfg -l o set c rfc2 AB" 0 '^$'
@ -797,6 +801,8 @@ if [ $BE -ne 0 ]; then
sudo pkill -u root -f clixon_backend sudo pkill -u root -f clixon_backend
fi fi
done # regex
rm -rf $dir rm -rf $dir
# unset conditional parameters # unset conditional parameters