diff options
| author | Neels Hofmeyr <neels@hofmeyr.de> | 2017-12-16 04:05:21 +0100 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2017-12-18 23:05:50 +0000 | 
| commit | f2c10f108202c350a3c16f49156b11b0cd0dfa96 (patch) | |
| tree | e623921a0f0f9c5193e9208bbab38f18262a141e | |
| parent | 6769ad6e0aca58ccc037746885976ea4f85cb318 (diff) | |
ctrl: fix mem leak when handling GET_REPLY and SET_REPLY
In ctrl_handle_msg() (code recently propagated from handle_control_read()),
talloc_free() the parsed ctrl_cmd in all code paths. In particular, a free was
missing in case ctrl_cmd_handle() returns CTRL_CMD_HANDLED.
CTRL_CMD_HANDLED is triggered by GET_REPLY / SET_REPLY parsing, as show by
ctrl_test.c. With the memleak fixed, adjust expected test output and make a
detected mem leak abort the test immediately.
Change-Id: Id583b413f8b8bd16e5cf92a8a9e8663903646381
| -rw-r--r-- | src/ctrl/control_if.c | 3 | ||||
| -rw-r--r-- | tests/ctrl/ctrl_test.c | 5 | ||||
| -rw-r--r-- | tests/ctrl/ctrl_test.ok | 2 | 
3 files changed, 3 insertions, 7 deletions
| diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c index 7c1d81ac..5c73b631 100644 --- a/src/ctrl/control_if.c +++ b/src/ctrl/control_if.c @@ -387,7 +387,6 @@ int ctrl_handle_msg(struct ctrl_handle *ctrl, struct ctrl_connection *ccon, stru  		cmd->ccon = ccon;  		if (ctrl_cmd_handle(ctrl, cmd, ctrl->data) != CTRL_CMD_HANDLED) {  			ctrl_cmd_send(&ccon->write_queue, cmd); -			talloc_free(cmd);  		}  	} else {  		cmd = talloc_zero(ccon, struct ctrl_cmd); @@ -398,9 +397,9 @@ int ctrl_handle_msg(struct ctrl_handle *ctrl, struct ctrl_connection *ccon, stru  		cmd->id = "err";  		cmd->reply = "Command parser error.";  		ctrl_cmd_send(&ccon->write_queue, cmd); -		talloc_free(cmd);  	} +	talloc_free(cmd);  	return 0;  } diff --git a/tests/ctrl/ctrl_test.c b/tests/ctrl/ctrl_test.c index 9c7316fc..e25929c2 100644 --- a/tests/ctrl/ctrl_test.c +++ b/tests/ctrl/ctrl_test.c @@ -120,9 +120,8 @@ static void assert_test(struct ctrl_handle *ctrl, struct ctrl_connection *ccon,  	if (talloc_total_size(ctx) != ctx_size_was) {  		printf("mem leak!\n"); -		// hide mem leak to be fixed in subsequent patch -		//talloc_report_full(ctx, stdout); -		//OSMO_ASSERT(false); +		talloc_report_full(ctx, stdout); +		OSMO_ASSERT(false);  	}  	printf("ok\n"); diff --git a/tests/ctrl/ctrl_test.ok b/tests/ctrl/ctrl_test.ok index 9ddcfdb1..210c5997 100644 --- a/tests/ctrl/ctrl_test.ok +++ b/tests/ctrl/ctrl_test.ok @@ -167,7 +167,6 @@ variable = 'variable'  value = '(null)'  reply = 'OK'  handling: -mem leak!  ok  test: 'SET_REPLY 1 variable OK'  parsing: @@ -176,5 +175,4 @@ variable = 'variable'  value = '(null)'  reply = 'OK'  handling: -mem leak!  ok | 
