diff --git a/libavdevice/vfwcap.c b/libavdevice/vfwcap.c
index ababab9c846da3475d64d25faf31c2ab557ae061..1ab5548cef70236184642faf6c171cc2abd1fb8c 100644
--- a/libavdevice/vfwcap.c
+++ b/libavdevice/vfwcap.c
@@ -308,8 +308,7 @@ static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap)
     }
     ret = SendMessage(ctx->hwnd, WM_CAP_GET_VIDEOFORMAT, bisize, (LPARAM) bi);
     if(!ret) {
-        av_free(bi);
-        goto fail_io;
+        goto fail_bi;
     }
 
     dump_bih(s, &bi->bmiHeader);
@@ -322,8 +321,7 @@ static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap)
     ret = SendMessage(ctx->hwnd, WM_CAP_SET_VIDEOFORMAT, bisize, (LPARAM) bi);
     if(!ret) {
         av_log(s, AV_LOG_ERROR, "Could not set Video Format.\n");
-        av_free(bi);
-        goto fail_io;
+        goto fail_bi;
     }
 
     biCompression = bi->bmiHeader.biCompression;
@@ -392,6 +390,9 @@ static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
     return 0;
 
+fail_bi:
+    av_free(bi);
+
 fail_io:
     vfw_read_close(s);
     return AVERROR_IO;