Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[xfer] Always nullify interface while sending close() message
Objects typically call xfer_close() as part of their response to a
close() message.  If the initiating object has already nullified the
xfer interface then this isn't a problem, but it can lead to
unexpected behaviour when the initiating object is aiming to reuse the
connection and so does not nullify the interface.

Fix by always temporarily nullifying the interface during xfer_close()
(as was already being done by xfer_vreopen() in order to work around
this specific problem).

Reported-by: infernix <infernix@infernix.net>
Tested-by: infernix <infernix@infernix.net>
  • Loading branch information
Michael Brown committed Jul 6, 2009
1 parent 546cc62 commit b7e93a6
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 5 deletions.
5 changes: 0 additions & 5 deletions src/core/open.c
Expand Up @@ -188,15 +188,10 @@ int xfer_open ( struct xfer_interface *xfer, int type, ... ) {
* method handler.
*/
int xfer_vreopen ( struct xfer_interface *xfer, int type, va_list args ) {
struct xfer_interface_operations *op = xfer->op;

/* Close existing connection */
xfer_nullify ( xfer );
xfer_close ( xfer, 0 );

/* Restore to operational status */
xfer->op = op;

/* Open new location */
return xfer_vopen ( xfer, type, args );
}
3 changes: 3 additions & 0 deletions src/core/xfer.c
Expand Up @@ -45,11 +45,14 @@ static struct xfer_metadata dummy_metadata;
*/
void xfer_close ( struct xfer_interface *xfer, int rc ) {
struct xfer_interface *dest = xfer_get_dest ( xfer );
struct xfer_interface_operations *op = xfer->op;

DBGC ( xfer, "XFER %p->%p close\n", xfer, dest );

xfer_unplug ( xfer );
xfer_nullify ( xfer );
dest->op->close ( dest, rc );
xfer->op = op;
xfer_put ( dest );
}

Expand Down

0 comments on commit b7e93a6

Please sign in to comment.