mirror of
https://github.com/ipxe/ipxe
synced 2025-12-16 17:41:18 +03:00
[iobuf] Add iob_disown() and use it where it simplifies code
There are many functions that take ownership of the I/O buffer they
are passed as a parameter. The caller should not retain a pointer to
the I/O buffer. Use iob_disown() to automatically nullify the
caller's pointer, e.g.:
xfer_deliver_iob ( xfer, iob_disown ( iobuf ) );
This will ensure that iobuf is set to NULL for any code after the call
to xfer_deliver_iob().
iob_disown() is currently used only in places where it simplifies the
code, by avoiding an extra line explicitly setting the I/O buffer
pointer to NULL. It should ideally be used with each call to any
function that takes ownership of an I/O buffer. (The SSA
optimisations will ensure that use of iob_disown() gets optimised away
in cases where the caller makes no further use of the I/O buffer
pointer anyway.)
If gcc ever introduces an __attribute__((free)), indicating that use
of a function argument after a function call should generate a
warning, then we should use this to identify all applicable function
call sites, and add iob_disown() as necessary.
This commit is contained in:
@@ -763,9 +763,8 @@ static int tftp_rx_data ( struct tftp_request *tftp,
|
||||
memset ( &meta, 0, sizeof ( meta ) );
|
||||
meta.whence = SEEK_SET;
|
||||
meta.offset = offset;
|
||||
rc = xfer_deliver_iob_meta ( &tftp->xfer, iobuf, &meta );
|
||||
iobuf = NULL;
|
||||
if ( rc != 0 ) {
|
||||
if ( ( rc = xfer_deliver_iob_meta ( &tftp->xfer, iob_disown ( iobuf ),
|
||||
&meta ) ) != 0 ) {
|
||||
DBGC ( tftp, "TFTP %p could not deliver data: %s\n",
|
||||
tftp, strerror ( rc ) );
|
||||
goto done;
|
||||
@@ -887,8 +886,7 @@ static int tftp_rx ( struct tftp_request *tftp,
|
||||
rc = tftp_rx_oack ( tftp, iobuf->data, len );
|
||||
break;
|
||||
case htons ( TFTP_DATA ):
|
||||
rc = tftp_rx_data ( tftp, iobuf );
|
||||
iobuf = NULL;
|
||||
rc = tftp_rx_data ( tftp, iob_disown ( iobuf ) );
|
||||
break;
|
||||
case htons ( TFTP_ERROR ):
|
||||
rc = tftp_rx_error ( tftp, iobuf->data, len );
|
||||
|
||||
Reference in New Issue
Block a user