sd-varlink: pin error message while we invoke a reply callback
Let's make sure the parameters/error pointers into the message remain valid as long as the reply callback is running, even if the reply otherwise resets the pending message.
This commit is contained in:
committed by
Mike Yuan
parent
4ef56f30b8
commit
dfb1fa0197
@@ -1135,9 +1135,8 @@ static int varlink_sanitize_incoming_parameters(sd_json_variant **v) {
|
||||
}
|
||||
|
||||
static int varlink_dispatch_reply(sd_varlink *v) {
|
||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *parameters = NULL;
|
||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *parameters = NULL, *error = NULL;
|
||||
sd_varlink_reply_flags_t flags = 0;
|
||||
const char *error = NULL;
|
||||
sd_json_variant *e;
|
||||
const char *k;
|
||||
int r;
|
||||
@@ -1162,7 +1161,7 @@ static int varlink_dispatch_reply(sd_varlink *v) {
|
||||
if (!sd_json_variant_is_string(e))
|
||||
goto invalid;
|
||||
|
||||
error = sd_json_variant_string(e);
|
||||
error = sd_json_variant_ref(e);
|
||||
flags |= SD_VARLINK_REPLY_ERROR;
|
||||
|
||||
} else if (streq(k, "parameters")) {
|
||||
@@ -1204,7 +1203,7 @@ static int varlink_dispatch_reply(sd_varlink *v) {
|
||||
varlink_set_state(v, VARLINK_PROCESSING_REPLY);
|
||||
|
||||
if (v->reply_callback) {
|
||||
r = v->reply_callback(v, parameters, error, flags, v->userdata);
|
||||
r = v->reply_callback(v, parameters, sd_json_variant_string(error), flags, v->userdata);
|
||||
if (r < 0)
|
||||
varlink_log_errno(v, r, "Reply callback returned error, ignoring: %m");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user