]> git.sesse.net Git - vlc/blobdiff - modules/access_output/file.c
lua/intf: Fix a memleak.
[vlc] / modules / access_output / file.c
index 9cf4d98c99f6059f970529b214814b38b0e07528..9abce9b8848255546f0d77b7674f7640bf19aa3e 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <time.h>
 #include <fcntl.h>
 #include <errno.h>
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_sout.h>
@@ -173,8 +174,13 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************/
 static ssize_t Read( sout_access_out_t *p_access, block_t *p_buffer )
 {
-    return read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
-                 p_buffer->i_buffer );
+    ssize_t val;
+
+    do
+        val = read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
+                    p_buffer->i_buffer );
+    while (val == -1 && errno == EINTR);
+    return val;
 }
 
 /*****************************************************************************
@@ -186,15 +192,29 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer )
 
     while( p_buffer )
     {
-        block_t *p_next = p_buffer->p_next;;
-
-        i_write += write( (intptr_t)p_access->p_sys,
-                          p_buffer->p_buffer, p_buffer->i_buffer );
-        block_Release( p_buffer );
-
-        p_buffer = p_next;
+        ssize_t val = write ((intptr_t)p_access->p_sys,
+                             p_buffer->p_buffer, p_buffer->i_buffer);
+        if (val == -1)
+        {
+            if (errno == EINTR)
+                continue;
+            block_ChainRelease (p_buffer);
+            return -1;
+        }
+
+        if ((size_t)val >= p_buffer->i_buffer)
+        {
+            block_t *p_next = p_buffer->p_next;
+            block_Release (p_buffer);
+            p_buffer = p_next;
+        }
+        else
+        {
+            p_buffer->p_buffer += val;
+            p_buffer->i_buffer -= val;
+        }
+        i_write += val;
     }
-
     return i_write;
 }