Skip to content

Commit ef8e4d6

Browse files
committed
Use the older patch and add the fix
1 parent f6e87ac commit ef8e4d6

File tree

3 files changed

+57
-121
lines changed

3 files changed

+57
-121
lines changed

src/tacacs/nss/patch/0001-Modify-user-map-profile.patch

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
From 43096cf9813d6def1d1f8f1d8a0c122466c8c06b Mon Sep 17 00:00:00 2001
2-
From: Liuqu <chenchen.qcc@alibaba-inc.com>
3-
Date: Mon, 9 Oct 2017 02:44:37 -0700
4-
Subject: [PATCH] Modify user map profile
1+
From 93f39fa62f3f9dc54012ab8668fe48a4b313c7a0 Mon Sep 17 00:00:00 2001
2+
From: "david.zagury" <davidza@nvidia.com>
3+
Date: Tue, 13 May 2025 19:25:09 +0300
4+
Subject: [PATCH] [PATCH] Modify user map profile
55

66
* Removed dependence from libtacplus_map and libaudit
77
* Removed NSS entry point for getpwuid()
@@ -18,9 +18,9 @@ Subject: [PATCH] Modify user map profile
1818
debian/changelog | 11 +
1919
debian/control | 11 +-
2020
debian/libnss-tacplus.symbols | 1 -
21-
nss_tacplus.c | 1015 +++++++++++++++------------------
21+
nss_tacplus.c | 1022 +++++++++++++++------------------
2222
tacplus_nss.conf | 91 ++-
23-
8 files changed, 525 insertions(+), 612 deletions(-)
23+
8 files changed, 532 insertions(+), 612 deletions(-)
2424

2525
diff --git a/Makefile.am b/Makefile.am
2626
index 293951e..b33c455 100644
@@ -124,7 +124,7 @@ index 2bf9b88..f476e7d 100644
124124
_nss_tacplus_getpwnam_r@Base 1.0.1
125125
- _nss_tacplus_getpwuid_r@Base 1.0.1
126126
diff --git a/nss_tacplus.c b/nss_tacplus.c
127-
index 79e62b9..ecfa0b0 100644
127+
index 79e62b9..ff4f492 100644
128128
--- a/nss_tacplus.c
129129
+++ b/nss_tacplus.c
130130
@@ -1,7 +1,9 @@
@@ -180,7 +180,7 @@ index 79e62b9..ecfa0b0 100644
180180

