diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index 4e1bcaa72559609ffe3ef463a3d9af63f5950013..2637f6e05502b3ccfdab8948d9b611acff23d6e9 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -1464,6 +1464,7 @@ extern int job_signal(uint32_t job_id, uint16_t signal, uint16_t batch_flag, { struct job_record *job_ptr; time_t now = time(NULL); + bool super_user; job_ptr = find_job_record(job_id); if (job_ptr == NULL) { @@ -1471,11 +1472,18 @@ extern int job_signal(uint32_t job_id, uint16_t signal, uint16_t batch_flag, return ESLURM_INVALID_JOB_ID; } - if ((job_ptr->user_id != uid) && (uid != 0) && (uid != getuid())) { + super_user = ((uid == 0) || (uid == getuid())); + if ((job_ptr->user_id != uid) && (!super_user)) { error("Security violation, JOB_CANCEL RPC from uid %d", uid); return ESLURM_USER_ID_MISSING; } + if ((!super_user) && job_ptr->part_ptr + && (job_ptr->part_ptr->root_only)) { + info("Attempt to cancel job in RootOnly partition from uid %d", + uid); + return ESLURM_USER_ID_MISSING; + } if (IS_JOB_FINISHED(job_ptr)) return ESLURM_ALREADY_DONE;