aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-08-16 13:01:53 +0200
committerDavid Robillard <d@drobilla.net>2020-08-16 13:56:40 +0200
commitbb1a00aac2e2315a88ef0274455e510afa79ea95 (patch)
treef7c68d1271ba36c21830c1106dced71fdd51d5e2
parentfc81e2734ccc293f9d2755b700e8b437ee624560 (diff)
downloadserd-bb1a00aac2e2315a88ef0274455e510afa79ea95.tar.gz
serd-bb1a00aac2e2315a88ef0274455e510afa79ea95.tar.bz2
serd-bb1a00aac2e2315a88ef0274455e510afa79ea95.zip
Ensure that all free methods tolerate NULL
-rw-r--r--NEWS3
-rw-r--r--src/env.c4
-rw-r--r--src/reader.c4
-rw-r--r--src/writer.c4
-rw-r--r--tests/free_null_test.c33
-rw-r--r--wscript2
6 files changed, 49 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 2f0530e5..d84e25d3 100644
--- a/NEWS
+++ b/NEWS
@@ -2,9 +2,10 @@ serd (0.30.5) unstable;
* Fix various minor warnings and other code quality issues
* Improve reader error handling
+ * Make all free functions tolerant of NULL
* Parse prefixed names more strictly
- -- David Robillard <d@drobilla.net> Sat, 15 Aug 2020 16:22:12 +0000
+ -- David Robillard <d@drobilla.net> Sun, 16 Aug 2020 11:01:53 +0000
serd (0.30.4) stable;
diff --git a/src/env.c b/src/env.c
index e5cb954a..e67b42c0 100644
--- a/src/env.c
+++ b/src/env.c
@@ -47,6 +47,10 @@ serd_env_new(const SerdNode* base_uri)
void
serd_env_free(SerdEnv* env)
{
+ if (!env) {
+ return;
+ }
+
for (size_t i = 0; i < env->n_prefixes; ++i) {
serd_node_free(&env->prefixes[i].name);
serd_node_free(&env->prefixes[i].uri);
diff --git a/src/reader.c b/src/reader.c
index 4710caac..5d33e45d 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -218,6 +218,10 @@ serd_reader_set_error_sink(SerdReader* reader,
void
serd_reader_free(SerdReader* reader)
{
+ if (!reader) {
+ return;
+ }
+
pop_node(reader, reader->rdf_nil);
pop_node(reader, reader->rdf_rest);
pop_node(reader, reader->rdf_first);
diff --git a/src/writer.c b/src/writer.c
index 81e0a845..5f312c30 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -978,6 +978,10 @@ serd_writer_set_prefix(SerdWriter* writer,
void
serd_writer_free(SerdWriter* writer)
{
+ if (!writer) {
+ return;
+ }
+
serd_writer_finish(writer);
serd_stack_free(&writer->anon_stack);
free(writer->bprefix);
diff --git a/tests/free_null_test.c b/tests/free_null_test.c
new file mode 100644
index 00000000..121a66cd
--- /dev/null
+++ b/tests/free_null_test.c
@@ -0,0 +1,33 @@
+/*
+ Copyright 2020 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#undef NDEBUG
+
+#include "serd/serd.h"
+
+#include <stddef.h>
+
+int
+main(void)
+{
+ serd_free(NULL);
+ serd_node_free(NULL);
+ serd_env_free(NULL);
+ serd_reader_free(NULL);
+ serd_writer_free(NULL);
+
+ return 0;
+}
diff --git a/wscript b/wscript
index 92bede8a..e8adfcc3 100644
--- a/wscript
+++ b/wscript
@@ -212,6 +212,7 @@ def build(bld):
# Test programs
for prog in [('serdi_static', 'src/serdi.c'),
('env_test', 'tests/env_test.c'),
+ ('free_null_test', 'tests/free_null_test.c'),
('read_chunk_test', 'tests/read_chunk_test.c'),
('serd_test', 'tests/serd_test.c')]:
bld(features = 'c cprogram',
@@ -535,6 +536,7 @@ def test(tst):
with tst.group('Unit') as check:
check(['./env_test'])
+ check(['./free_null_test'])
check(['./read_chunk_test'])
check(['./serd_test'])