181181
/*
182182
* pwbuf is used to reduce number of arguments passed around; the strings in
183-
@@ -63,255 +59,245 @@ struct pwbuf {
183+
@@ -63,255 +59,244 @@ struct pwbuf {
184184
typedef struct {
185185
struct addrinfo *addr;
186186
char *key;
@@ -437,8 +437,11 @@ index 79e62b9..ecfa0b0 100644
437437
+ syslog(LOG_ERR, "%s: invalid server: %s (getaddrinfo: %s)",
438438
+ nssname, srv, gai_strerror(rv));
439439
+ return -1;
440-
+ }
441-
+ }
440+
}
441+
}
442+
- else {
443+
- syslog(LOG_WARNING, "%s: maximum number of servers (%d) "
444+
- "exceeded, skipping", nssname, TAC_PLUS_MAXSERVERS);
442445
+ else if(!strncmp(token, "secret=", 7)) {
443446
+ if(tac_srv[tac_srv_no].key)
444447
+ free(tac_srv[tac_srv_no].key);
@@ -458,11 +461,15 @@ index 79e62b9..ecfa0b0 100644
458461
+ * for a long time*/
459462
+ if(tac_srv[tac_srv_no].timeout > 5)
460463
+ tac_srv[tac_srv_no].timeout = 5;
461-
+ }
462-
+ }
464+
}
465+
}
466+
- else if(debug) /* ignore unrecognized lines, unless debug on */
467+
- syslog(LOG_WARNING, "%s: unrecognized parameter: %s",
468+
- nssname, lbuf);
463469
+ token = strsep(&srv_buf, delim);
464-
+ }
465-
+
470+
}
471+
- fclose(conf);
472+
466473
+ return 0;
467474
+}
468475
+
@@ -486,11 +493,8 @@ index 79e62b9..ecfa0b0 100644
486493
+ priv = 0;
487494
+ syslog(LOG_WARNING, "%s: user_priv %d out of range",
488495
+ nssname, priv);
489-
}
490-
}
491-
- else {
492-
- syslog(LOG_WARNING, "%s: maximum number of servers (%d) "
493-
- "exceeded, skipping", nssname, TAC_PLUS_MAXSERVERS);
496+
+ }
497+
+ }
494498
+ else if(!strncmp(token, "pw_info=", 8)) {
495499
+ if(!info)
496500
+ info = strdup(token + 8);
@@ -505,15 +509,11 @@ index 79e62b9..ecfa0b0 100644
505509
+ else if(!strncmp(token, "shell=", 6)) {
506510
+ if(!shell)
507511
+ shell = strdup(token + 6);
508-
}
509-
}
510-
- else if(debug) /* ignore unrecognized lines, unless debug on */
511-
- syslog(LOG_WARNING, "%s: unrecognized parameter: %s",
512-
- nssname, lbuf);
512+
+ }
513+
+ }
513514
+ token = strsep(&buf, delim);
514-
}
515-
- fclose(conf);
516-
515+
+ }
516+
+
517517
+ if(priv && gid && info && group && shell) {
518518
+ useradd_info_t *user = &useradd_grp_list[priv];
519519
+ if(user->info)
@@ -588,7 +588,6 @@ index 79e62b9..ecfa0b0 100644
588588
+ FILE *fp;
589589
+ char buf[512] = {0};
590590
+
591-
+ init_useradd_info();
592591
+ fp = fopen(file, "r");
593592
+ if(!fp) {
594593
+ syslog(LOG_ERR, "%s: %s fopen failed", nssname, file);
@@ -647,7 +646,7 @@ index 79e62b9..ecfa0b0 100644
647646
}
648647

649648
/*
650-
@@ -324,15 +304,13 @@ static void print_servers(void)
649+
@@ -324,15 +309,13 @@ static void print_servers(void)
651650
*/
652651
static int
653652
pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
@@ -667,7 +666,7 @@ index 79e62b9..ecfa0b0 100644
667666

668667
needlen = usename ? strlen(usename) + 1 : 1 +
669668
srcpw->pw_dir ? strlen(srcpw->pw_dir) + 1 : 1 +
670-
@@ -341,8 +319,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
669+
@@ -341,8 +324,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
671670
srcpw->pw_passwd ? strlen(srcpw->pw_passwd) + 1 : 1;
672671
if(needlen > len) {
673672
if(debug)
@@ -678,7 +677,7 @@ index 79e62b9..ecfa0b0 100644
678677
return 1;
679678
}
680679

681-
@@ -354,21 +332,14 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
680+
@@ -354,21 +337,14 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
682681
cnt++; /* allow for null byte also */
683682
buf += cnt;
684683
len -= cnt;
@@ -702,7 +701,7 @@ index 79e62b9..ecfa0b0 100644
702701
cnt++;
703702
buf += cnt;
704703
len -= cnt;
705-
@@ -377,148 +348,227 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
704+
@@ -377,148 +353,227 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,
706705
cnt++;
707706
buf += cnt;
708707
len -= cnt;
@@ -875,8 +874,7 @@ index 79e62b9..ecfa0b0 100644
875874
+ syslog(LOG_ERR, "%s: %s fopen failed", nssname, user_conf);
876875
+ return -1;
877876
+ }
878-
879-
- if(!tacuser) {
877+
+
880878
+ while(fgets(buf, sizeof buf, fp)) {
881879
+ if('#' == *buf || isspace(*buf))
882880
+ continue;
@@ -888,7 +886,8 @@ index 79e62b9..ecfa0b0 100644
888886
+ break;
889887
+ }
890888
+ }
891-
+
889+
890+
- if(!tacuser) {
892891
+ /*
893892
+ * If user is found in user_conf, it means that getpwnam is called by
894893
+ * useradd in this NSS module.
@@ -911,7 +910,7 @@ index 79e62b9..ecfa0b0 100644
911910
+ syslog(LOG_ERR, "%s: %s write local user failed", nssname, name);
912911
+ fclose(fp);
913912
+ return -1;
914-
+ }
913+
}
915914
+ fclose(fp);
916915
+
917916
+ lvl = level;
@@ -937,7 +936,13 @@ index 79e62b9..ecfa0b0 100644
937936
+
938937
+ return -1;
939938
+}
940-
+
939+
940+
- pb->pw->pw_name = NULL; /* be paranoid */
941+
- for(ret = 1; ret && (ent = fgetpwent(pwfile)); ) {
942+
- if(!ent->pw_name)
943+
- continue; /* shouldn't happen */
944+
- if(!strcmp(ent->pw_name, tacuser)) {
945+
- ret = pwcopy(pb->buf, pb->buflen, ent, pb->pw, logname, usetachome);
941946
+/*
942947
+ * Lookup user in /etc/passwd, and fill up passwd info if found.
943948
+ */
@@ -950,14 +955,8 @@ index 79e62b9..ecfa0b0 100644
950955
+ if(!username) {
951956
+ syslog(LOG_ERR, "%s: username invalid in check passwd", nssname);
952957
+ return -1;
953-
}
954-
955-
- pb->pw->pw_name = NULL; /* be paranoid */
956-
- for(ret = 1; ret && (ent = fgetpwent(pwfile)); ) {
957-
- if(!ent->pw_name)
958-
- continue; /* shouldn't happen */
959-
- if(!strcmp(ent->pw_name, tacuser)) {
960-
- ret = pwcopy(pb->buf, pb->buflen, ent, pb->pw, logname, usetachome);
958+
+ }
959+
+
961960
+ fp = fopen("/etc/passwd", "r");
962961
+ if(!fp) {
963962
+ syslog(LOG_ERR, "%s: /etc/passwd fopen failed", nssname);
@@ -1041,15 +1040,15 @@ index 79e62b9..ecfa0b0 100644
10411040

10421041
return ret;
10431042
}
1044-
@@ -532,6 +582,7 @@ static int
1043+
@@ -532,6 +587,7 @@ static int
10451044
got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
10461045
{
10471046
unsigned long priv_level = 0;
10481047
+ int ret;
10491048

10501049
while(attr != NULL) {
10511050
/* we are looking for the privilege attribute, can be in several forms,
1052-
@@ -550,14 +601,20 @@ got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
1051+
@@ -550,14 +606,20 @@ got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb)
10531052
/* if this fails, we leave priv_level at 0, which is
10541053
* least privileged, so that's OK, but at least report it
10551054
*/
@@ -1074,7 +1073,7 @@ index 79e62b9..ecfa0b0 100644
10741073
}
10751074

10761075
/*
1077-
@@ -570,9 +627,13 @@ connect_tacacs(struct tac_attrib **attr, int srvr)
1076+
@@ -570,9 +632,13 @@ connect_tacacs(struct tac_attrib **attr, int srvr)
10781077
{
10791078
int fd;
10801079

@@ -1089,7 +1088,7 @@ index 79e62b9..ecfa0b0 100644
10891088
tac_add_attrib(attr, "service", tac_service);
10901089
if(tac_protocol[0])
10911090
tac_add_attrib(attr, "protocol", tac_protocol);
1092-
@@ -598,52 +659,25 @@ lookup_tacacs_user(struct pwbuf *pb)
1091+
@@ -598,52 +664,25 @@ lookup_tacacs_user(struct pwbuf *pb)
10931092
{
10941093
struct areply arep;
10951094
int ret = 1, done = 0;
@@ -1149,7 +1148,7 @@ index 79e62b9..ecfa0b0 100644
11491148
tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", ret,
11501149
pb->name);
11511150
}
1152-
@@ -668,14 +702,11 @@ lookup_tacacs_user(struct pwbuf *pb)
1151+
@@ -668,14 +707,11 @@ lookup_tacacs_user(struct pwbuf *pb)
11531152
if(arep.status == AUTHOR_STATUS_PASS_ADD ||
11541153
arep.status == AUTHOR_STATUS_PASS_REPL) {
11551154
ret = got_tacacs_user(arep.attr, pb);
@@ -1166,7 +1165,7 @@ index 79e62b9..ecfa0b0 100644
11661165
done = 1; /* break out of loop after arep cleanup */
11671166
}
11681167
else {
1169-
@@ -685,6 +716,10 @@ lookup_tacacs_user(struct pwbuf *pb)
1168+
@@ -685,6 +721,10 @@ lookup_tacacs_user(struct pwbuf *pb)
11701169
" invalid (%d)", nssname,
11711170
tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name,
11721171
arep.status);
@@ -1177,7 +1176,7 @@ index 79e62b9..ecfa0b0 100644
11771176
}
11781177
if(arep.msg)
11791178
free(arep.msg);
1180-
@@ -692,30 +727,12 @@ lookup_tacacs_user(struct pwbuf *pb)
1179+
@@ -692,30 +732,12 @@ lookup_tacacs_user(struct pwbuf *pb)
11811180
tac_free_attrib(&arep.attr);
11821181
}
11831182

@@ -1210,7 +1209,7 @@ index 79e62b9..ecfa0b0 100644
12101209
*
12111210
* We try the lookup to the tacacs server first. If we can't make a
12121211
* connection to the server for some reason, we also try looking up
1213-
@@ -730,20 +747,25 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
1212+
@@ -730,20 +752,26 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
12141213
int result;
12151214
struct pwbuf pbuf;
12161215

@@ -1225,6 +1224,7 @@ index 79e62b9..ecfa0b0 100644
12251224
+ return NSS_STATUS_NOTFOUND;
12261225

12271226
- get_remote_addr();
1227+
+ init_useradd_info();
12281228
+ result = parse_config(config_file);
12291229

12301230
- if(result) { /* no config file, no servers, etc. */
@@ -1245,7 +1245,7 @@ index 79e62b9..ecfa0b0 100644
12451245
/* marshal the args for the lower level functions */
12461246
pbuf.name = (char *)name;
12471247
pbuf.pw = pw;
1248-
@@ -751,126 +773,13 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
1248+
@@ -751,126 +779,14 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,
12491249
pbuf.buflen = buflen;
12501250
pbuf.errnop = errnop;
12511251

@@ -1346,6 +1346,7 @@ index 79e62b9..ecfa0b0 100644
13461346
- else if((auid != (uid_t)-1 || session != ~0U) &&
13471347
- !lookup_mapped_uid(&pb, uid, (uid_t)-1, ~0))
13481348
- status = NSS_STATUS_SUCCESS;
1349+
+ free_useradd_info();
13491350
return status;
13501351
}
13511352
-
@@ -1479,4 +1480,5 @@ index bb4eb1e..7cb756f 100644
14791480
+# Default: many_to_one=n
14801481
+# many_to_one=y
14811482
--
1482-
2.7.4
1483+
2.49.0
1484+

src/tacacs/nss/patch/0013-Partial-memleak-fix-due-to-unfreed-strdup.patch

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/tacacs/nss/patch/series

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,3 @@
1010
0010-Send-remote-address-in-TACACS-authorization-message.patch
1111
0011-Replace-popen-shell-execution-with-safer-execle.patch
1212
0012-fix-compile-error-conditionals.patch
13-
0013-Partial-memleak-fix-due-to-unfreed-strdup.patch

0 commit comments

Comments
 (0)