Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions daemons/attrd/attrd_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -596,8 +596,7 @@ attrd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size)

if (xml == NULL) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;

} else {
Expand Down
5 changes: 2 additions & 3 deletions daemons/attrd/attrd_sync.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2022-2025 the Pacemaker project contributors
* Copyright 2022-2026 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
Expand Down Expand Up @@ -382,8 +382,7 @@ confirmation_timeout_cb(gpointer data)
client->id);
pcmk__ipc_send_ack(client, action->ipc_id,
action->flags|crm_ipc_client_response,
PCMK__XE_ACK, ATTRD_PROTOCOL_VERSION,
CRM_EX_TIMEOUT);
ATTRD_PROTOCOL_VERSION, CRM_EX_TIMEOUT);

g_hash_table_iter_remove(&iter);
pcmk__trace("%u requests now in expected confirmations table",
Expand Down
6 changes: 3 additions & 3 deletions daemons/attrd/pacemaker-attrd.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@
#define ATTRD_SUPPORTS_MULTI_MESSAGE(x) ((x) >= 4)
#define ATTRD_SUPPORTS_CONFIRMATION(x) ((x) >= 5)

#define attrd_send_ack(client, id, flags) \
pcmk__ipc_send_ack((client), (id), (flags), PCMK__XE_ACK, \
ATTRD_PROTOCOL_VERSION, CRM_EX_INDETERMINATE)
#define attrd_send_ack(client, id, flags) \
pcmk__ipc_send_ack((client), (id), (flags), ATTRD_PROTOCOL_VERSION, \
CRM_EX_INDETERMINATE)

void attrd_init_mainloop(void);
void attrd_run_mainloop(void);
Expand Down
5 changes: 2 additions & 3 deletions daemons/based/based_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,7 @@ dispatch_common(qb_ipcs_connection_t *c, void *data, bool privileged)

if (msg == NULL) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_NACK, NULL,
CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;
}

Expand Down Expand Up @@ -200,7 +199,7 @@ dispatch_common(qb_ipcs_connection_t *c, void *data, bool privileged)
status = CRM_EX_INVALID_PARAM;
}

pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL, status);
pcmk__ipc_send_ack(client, id, flags, NULL, status);
return 0;
}

Expand Down
6 changes: 2 additions & 4 deletions daemons/controld/controld_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,12 +403,10 @@ dispatch_controller_ipc(qb_ipcs_connection_t * c, void *data, size_t size)
}

if (msg == NULL) {
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;
}
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_INDETERMINATE);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_INDETERMINATE);

pcmk__assert(client->user != NULL);
pcmk__update_acl_user(msg, PCMK__XA_CRM_USER, client->user);
Expand Down
2 changes: 1 addition & 1 deletion daemons/execd/execd_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ execd_ipc_dispatch(qb_ipcs_connection_t *c, void *data, size_t size)

if ((msg == NULL) || execd_invalid_msg(msg)) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_NACK, NULL, CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
} else {
pcmk__request_t request = {
.ipc_client = client,
Expand Down
2 changes: 1 addition & 1 deletion daemons/execd/execd_messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ static xmlNode *
handle_unknown_request(pcmk__request_t *request)
{
pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_NACK, NULL, CRM_EX_PROTOCOL);
NULL, CRM_EX_PROTOCOL);

pcmk__format_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID,
"Unknown request type '%s' (bug?)",
Expand Down
9 changes: 1 addition & 8 deletions daemons/execd/remoted_tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,16 +127,9 @@ lrmd_remote_client_msg(gpointer data)

msg = pcmk__remote_message_xml(client->remote);

if (msg == NULL) {
if ((msg == NULL) || execd_invalid_msg(msg)) {
pcmk__debug("Unrecognizable IPC data from PID %d", client->pid);
} else if (execd_invalid_msg(msg)) {
int id = 0;

pcmk__debug("Unrecognizable IPC data from PID %d", client->pid);

pcmk__xe_get_int(msg, PCMK__XA_LRMD_REMOTE_MSG_ID, &id);
pcmk__ipc_send_ack(client, id, crm_ipc_client_response, PCMK__XE_NACK,
NULL, CRM_EX_PROTOCOL);
} else {
pcmk__request_t request = {
.ipc_client = client,
Expand Down
3 changes: 1 addition & 2 deletions daemons/fenced/fenced_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -3418,8 +3418,7 @@ handle_notify_request(pcmk__request_t *request)
pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL);
pcmk__set_request_flags(request, pcmk__request_reuse_options);

return pcmk__ipc_create_ack(request->ipc_flags, PCMK__XE_ACK, NULL,
CRM_EX_OK);
return pcmk__ipc_create_ack(request->ipc_flags, NULL, CRM_EX_OK);
}

// STONITH_OP_RELAY
Expand Down
2 changes: 1 addition & 1 deletion daemons/fenced/fenced_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ fenced_ipc_dispatch(qb_ipcs_connection_t *c, void *data, size_t size)

if (msg == NULL) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_NACK, NULL, CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;
}

Expand Down
3 changes: 1 addition & 2 deletions daemons/pacemakerd/pcmkd_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,7 @@ pacemakerd_ipc_dispatch(qb_ipcs_connection_t *c, void *data, size_t size)

if (msg == NULL) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;

} else {
Expand Down
8 changes: 4 additions & 4 deletions daemons/pacemakerd/pcmkd_messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ handle_node_cache_request(pcmk__request_t *request)
pcmk__client_name(request->ipc_client));

pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_OK);
NULL, CRM_EX_OK);
return NULL;
}

Expand All @@ -55,7 +55,7 @@ handle_ping_request(pcmk__request_t *request)
pcmk__s(pcmk__xe_get(msg, PCMK_XA_ORIGIN), ""));

pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE);
NULL, CRM_EX_INDETERMINATE);

ping = pcmk__xe_create(NULL, PCMK__XE_PING_RESPONSE);
value = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO);
Expand Down Expand Up @@ -114,7 +114,7 @@ handle_shutdown_request(pcmk__request_t *request)
pcmk__client_privileged);

pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE);
NULL, CRM_EX_INDETERMINATE);

shutdown = pcmk__xe_create(NULL, PCMK__XE_SHUTDOWN);

Expand Down Expand Up @@ -152,7 +152,7 @@ static xmlNode *
handle_unknown_request(pcmk__request_t *request)
{
pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_PROTOCOL);
NULL, CRM_EX_PROTOCOL);

pcmk__format_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID,
"Unknown request type '%s' (bug?)",
Expand Down
9 changes: 3 additions & 6 deletions daemons/schedulerd/schedulerd_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,22 +104,19 @@ schedulerd_ipc_dispatch(qb_ipcs_connection_t *c, void *data, size_t size)

if (msg == NULL) {
pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c));
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_PROTOCOL);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_PROTOCOL);
return 0;
}

sys_to = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO);

if (pcmk__str_eq(pcmk__xe_get(msg, PCMK__XA_SUBT), PCMK__VALUE_RESPONSE,
pcmk__str_none)) {
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_INDETERMINATE);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_INDETERMINATE);
pcmk__info("Ignoring IPC reply from %s", pcmk__client_name(client));

} else if (!pcmk__str_eq(sys_to, CRM_SYSTEM_PENGINE, pcmk__str_none)) {
pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL,
CRM_EX_INDETERMINATE);
pcmk__ipc_send_ack(client, id, flags, NULL, CRM_EX_INDETERMINATE);
pcmk__info("Ignoring invalid IPC message: to '%s' not "
CRM_SYSTEM_PENGINE, pcmk__s(sys_to, ""));

Expand Down
6 changes: 3 additions & 3 deletions daemons/schedulerd/schedulerd_messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ handle_pecalc_request(pcmk__request_t *request)
pcmk_scheduler_t *scheduler = init_scheduler();

pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE);
NULL, CRM_EX_INDETERMINATE);

digest = pcmk__digest_xml(xml_data, false);
converted = pcmk__xml_copy(NULL, xml_data);
Expand Down Expand Up @@ -187,7 +187,7 @@ static xmlNode *
handle_unknown_request(pcmk__request_t *request)
{
pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_PROTOCOL);
NULL, CRM_EX_PROTOCOL);

pcmk__format_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID,
"Unknown request type '%s' (bug?)",
Expand All @@ -199,7 +199,7 @@ static xmlNode *
handle_hello_request(pcmk__request_t *request)
{
pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags,
PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE);
NULL, CRM_EX_INDETERMINATE);

pcmk__trace("Received IPC hello from %s",
pcmk__client_name(request->ipc_client));
Expand Down
14 changes: 7 additions & 7 deletions include/crm/common/ipc_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,15 +216,15 @@ void pcmk__drop_all_clients(qb_ipcs_service_t *s);
void pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax);

xmlNode *pcmk__ipc_create_ack_as(const char *function, int line, uint32_t flags,
const char *tag, const char *ver, crm_exit_t status);
#define pcmk__ipc_create_ack(flags, tag, ver, st) \
pcmk__ipc_create_ack_as(__func__, __LINE__, (flags), (tag), (ver), (st))
const char *ver, crm_exit_t status);
#define pcmk__ipc_create_ack(flags, ver, st) \
pcmk__ipc_create_ack_as(__func__, __LINE__, (flags), (ver), (st))

int pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c,
uint32_t request, uint32_t flags, const char *tag,
const char *ver, crm_exit_t status);
#define pcmk__ipc_send_ack(c, req, flags, tag, ver, st) \
pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (tag), (ver), (st))
uint32_t request, uint32_t flags, const char *ver,
crm_exit_t status);
#define pcmk__ipc_send_ack(c, req, flags, ver, st) \
pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (ver), (st))

int pcmk__ipc_prepare_iov(uint32_t request, const GString *message,
uint16_t index, struct iovec **result, ssize_t *bytes);
Expand Down
36 changes: 36 additions & 0 deletions lib/cib/cib_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@ typedef struct {
mainloop_io_t *source;
} cib_native_opaque_t;

static bool
ack_is_failure(const xmlNode *reply)
{
int status = 0;

pcmk__xe_get_int(reply, PCMK_XA_STATUS, &status);
if (status != CRM_EX_OK) {
pcmk__err("Received error response from based: %s", crm_exit_str(status));
return true;
}

return false;
}

static int
cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host,
const char *section, xmlNode *data,
Expand Down Expand Up @@ -90,6 +104,15 @@ cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host,
goto done;
}

/* The only reason we can receive an ACK here is if dispatch_common ->
* pcmk__client_data2xml processed something that's not valid XML.
* dispatch_common does not return ACK, unlike other daemons.
*/
if (pcmk__xe_is(op_reply, PCMK__XE_ACK) && ack_is_failure(op_reply)) {
rc = -EPROTO;
goto done;
}

pcmk__log_xml_trace(op_reply, "Reply");

if (!(call_options & cib_sync_call)) {
Expand Down Expand Up @@ -321,6 +344,15 @@ cib_native_signon(cib_t *cib, const char *name, enum cib_conn_type type)
goto done;
}

/* The only reason we can receive an ACK here is if dispatch_common ->
* pcmk__client_data2xml processed something that's not valid XML.
* dispatch_common does not return ACK, unlike other daemons.
*/
if (pcmk__xe_is(reply, PCMK__XE_ACK) && ack_is_failure(reply)) {
rc = -EPROTO;
goto done;
}

msg_type = pcmk__xe_get(reply, PCMK__XA_CIB_OP);

pcmk__log_xml_trace(reply, "reg-reply");
Expand Down Expand Up @@ -386,6 +418,10 @@ cib_native_register_notification(cib_t *cib, const char *callback, int enabled)
pcmk__xe_set(notify_msg, PCMK__XA_CIB_OP, PCMK__VALUE_CIB_NOTIFY);
pcmk__xe_set(notify_msg, PCMK__XA_CIB_NOTIFY_TYPE, callback);
pcmk__xe_set_int(notify_msg, PCMK__XA_CIB_NOTIFY_ACTIVATE, enabled);

/* We don't care about the reply here, so there's no need to check
* if we got an ACK in response.
*/
rc = crm_ipc_send(native->ipc, notify_msg, crm_ipc_client_response,
1000 * cib->call_timeout, NULL);
if (rc <= 0) {
Expand Down
36 changes: 35 additions & 1 deletion lib/cib/cib_remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ typedef struct {
int timeout_sec;
} cib_remote_opaque_t;

static bool
ack_is_failure(const xmlNode *reply)
{
int status = 0;

pcmk__xe_get_int(reply, PCMK_XA_STATUS, &status);
if (status != CRM_EX_OK) {
pcmk__err("Received error response from based: %s", crm_exit_str(status));
return true;
}

return false;
}

static int
cib_remote_perform_op(cib_t *cib, const char *op, const char *host,
const char *section, xmlNode *data,
Expand Down Expand Up @@ -151,11 +165,22 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host,
if (rc == ENOTCONN) {
pcmk__err("Disconnected while waiting for reply");
return -ENOTCONN;
} else if (op_reply == NULL) {
}

if (op_reply == NULL) {
pcmk__err("No reply message - empty");
return -ENOMSG;
}

/* The only reason we can receive an ACK here is if dispatch_common ->
* pcmk__client_data2xml processed something that's not valid XML.
* dispatch_common does not return ACK, unlike other daemons.
*/
if (pcmk__xe_is(op_reply, PCMK__XE_ACK) && ack_is_failure(op_reply)) {
pcmk__xml_free(op_reply);
return -EPROTO;
}

pcmk__trace("Synchronous reply received");

/* Start processing the reply... */
Expand Down Expand Up @@ -432,6 +457,15 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel)
goto done;
}

/* The only reason we can receive an ACK here is if dispatch_common ->
* pcmk__client_data2xml processed something that's not valid XML.
* dispatch_common does not return ACK, unlike other daemons.
*/
if (pcmk__xe_is(answer, PCMK__XE_ACK) && ack_is_failure(answer)) {
rc = -EPROTO;
goto done;
}

pcmk__log_xml_trace(answer, "reg-reply");

/* grab the token */
Expand Down
Loading