[vlc-commits] smb2: fix error_status that could be overridden

Thomas Guillem git at videolan.org
Thu Oct 17 09:59:03 CEST 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue Oct 15 13:18:29 2019 +0200| [01e9c37d714bf0fef3c155381fb99465047615d3] | committer: Thomas Guillem

smb2: fix error_status that could be overridden

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

 modules/access/smb2.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/modules/access/smb2.c b/modules/access/smb2.c
index 5c97497ef0..923e6d57e0 100644
--- a/modules/access/smb2.c
+++ b/modules/access/smb2.c
@@ -141,6 +141,12 @@ vlc_smb2_mainloop(stream_t *access, bool teardown)
     int timeout = -1;
     int (*poll_func)(struct pollfd *, unsigned, int) = vlc_poll_i11e;
 
+    /* vlc_smb2_mainloop() can be called to clean-up after an error, but this
+     * function can override the error_status (from async cbs). Therefore,
+     * store the original error_status in order to restore it at the end of
+     * this call (since we want to keep the first and original error status). */
+    int original_error_status = sys->error_status;
+
     if (teardown)
     {
         /* Don't use vlc_poll_i11e that will return immediately with the EINTR
@@ -187,7 +193,11 @@ vlc_smb2_mainloop(stream_t *access, bool teardown)
              && smb2_service(sys->smb2, p_fds[0].revents) < 0)
             VLC_SMB2_SET_GENERIC_ERROR(access, "smb2_service");
     }
-    return sys->error_status == 0 ? 0 : -1;
+
+    int ret = sys->error_status == 0 ? 0 : -1;
+    if (original_error_status != 0)
+        sys->error_status = original_error_status;
+    return ret;
 }
 
 #define VLC_SMB2_GENERIC_CB() \



More information about the vlc-commits mailing list