[vlc-commits] stream_extractor: archive: explicitly handle EOF

Filip Roséen git at videolan.org
Thu Jul 26 00:15:28 CEST 2018


vlc | branch: master | Filip Roséen <filip at atch.se> | Wed Jul 25 05:04:06 2018 +0200| [072c3e6368cb831bb85d908f2ea70164d71c57b0] | committer: Jean-Baptiste Kempf

stream_extractor: archive: explicitly handle EOF

Things will be a lot simpler if we explicitly handle EOF different
from a libarchive error.

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=072c3e6368cb831bb85d908f2ea70164d71c57b0
---

 modules/stream_extractor/archive.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/modules/stream_extractor/archive.c b/modules/stream_extractor/archive.c
index 0f2899916b..447556c279 100644
--- a/modules/stream_extractor/archive.c
+++ b/modules/stream_extractor/archive.c
@@ -73,6 +73,7 @@ struct private_sys_t
 
     struct archive_entry* p_entry;
     bool b_dead;
+    bool b_eof;
 
     uint64_t i_offset;
 
@@ -395,6 +396,7 @@ static int archive_extractor_reset( stream_extractor_t* p_extractor )
         return VLC_EGENERIC;
 
     p_sys->i_offset = 0;
+    p_sys->b_eof = false;
     p_sys->b_dead = false;
     return VLC_SUCCESS;
 }
@@ -570,6 +572,9 @@ static ssize_t Read( stream_extractor_t *p_extractor, void* p_data, size_t i_siz
     if( p_sys->b_dead || p_sys->p_entry == NULL )
         return 0;
 
+    if( p_sys->b_eof )
+        return 0;
+
     i_ret = archive_read_data( p_arc,
       p_data ? p_data :                        dummy_buffer,
       p_data ? i_size : __MIN( i_size, sizeof( dummy_buffer ) ) );
@@ -579,20 +584,26 @@ static ssize_t Read( stream_extractor_t *p_extractor, void* p_data, size_t i_siz
         case ARCHIVE_RETRY:
         case ARCHIVE_FAILED:
             msg_Dbg( p_extractor, "libarchive: %s", archive_error_string( p_arc ) );
-            return -1;
+            goto eof;
 
         case ARCHIVE_WARN:
             msg_Warn( p_extractor, "libarchive: %s", archive_error_string( p_arc ) );
-            return -1;
+            goto eof;
 
         case ARCHIVE_FATAL:
-            p_sys->b_dead = true;
             msg_Err( p_extractor, "libarchive: %s", archive_error_string( p_arc ) );
-            return 0;
+            goto fatal_error;
     }
 
     p_sys->i_offset += i_ret;
     return i_ret;
+
+fatal_error:
+    p_sys->b_dead = true;
+
+eof:
+    p_sys->b_eof = true;
+    return 0;
 }
 
 static int archive_skip_decompressed( stream_extractor_t* p_extractor, uint64_t i_skip )



More information about the vlc-commits mailing list