Skip to content

Commit 2703cdb

Browse files
committed
EH: CS-1175 allow backslash in user names
1 parent 04c065f commit 2703cdb

File tree

11 files changed

+107
-50
lines changed

11 files changed

+107
-50
lines changed

source/clients/qhost/ocs_qhost_print.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,11 +1004,17 @@ get_all_lists(lList **answer_list, lList **queue_l, lList **job_l, lList **centr
10041004
/* lWriteListTo(user_list, stdout); */
10051005

10061006
for_each_rw(ep, user_list) {
1007-
nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, lGetString(ep, ST_name));
1008-
if (!jw)
1007+
const char *user_name = lGetString(ep, ST_name);
1008+
if (sge_is_pattern(user_name)) {
1009+
nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, user_name);
1010+
} else {
1011+
nw = lWhere("%T(%I == %s)", JB_Type, JB_owner, user_name);
1012+
}
1013+
if (!jw) {
10091014
jw = nw;
1010-
else
1015+
} else {
10111016
jw = lOrWhere(jw, nw);
1017+
}
10121018
}
10131019
/* printf("-------------------------------------\n"); */
10141020
/* lWriteWhereTo(jw, stdout); */

source/clients/qquota/ocs_qquota_print.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "uti/sge_bootstrap.h"
4141
#include "uti/sge_hostname.h"
4242
#include "uti/sge_rmon_macros.h"
43+
#include "uti/sge_string.h"
4344

