diff --git a/src/shared/varlink-org.varlink.service.c b/src/shared/varlink-org.varlink.service.c index 52ba99dd2b..36dc68fd26 100644 --- a/src/shared/varlink-org.varlink.service.c +++ b/src/shared/varlink-org.varlink.service.c @@ -32,6 +32,8 @@ static VARLINK_DEFINE_ERROR( static VARLINK_DEFINE_ERROR(PermissionDenied); +static VARLINK_DEFINE_ERROR(ExpectedMore); + /* As per https://varlink.org/Service */ VARLINK_DEFINE_INTERFACE( org_varlink_service, @@ -42,4 +44,5 @@ VARLINK_DEFINE_INTERFACE( &vl_error_MethodNotFound, &vl_error_MethodNotImplemented, &vl_error_InvalidParameter, - &vl_error_PermissionDenied); + &vl_error_PermissionDenied, + &vl_error_ExpectedMore); diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 121de882bb..8eeac4a49f 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -2275,6 +2275,12 @@ int varlink_notify(Varlink *v, JsonVariant *parameters) { if (v->state == VARLINK_DISCONNECTED) return varlink_log_errno(v, SYNTHETIC_ERRNO(ENOTCONN), "Not connected."); + + /* If we want to reply with a notify connection but the caller didn't set "more", then return an + * error indicating that we expected to be called with "more" set */ + if (IN_SET(v->state, VARLINK_PROCESSING_METHOD, VARLINK_PENDING_METHOD)) + return varlink_error(v, VARLINK_ERROR_EXPECTED_MORE, NULL); + if (!IN_SET(v->state, VARLINK_PROCESSING_METHOD_MORE, VARLINK_PENDING_METHOD_MORE)) return varlink_log_errno(v, SYNTHETIC_ERRNO(EBUSY), "Connection busy."); diff --git a/src/shared/varlink.h b/src/shared/varlink.h index 5fe529c853..e5541d3ce5 100644 --- a/src/shared/varlink.h +++ b/src/shared/varlink.h @@ -214,3 +214,4 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(VarlinkServer *, varlink_server_unref); /* These are errors we came up with and squatted the namespace with */ #define VARLINK_ERROR_PERMISSION_DENIED "org.varlink.service.PermissionDenied" +#define VARLINK_ERROR_EXPECTED_MORE "org.varlink.service.ExpectedMore"