mirror of https://github.com/ipxe/ipxe.git
[http] Cleanly shut down potentially looped interfaces
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>
pull/58/merge
parent
23b788e5cd
commit
4a4da573dd
|
@ -275,15 +275,9 @@ static void http_close ( struct http_transaction *http, int rc ) {
|
||||||
/* Stop timer */
|
/* Stop timer */
|
||||||
stop_timer ( &http->timer );
|
stop_timer ( &http->timer );
|
||||||
|
|
||||||
/* Close all interfaces, allowing for the fact that the
|
/* Close all interfaces */
|
||||||
* content-decoded and transfer-decoded interfaces may be
|
intfs_shutdown ( rc, &http->conn, &http->transfer, &http->content,
|
||||||
* connected to the same object.
|
&http->xfer, NULL );
|
||||||
*/
|
|
||||||
intf_shutdown ( &http->conn, rc );
|
|
||||||
intf_nullify ( &http->transfer );
|
|
||||||
intf_shutdown ( &http->content, rc );
|
|
||||||
intf_shutdown ( &http->transfer, rc );
|
|
||||||
intf_shutdown ( &http->xfer, rc );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -784,12 +778,9 @@ static int http_transfer_complete ( struct http_transaction *http ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart content decoding interfaces (which may be attached
|
/* Restart content decoding interfaces */
|
||||||
* to the same object).
|
intfs_restart ( http->response.rc, &http->content, &http->transfer,
|
||||||
*/
|
NULL );
|
||||||
intf_nullify ( &http->transfer ); /* avoid potential loops */
|
|
||||||
intf_restart ( &http->content, http->response.rc );
|
|
||||||
intf_restart ( &http->transfer, http->response.rc );
|
|
||||||
intf_plug_plug ( &http->transfer, &http->content );
|
intf_plug_plug ( &http->transfer, &http->content );
|
||||||
http->len = 0;
|
http->len = 0;
|
||||||
assert ( http->remaining == 0 );
|
assert ( http->remaining == 0 );
|
||||||
|
|
Loading…
Reference in New Issue