MAX_NESTING_LEVEL was only checked in parser.c, so
yaml_parser_scan() callers had no depth protection.
Deep flow nesting caused O(n²) CPU via simple_keys
scanning. Add the limit check in the scanner's
yaml_parser_increase_flow_level() and a test.
Each nesting level increases the stack and the number of previous
starting events that the parser has to check.
The default maximum is 1000 and can be set via yaml_set_max_nest_level()
I also added new options to run-parser and run-parser-test-suite:
* --max-level: you can now try out this feature on the command line
* --show-error: By default, run-parser doesn't show errors. The new option
helps with debugging
With `--flow (keep|on)` run-parser-test-suite will output:
+MAP {}
+SEQ []
run-emitter-test-suite will then emit flow style collections if requested:
echo 'foo: [bar, {x: y}]' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite
echo 'foo: [bar, {x: y}]' | ./tests/run-parser-test-suite \
--flow keep | ./tests/run-emitter-test-suite --flow keep
Also: add that yaml_private.h include again that I had thrown out. Needed
for printing directives.
Wonder if there is a way to create a directive without using the private api.
Before `1.1` was hardcoded in the emitter.
* Also add --directive option to run-emitter-test-suite
Allows to easily test how output looks like if %YAML directives
are output.
example-deconstructor-alt.c: In function ‘main’:
example-deconstructor-alt.c:649:51: warning:
comparison between ‘yaml_sequence_style_t {aka enum yaml_sequence_style_e}’
and ‘enum yaml_mapping_style_e’ [-Wenum-compare]
example-deconstructor-alt.c:650:36: warning:
comparison between ‘yaml_sequence_style_t {aka enum yaml_sequence_style_e}’
and ‘enum yaml_mapping_style_e’ [-Wenum-compare]
repro:
CFLAGS="-Wall -Wextra -Wunused-parameter -Wc++-compat" ./configure && make
which we use for perl, and libyaml is now included in cperl.
Tested with gcc-5 and clang-3.7
There are still a tons of format warnings (%d on 64bit) in
example-deconstructor.c which I skipped.
In the Makefile.am, switched out the fetch (which can have auth problems
in certain envs) with a simple branch per @perlpunk++'s suggestion.
With the new test branches, travis had a problem in that it only clones
one branch and we need the other branch refs to be available. Fixed this
by fetching the other branch refs. I also cleaned up the travis YAML
file.
The Ubuntu 14.04 docker image (used by semaphoreci) had an older git,
without the worktree command, so I made it install the latest git from a
ppa.
Renamed tests/run-tests.sh to tests/run-all-tests.sh for tab completion
conflict reasons.
with the intent that `make test-suite` will use it as a branch.
This commit makes the libyaml and yaml-test-suite repos completely
independent. The only thing in master is a Makefile rule for
`make run-test-suite`.
The run-test-suite branch takes care of everything else.
This will keep the master branch history clean from any yaml-test-suite
activity, while keeping everything up to date.
Pinning will just work for whatever commit of master you run the tests
from. The pinning work will all be done in the `run-test-suite` branch.
No recursive make anymore
Remove MY_LD_LIBRARY_PATH and friends
This is now done by the wrapper script
Remove LIBYAML_DIR variable
not needed anymore
Merge ReadMe.md files to one
New build options
-----------------
* Add option BUILD_TESTING by default ON
See https://cmake.org/cmake/help/v2.8.12/cmake.html#module:CTest
* Simplify library type selection using standard option BUILD_SHARED_LIBS
See https://cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html
yamlConfig.cmake
----------------
* Generate and install yamlConfig.cmake, yamlConfigVersion.cmake and yamlTargets.cmake
* Bump CMake version and explicitly associate include dirs with targets
See https://cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#include-directories-and-usage-requirements
* Ensure building against libyaml using "find_package(yaml)" uses expected compile options: Set HAVE_CONFIG_H
as private compile option, YAML_DECLARE_STATIC as public
Testing
-------
* Build all examples from "tests" directory
CMake Best practices
--------------------
* configure "config.h" based on version info found in CMakeLists.txt
* Ensure buildsystem re-generation listing sources (best-practice)
It is not recommended to use GLOB to collect a list of source files from
the source tree. If no CMakeLists.txt file changes when a source is added
or removed then the generated build system cannot know when to ask CMake
to regenerate.
See https://cmake.org/cmake/help/v3.8/command/file.html
Compilation warnings
--------------------
* Set _CRT_SECURE_NO_WARNINGS if building using VisualStudio
This will avoid warnings like this one:
```
C:\projects\libyaml\tests\run-emitter.c(268): warning C4996: 'fopen':
This function or variable may be unsafe. Consider using fopen_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for
details.
```
Continuous Integration
----------------------
* travis: Install CMake >= 3.x using scikit-ci-addons
* Add comments to appveyor.yml and run-tests.sh
The Dockerfiles needed to set LD_LIBRARY_PATH.
For some bizarre reason I needed to build the parser and emitter twice.
Since I plan to redo the building of these binaries later, this is OK
for now, since all tests on all CICDs will pass.
The docker stuff was needed by the semaphoreci system.
Before the `make test-suite` command would clone yaml/libyaml-test which
would in tuen clone yaml/libyaml-parser-emitter. Now they are part of
the repository since they are not really useful outside the repository.
They still clone the data branch of yaml/yaml-test-suite. That is where
all the actual test data resides. That belongs outside the repo because
it is intended for all yaml frameworks.
There were several places in our test deconstructor where we were
passing plain char[]s to functions expecting (yaml_char_t *)s. Since we
will soon be forcing warnings to become errors, it makes sense to clean
these up.