This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Neels Hofmeyr gerrit-no-reply at lists.osmocom.orgReview at https://gerrit.osmocom.org/7618 ctrl: fix deferred commands (and hence fix osmo-bts-sysmo 'clock-info' cmd) The CTRL interface has a ctrl_cmd_def_* API that allows deferring a CTRL command reply until later. However, the command handling currently fails to acknowledge this and deallocates the struct ctrl_cmd anyway. Fix: in struct ctrl_cmd, add a defer pointer to be populated by ctrl_cmd_def_make(). A cmd thus marked as deferred is not deallocated at the end of command handling. This fix needs no change in calling code. (Another idea was to return a different code than CTRL_CMD_HANDLED when the command is to be deferred, but that would require adjusting each user of ctrl_cmd_def_make(). The implicit marking is safer and easier.) One symptom of the breakage is that osmo-bts-sysmo crashes when asked to report a trx's clock-info, which is aggravated by the fact that the sysmobts-mgr does ask osmo-bts-sysmo for a clock-info. The crash appears since Id583b413f8b8bd16e5cf92a8a9e8663903646381 -- it looked like just fixing an obvious memory leak, which it did as shown by the unit test, but deferred ctrl commands actually relied on that leak. Both fixed now. Related: OS#3120 Change-Id: I24232be7dcf7be79f4def91ddc8b8f8005b56318 --- M include/osmocom/ctrl/control_cmd.h M src/ctrl/control_cmd.c M src/ctrl/control_if.c 3 files changed, 11 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/18/7618/1 diff --git a/include/osmocom/ctrl/control_cmd.h b/include/osmocom/ctrl/control_cmd.h index 865b006..a5df753 100644 --- a/include/osmocom/ctrl/control_cmd.h +++ b/include/osmocom/ctrl/control_cmd.h @@ -56,6 +56,8 @@ struct llist_head def_cmds; }; +struct ctrl_cmd_def; + struct ctrl_cmd { struct ctrl_connection *ccon; enum ctrl_type type; @@ -64,6 +66,7 @@ char *variable; char *value; char *reply; + struct ctrl_cmd_def *defer; }; #define ctrl_cmd_reply_printf(cmd, fmt, args ...) \ diff --git a/src/ctrl/control_cmd.c b/src/ctrl/control_cmd.c index c747e84..fb0cd2b 100644 --- a/src/ctrl/control_cmd.c +++ b/src/ctrl/control_cmd.c @@ -566,6 +566,7 @@ cd = talloc_zero(ctx, struct ctrl_cmd_def); + cmd->defer = cd; cd->cmd = cmd; cd->data = data; diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c index 07de0d4..df8abbc 100644 --- a/src/ctrl/control_if.c +++ b/src/ctrl/control_if.c @@ -401,6 +401,13 @@ if (cmd->type != CTRL_TYPE_ERROR) { cmd->ccon = ccon; if (ctrl_cmd_handle(ctrl, cmd, ctrl->data) == CTRL_CMD_HANDLED) { + + if (cmd->defer) { + /* The command is still stored as ctrl_cmd_def.cmd, in the def_cmds list. + * Just leave hanging for deferred handling. Reply will happen later. */ + return 0; + } + /* On CTRL_CMD_HANDLED, no reply needs to be sent back. */ talloc_free(cmd); cmd = NULL; -- To view, visit https://gerrit.osmocom.org/7618 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I24232be7dcf7be79f4def91ddc8b8f8005b56318 Gerrit-PatchSet: 1 Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>