diff options
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
| -rw-r--r-- | net/sctp/sm_sideeffect.c | 28 | 
1 files changed, 18 insertions, 10 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index acd737d4c0e0..834e9f82afed 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -1363,8 +1363,10 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,  			/* Generate an INIT ACK chunk.  */  			new_obj = sctp_make_init_ack(asoc, chunk, GFP_ATOMIC,  						     0); -			if (!new_obj) -				goto nomem; +			if (!new_obj) { +				error = -ENOMEM; +				break; +			}  			sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,  					SCTP_CHUNK(new_obj)); @@ -1386,7 +1388,8 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,  			if (!new_obj) {  				if (cmd->obj.chunk)  					sctp_chunk_free(cmd->obj.chunk); -				goto nomem; +				error = -ENOMEM; +				break;  			}  			sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,  					SCTP_CHUNK(new_obj)); @@ -1433,8 +1436,10 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,  			/* Generate a SHUTDOWN chunk.  */  			new_obj = sctp_make_shutdown(asoc, chunk); -			if (!new_obj) -				goto nomem; +			if (!new_obj) { +				error = -ENOMEM; +				break; +			}  			sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,  					SCTP_CHUNK(new_obj));  			break; @@ -1770,11 +1775,17 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,  			break;  		} -		if (error) +		if (error) { +			cmd = sctp_next_cmd(commands); +			while (cmd) { +				if (cmd->verb == SCTP_CMD_REPLY) +					sctp_chunk_free(cmd->obj.chunk); +				cmd = sctp_next_cmd(commands); +			}  			break; +		}  	} -out:  	/* If this is in response to a received chunk, wait until  	 * we are done with the packet to open the queue so that we don't  	 * send multiple packets in response to a single request. @@ -1789,7 +1800,4 @@ out:  		sp->data_ready_signalled = 0;  	return error; -nomem: -	error = -ENOMEM; -	goto out;  }  | 
