]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[http] Cleanly shut down potentially looped interfaces
authorMichael Brown <mcb30@ipxe.org>
Thu, 2 Feb 2017 16:52:55 +0000 (16:52 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 2 Feb 2017 16:58:00 +0000 (16:58 +0000)
Use intfs_shutdown() and intfs_restart() to cleanly shut down multiple
interfaces that may loop back to the same object.

This fixes a regression introduced by commit daa8ed9 ("[interface]
Provide intf_reinit() to reinitialise nullified interfaces") which
broke the use of HTTP Basic and Digest authentication.

Reported-by: murmansk <murmansk@hotmail.com>
Reported-by: Brett Waldo <brettwaldo@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/tcp/httpcore.c

index 27cc506534558dc2597579260f298464b7cfaf60..ec527c64de1aafc6f23cd3c23af615820df3f8e1 100644 (file)
@@ -275,15 +275,9 @@ static void http_close ( struct http_transaction *http, int rc ) {
        /* Stop timer */
        stop_timer ( &http->timer );
 
-       /* Close all interfaces, allowing for the fact that the
-        * content-decoded and transfer-decoded interfaces may be
-        * connected to the same object.
-        */
-       intf_shutdown ( &http->conn, rc );
-       intf_nullify ( &http->transfer );
-       intf_shutdown ( &http->content, rc );
-       intf_shutdown ( &http->transfer, rc );
-       intf_shutdown ( &http->xfer, rc );
+       /* Close all interfaces */
+       intfs_shutdown ( rc, &http->conn, &http->transfer, &http->content,
+                        &http->xfer, NULL );
 }
 
 /**
@@ -784,12 +778,9 @@ static int http_transfer_complete ( struct http_transaction *http ) {
                }
        }
 
-       /* Restart content decoding interfaces (which may be attached
-        * to the same object).
-        */
-       intf_nullify ( &http->transfer ); /* avoid potential loops */
-       intf_restart ( &http->content, http->response.rc );
-       intf_restart ( &http->transfer, http->response.rc );
+       /* Restart content decoding interfaces */
+       intfs_restart ( http->response.rc, &http->content, &http->transfer,
+                       NULL );
        intf_plug_plug ( &http->transfer, &http->content );
        http->len = 0;
        assert ( http->remaining == 0 );