We rely on samples being NULL if a dc have no samples. Its completely
legal for malloc to return a valid pointer to nowhere for zero sized
malloc, which you can't follow and read what its pointing at. Its only
viable to call free() on.

In other code, if samples is a valid pointer, we dereference it and look
at the first sample.

Signed-off-by: Anton Lundin <gla...@acc.umu.se>
---
 dive.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/dive.c b/dive.c
index 8e8330f..4cf532f 100644
--- a/dive.c
+++ b/dive.c
@@ -602,6 +602,14 @@ void copy_samples(struct divecomputer *s, struct 
divecomputer *d)
        int nr = s->samples;
        d->samples = nr;
        d->alloc_samples = nr;
+       // We expect to be able to read the memory in the other end of the 
pointer
+       // if its a valid pointer, so don't expect malloc() to return NULL for
+       // zero-sized malloc, do it our selfs.
+       d->sample = NULL;
+
+       if(!nr)
+               return;
+
        d->sample = malloc(nr * sizeof(struct sample));
        if (d->sample)
                memcpy(d->sample, s->sample, nr * sizeof(struct sample));
-- 
2.1.0

_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to