[libdvdnav-devel] dvdnav: fix invalid free in dvdnav_free_dup
John Stebbins
git at videolan.org
Mon Aug 25 16:57:05 CEST 2014
libdvdnav | branch: master | John Stebbins <jstebbins at jetheaddev.com> | Fri Aug 22 12:06:41 2014 -0700| [93f9aa5947321f90d19f74a60eeaceff8fd09f71] | committer: John Stebbins
dvdnav: fix invalid free in dvdnav_free_dup
When path was changed from char[] to char*, a free was added to
dvdnav_free_dup, but the string was not copied in dvdnav_dup resulting
in a double free.
> http://git.videolan.org/gitweb.cgi/libdvdnav.git/?a=commit;h=93f9aa5947321f90d19f74a60eeaceff8fd09f71
---
src/dvdnav.c | 27 ++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/src/dvdnav.c b/src/dvdnav.c
index 6f32550..a5fac25 100644
--- a/src/dvdnav.c
+++ b/src/dvdnav.c
@@ -74,27 +74,40 @@ dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src) {
(*dest) = NULL;
this = (dvdnav_t*)malloc(sizeof(dvdnav_t));
- if(!this)
+ if (!this)
return DVDNAV_STATUS_ERR;
memcpy(this, src, sizeof(dvdnav_t));
this->file = NULL;
+ this->vm = NULL;
+ this->path = NULL;
+ this->cache = NULL;
pthread_mutex_init(&this->vm_lock, NULL);
this->vm = vm_new_copy(src->vm);
- if(!this->vm) {
- printerr("Error initialising the DVD VM.");
- pthread_mutex_destroy(&this->vm_lock);
- free(this);
- return DVDNAV_STATUS_ERR;
- }
+ if (!this->vm)
+ goto fail;
+
+ this->path = strdup(src->path);
+ if (!this->path)
+ goto fail;
/* Start the read-ahead cache. */
this->cache = dvdnav_read_cache_new(this);
+ if (!this->cache)
+ goto fail;
(*dest) = this;
return DVDNAV_STATUS_OK;
+
+fail:
+ printerr("Error initialising the DVD VM.");
+ pthread_mutex_destroy(&this->vm_lock);
+ vm_free_vm(this->vm);
+ free(this->path);
+ free(this);
+ return DVDNAV_STATUS_ERR;
}
dvdnav_status_t dvdnav_free_dup(dvdnav_t *this) {
More information about the libdvdnav-devel
mailing list