4445
#include "sched/sort_hosts.h"
4546
#include "sched/sge_select_queue.h"
@@ -246,9 +247,16 @@ bool qquota_output(lList *host_list, lList *resource_match_list, lList *user_lis
246247
}
247248
}
248249
} else {
249-
if ((strcmp(user, "-") != 0) && (strcmp(qquota_filter.user, "*") != 0)
250-
&& (fnmatch(qquota_filter.user, user, 0) != 0)) {
251-
continue;
250+
if (strcmp(user, "-") != 0 && strcmp(qquota_filter.user, "*") != 0) {
251+
if (sge_is_pattern(qquota_filter.user)) {
252+
if (fnmatch(qquota_filter.user, user, 0) != 0) {
253+
continue;
254+
}
255+
} else {
256+
if (strcmp(qquota_filter.user, user) != 0) {
257+
continue;
258+
}
259+
}
252260
}
253261
}
254262

source/clients/qstat/ocs_qstat_filter.cc

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "uti/sge_parse_num_par.h"
4444
#include "uti/sge_rmon_macros.h"
4545
#include "uti/sge_stdlib.h"
46+
#include "uti/sge_string.h"
4647
#include "uti/sge_time.h"
4748

4849
#include "cull/cull_sort.h"
@@ -518,11 +519,11 @@ static int qstat_handle_running_jobs(qstat_env_t *qstat_env, qstat_handler_t *ha
518519
for_each_rw(qep, qstat_env->queue_list) {
519520

520521
const char* queue_name = lGetString(qep, QU_full_name);
521-
522+
522523
/* here we have the queue */
523524
if (lGetUlong(qep, QU_tag) & TAG_SHOW_IT) {
524-
525-
525+
526+
526527
if ((qstat_env->full_listing & QSTAT_DISPLAY_NOEMPTYQ) &&
527528
!qinstance_slots_used(qep)) {
528529
continue;
@@ -670,7 +671,7 @@ static int handle_jobs_queue(lListElem *qep, qstat_env_t* qstat_env, int print_j
670671
}
671672
}
672673

673-
if (!lGetNumberOfElem(qstat_env->user_list) ||
674+
if (!lGetNumberOfElem(qstat_env->user_list) ||
674675
(lGetNumberOfElem(qstat_env->user_list) && (lGetUlong(jatep, JAT_suitable)&TAG_SELECT_IT))) {
675676
if (print_jobs_of_queue && (job_tag & TAG_SHOW_IT)) {
676677
if ((qstat_env->full_listing & QSTAT_DISPLAY_RUNNING) &&
@@ -696,7 +697,7 @@ static int handle_jobs_queue(lListElem *qep, qstat_env_t* qstat_env, int print_j
696697
print_it = true;
697698
} else {
698699
print_it = false;
699-
}
700+
}
700701
if (print_it) {
701702
sge_dstring_sprintf(&dyn_task_str, sge_uu32, jataskid);
702703
ret = sge_handle_job(jlep, jatep, qep, gdilep, print_jobid, (master && different && (i==0))?"MASTER":"SLAVE",
@@ -733,7 +734,7 @@ static int filter_jobs(qstat_env_t *qstat_env, lList **alpp) {
733734

734735
DENTER(TOP_LAYER);
735736

736-
/*
737+
/*
737738
** all jobs are selected
738739
*/
739740
for_each_rw (jep, qstat_env->job_list) {
@@ -750,17 +751,26 @@ static int filter_jobs(qstat_env_t *qstat_env, lList **alpp) {
750751
DPRINTF("------- selecting jobs -----------\n");
751752

752753
/* ok, now we untag the jobs if the user_list was specified */
753-
for_each_rw(up, qstat_env->user_list)
754-
for_each_rw (jep, qstat_env->job_list) {
755-
if (up && lGetString(up, ST_name) &&
756-
!fnmatch(lGetString(up, ST_name),
757-
lGetString(jep, JB_owner), 0)) {
758-
for_each_rw(jatep, lGetList(jep, JB_ja_tasks)) {
759-
lSetUlong(jatep, JAT_suitable,
760-
lGetUlong(jatep, JAT_suitable)|TAG_SHOW_IT|TAG_SELECT_IT);
754+
for_each_rw(up, qstat_env->user_list) {
755+
const char *user = lGetString(up, ST_name);
756+
if (user != nullptr) {
757+
bool is_pattern = sge_is_pattern(user);
758+
for_each_rw (jep, qstat_env->job_list) {
759+
int match;
760+
if (is_pattern) {
761+
match = fnmatch(user, lGetString(jep, JB_owner), 0);
762+
} else {
763+
match = sge_strnullcmp(user, lGetString(jep, JB_owner));
764+
}
765+
if (match == 0) {
766+
for_each_rw(jatep, lGetList(jep, JB_ja_tasks)) {
767+
lSetUlong(jatep, JAT_suitable,
768+
lGetUlong(jatep, JAT_suitable)|TAG_SHOW_IT|TAG_SELECT_IT);
769+
}
761770
}
762771
}
763772
}
773+
}
764774
}
765775

766776

@@ -1067,11 +1077,17 @@ static int qstat_env_get_all_lists(qstat_env_t* qstat_env, bool need_job_list, l
10671077
*/
10681078
if (zombie_l && show_zombies) {
10691079
for_each_ep(ep, user_list) {
1070-
nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, lGetString(ep, ST_name));
1071-
if (!zw)
1080+
const char *user_name = lGetString(ep, ST_name);
1081+
if (sge_is_pattern(user_name)) {
1082+
nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, user_name);
1083+
} else {
1084+
nw = lWhere("%T(%I == %s)", JB_Type, JB_owner, user_name);
1085+
}
1086+
if (!zw) {
10721087
zw = nw;
1073-
else
1088+
} else {
10741089
zw = lOrWhere(zw, nw);
1090+
}
10751091
}
10761092

10771093
z_id = gdi_multi.request(alpp, ocs::Mode::RECORD, ocs::gdi::Target::SGE_ZOMBIE_LIST, ocs::gdi::Command::SGE_GDI_GET, ocs::gdi::SubCommand::SGE_GDI_SUB_NONE, nullptr, zw, qstat_get_JB_Type_filter(qstat_env), true);
@@ -2731,7 +2747,12 @@ lCondition *qstat_get_JB_Type_selection(lList *user_list, u_long32 show)
27312747
lCondition *tmp_nw = nullptr;
27322748

27332749
for_each_ep(ep, user_list) {
2734-
tmp_nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, lGetString(ep, ST_name));
2750+
const char *user = lGetString(ep, ST_name);
2751+
if (sge_is_pattern(user)) {
2752+
tmp_nw = lWhere("%T(%I p= %s)", JB_Type, JB_owner, user);
2753+
} else {
2754+
tmp_nw = lWhere("%T(%I == %s)", JB_Type, JB_owner, user);
2755+
}
27352756
if (jw == nullptr) {
27362757
jw = tmp_nw;
27372758
} else {

source/clients/showq/ocs_showq.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
#include <cstdio>
3636
#include <math.h>
37+
#include <sge_string.h>
3738

3839
#include "uti/ocs_TerminationManager.h"
3940
#include "uti/sge_log.h"
@@ -213,7 +214,12 @@ static int showq_show_job_tacc(lList * user_list, int full, const bool binding,
213214
/* if the user_list is empty, display all users' jobs */
214215
if (lGetNumberOfElem(user_list) != 0) {
215216
for_each_ep(j_elem, user_list) {
216-
newcp = lWhere("%T(%I p= %s)", JB_Type, JB_owner, lGetString(j_elem, ST_name));
217+
const char *user_name = lGetString(j_elem, ST_name);
218+
if (sge_is_pattern(user_name)) {
219+
newcp = lWhere("%T(%I p= %s)", JB_Type, JB_owner, user_name);
220+
} else {
221+
newcp = lWhere("%T(%I == %s)", JB_Type, JB_owner, user_name);
222+
}
217223
if (newcp != nullptr) {
218224
if (where == nullptr) {
219225
where = newcp;

source/daemons/qmaster/sge_advance_reservation_qmaster.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,15 +504,23 @@ ar_del(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lListElem *ep, lList **al
504504
const lListElem *user;
505505

506506
for_each_ep(user, user_list) {
507-
if (sge_is_pattern(lGetString(user, ST_name)) && !manop_is_manager(packet, master_manager_list)) {
507+
const char *user_name = lGetString(user, ST_name);
508+
bool is_pattern = sge_is_pattern(user_name);
509+
510+
if (is_pattern && !manop_is_manager(packet, master_manager_list)) {
508511
ERROR(MSG_SGETEXT_MUST_BE_MGR_TO_SS, packet->user, "modify all advance reservations");
509512
answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR);
510513
sge_dstring_free(&buffer);
511514
lFreeWhere(&ar_where);
512515
DRETURN(STATUS_EUNKNOWN);
513516
}
514517

515-
lCondition *new_where = lWhere("%T(%I p= %s)", AR_Type, AR_owner, lGetString(user, ST_name));
518+
lCondition *new_where;
519+
if (is_pattern) {
520+
new_where = lWhere("%T(%I p= %s)", AR_Type, AR_owner, user_name);
521+
} else {
522+
new_where = lWhere("%T(%I == %s)", AR_Type, AR_owner, user_name);
523+
}
516524
if (ar_where == nullptr) {
517525
ar_where = new_where;
518526
} else {
@@ -522,7 +530,7 @@ ar_del(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lListElem *ep, lList **al
522530
} else if (sge_is_pattern(id_str)) {
523531
/* if no userlist and wildcard jobs was requested only delete the own ars */
524532
lCondition *new_where = nullptr;
525-
new_where = lWhere("%T(%I p= %s)", AR_Type, AR_owner, packet->user);
533+
new_where = lWhere("%T(%I == %s)", AR_Type, AR_owner, packet->user);
526534
if (ar_where == nullptr) {
527535
ar_where = new_where;
528536
} else {

source/daemons/qmaster/sge_job_qmaster.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -817,9 +817,12 @@ job_list_filter(lList *user_list, const char *jobid, lCondition **job_filter) {
817817

818818
DPRINTF("Add all users given in userlist to filter\n");
819819
for_each_ep(user, user_list) {
820-
821-
new_where = lWhere("%T(%I p= %s)", JB_Type, JB_owner,
822-
lGetString(user, ST_name));
820+
const char *user_name = lGetString(user, ST_name);
821+
if (sge_is_pattern(user_name)) {
822+
new_where = lWhere("%T(%I p= %s)", JB_Type, JB_owner, user_name);
823+
} else {
824+
new_where = lWhere("%T(%I == %s)", JB_Type, JB_owner, user_name);
825+
}
823826
if (!*job_filter) {
824827
*job_filter = new_where;
825828
} else {

source/daemons/qmaster/sge_userprj_qmaster.cc

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ userprj_mod(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lList **alpp, lListE
8080
const char *rhost, gdi_object_t *object,
8181
ocs::gdi::Command::Cmd cmd, ocs::gdi::SubCommand::SubCmd sub_command,
8282
monitoring_t *monitor) {
83-
int user_flag = (object->target == ocs::gdi::Target::TargetValue::SGE_UU_LIST) ? 1 : 0;
83+
bool user_flag = (object->target == ocs::gdi::Target::TargetValue::SGE_UU_LIST);
8484
int pos;
8585
const char *userprj;
8686
u_long32 uval;
@@ -97,17 +97,7 @@ userprj_mod(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lList **alpp, lListE
9797

9898
DENTER(TOP_LAYER);
9999

100-
if (user_flag == 0) {
101-
// project
102-
obj_name = MSG_OBJ_PRJ;
103-
obj_key = PR_name;
104-
obj_oticket = PR_oticket;
105-
obj_fshare = PR_fshare;
106-
obj_usage = PR_usage;
107-
obj_version = PR_version;
108-
obj_project = PR_project;
109-
obj_master_list = *ocs::DataStore::get_master_list(SGE_TYPE_PROJECT);
110-
} else {
100+
if (user_flag) {
111101
// user
112102
obj_name = MSG_OBJ_USER;
113103
obj_key = UU_name;
@@ -117,6 +107,16 @@ userprj_mod(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lList **alpp, lListE
117107
obj_version = UU_version;
118108
obj_project = UU_project;
119109
obj_master_list = *ocs::DataStore::get_master_list(SGE_TYPE_USER);
110+
} else {
111+
// project
112+
obj_name = MSG_OBJ_PRJ;
113+
obj_key = PR_name;
114+
obj_oticket = PR_oticket;
115+
obj_fshare = PR_fshare;
116+
obj_usage = PR_usage;
117+
obj_version = PR_version;
118+
obj_project = PR_project;
119+
obj_master_list = *ocs::DataStore::get_master_list(SGE_TYPE_PROJECT);
120120
}
121121

122122
/* ---- UP_name */
@@ -133,7 +133,8 @@ userprj_mod(ocs::gdi::Packet *packet, ocs::gdi::Task *task, lList **alpp, lListE
133133
answer_list_add(alpp, SGE_EVENT, STATUS_EEXIST, ANSWER_QUALITY_ERROR);
134134
goto Error;
135135
}
136-
if (verify_str_key(alpp, userprj, MAX_VERIFY_STRING, obj_name, KEY_TABLE) != STATUS_OK) {
136+
if (verify_str_key(alpp, userprj, MAX_VERIFY_STRING, obj_name, KEY_TABLE,
137+
user_flag ? "\\" : nullptr) != STATUS_OK) {
137138
goto Error;
138139
}
139140
lSetString(modp, obj_key, userprj);

source/libs/cull/cull_db.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ lList *lSelectDPack(const char *name, const lList *slp, const lCondition *cp,
827827
const lDescr *dp, const lEnumeration *enp, bool isHash, sge_pack_buffer *pb) {
828828

829829
lListElem *ep, *new_ep;
830-
lList *dlp = (lList *) nullptr;
830+
lList *dlp = nullptr;
831831
const lDescr *descr = nullptr;
832832

833833
DENTER(CULL_LAYER);

source/libs/cull/cull_where.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1153,7 +1153,7 @@ void lFreeWhere(lCondition **cp) {
11531153
*
11541154
* RESULT
11551155
* int - result
1156-
* 0 - flase
1156+
* 0 - false
11571157
* 1 - true
11581158
******************************************************************************/
11591159
int lCompare(const lListElem *ep, const lCondition *cp) {

source/libs/sgeobj/sge_utility.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@
109109
* SEE ALSO
110110
* There is a module test (test_sge_utility) for verify_str_key().
111111
*******************************************************************************/
112-
an_status_t verify_str_key(
113-
lList **alpp, const char *str, size_t str_length, const char *name, int table)
114-
{
112+
an_status_t
113+
verify_str_key(lList **alpp, const char *str, size_t str_length, const char *name, int table,
114+
const char *exceptions) {
115115
static const char *begin_strings[2][3];
116116
static const char *mid_strings[2][20];
117117

@@ -208,6 +208,9 @@ an_status_t verify_str_key(
208208
/* check all characters in str */
209209
i = -1;
210210
while ((forbidden_char = mid_characters[table][++i])) {
211+
if (exceptions != nullptr && strchr(exceptions, forbidden_char) != nullptr) {
212+
continue;
213+
}
211214
if (strchr(str, forbidden_char)) {
212215
if (isprint((int) forbidden_char)) {
213216
snprintf(SGE_EVENT, SGE_EVENT_SIZE, MSG_GDI_KEYSTR_MIDCHAR_SC, mid_strings[table][i], mid_characters[table][i]);

source/libs/sgeobj/sge_utility.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ typedef enum sge_thread_state_transitions_t_ {
6060
#define KEY_TABLE (1)
6161
#define QSUB_TABLE (2)
6262
an_status_t
63-
verify_str_key(lList **alpp, const char *str, size_t str_length, const char *name, int table);
63+
verify_str_key(lList **alpp, const char *str, size_t str_length, const char *name, int table,
64+
const char *exceptions = nullptr);
6465

6566
bool verify_host_name(lList **answer_list, const char *host_name);
6667

0 commit comments

Comments
 (0)