[libdvdcss-devel] [PATCH 3/4] Properly check for and return errors from close().

Diego Biurrun diego at biurrun.de
Thu Nov 13 14:08:13 CET 2014


Also fix a memory leak on close() failure.
---
 src/device.c    | 12 ++++++++----
 src/libdvdcss.c |  7 +++----
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/device.c b/src/device.c
index ddb216e..e824b54 100644
--- a/src/device.c
+++ b/src/device.c
@@ -412,6 +412,7 @@ int dvdcss_raw_open ( dvdcss_t dvdcss, const char *psz_device )
 
 int dvdcss_close_device ( dvdcss_t dvdcss )
 {
+    int i_ret;
 #if defined( WIN32 )
     if( dvdcss->b_file )
     {
@@ -426,13 +427,16 @@ int dvdcss_close_device ( dvdcss_t dvdcss )
     free( dvdcss->p_readv_buffer );
     dvdcss->p_readv_buffer   = NULL;
     dvdcss->i_readv_buf_size = 0;
-
-    return 0;
 #else
-    close( dvdcss->i_fd );
+    i_ret = close( dvdcss->i_fd );
+    if( i_ret < 0 )
+    {
+        print_error( dvdcss, "Failed to close fd, data loss possible." );
+        return i_ret;
+    }
+#endif
 
     return 0;
-#endif
 }
 
 /* Following functions are local */
diff --git a/src/libdvdcss.c b/src/libdvdcss.c
index 44d740b..91f83cd 100644
--- a/src/libdvdcss.c
+++ b/src/libdvdcss.c
@@ -779,16 +779,15 @@ LIBDVDCSS_EXPORT int dvdcss_close ( dvdcss_t dvdcss )
         p_title = p_tmptitle;
     }
 
-    i_ret = dvdcss_close_device( dvdcss );
+    free( dvdcss->psz_device );
+    free( dvdcss );
 
+    i_ret = dvdcss_close_device( dvdcss );
     if( i_ret < 0 )
     {
         return i_ret;
     }
 
-    free( dvdcss->psz_device );
-    free( dvdcss );
-
     return 0;
 }
 
-- 
2.1.0



More information about the libdvdcss-devel mailing list