diff --git a/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch b/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch index c6b84ba..51fdb6f 100644 --- a/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch +++ b/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch @@ -466,3 +466,132 @@ diff -up nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c.orig nfs-utils-2.3.3/utils/n return ret; } +diff -up nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c +--- nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig 2019-11-11 08:49:06.044870974 -0500 ++++ nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c 2019-11-11 09:19:10.391896845 -0500 +@@ -486,6 +486,9 @@ out: + if (gss_methods) + conf_free_list(gss_methods); + ++ if (nfs4_methods) ++ conf_free_list(nfs4_methods); ++ + return ret ? -ENOENT: 0; + } + +diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c +--- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig 2019-11-11 08:49:06.045870979 -0500 ++++ nfs-utils-2.3.3/utils/gssd/krb5_util.c 2019-11-11 09:19:10.393896856 -0500 +@@ -911,6 +911,8 @@ find_keytab_entry(krb5_context context, + k5err = gssd_k5_err_msg(context, code); + printerr(3, "%s while getting keytab entry for '%s'\n", + k5err, spn); ++ free(k5err); ++ k5err = NULL; + /* + * We tried the active directory machine account + * with the hostname part as-is and failed... +@@ -1013,6 +1015,8 @@ query_krb5_ccache(const char* cred_cache + char *str = NULL; + char *princstring; + ++ *ret_princname = *ret_realm = NULL; ++ + ret = krb5_init_context(&context); + if (ret) + return 0; +@@ -1047,7 +1051,7 @@ err_princ: + krb5_cc_close(context, ccache); + err_cache: + krb5_free_context(context); +- return found; ++ return (*ret_princname && *ret_realm); + } + + /*==========================*/ +@@ -1230,6 +1234,8 @@ gssd_destroy_krb5_machine_creds(void) + k5err = gssd_k5_err_msg(context, code); + printerr(0, "WARNING: %s while destroying credential " + "cache '%s'\n", k5err, ple->ccname); ++ free(k5err); ++ k5err = NULL; + } + } + krb5_free_context(context); +diff -up nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig nfs-utils-2.3.3/utils/idmapd/idmapd.c +--- nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig 2019-11-11 08:49:06.029870889 -0500 ++++ nfs-utils-2.3.3/utils/idmapd/idmapd.c 2019-11-11 09:19:10.393896856 -0500 +@@ -517,14 +517,16 @@ static void + clntscancb(int UNUSED(fd), short UNUSED(which), void *data) + { + struct idmap_clientq *icq = data; +- struct idmap_client *ic; ++ struct idmap_client *ic, *ic_next; + +- TAILQ_FOREACH(ic, icq, ic_next) ++ for (ic = TAILQ_FIRST(icq); ic != NULL; ic = ic_next) { ++ ic_next = TAILQ_NEXT(ic, ic_next); + if (ic->ic_fd == -1 && nfsopen(ic) == -1) { + close(ic->ic_dirfd); + TAILQ_REMOVE(icq, ic, ic_next); + free(ic); + } ++ } + } + + static void +diff -up nfs-utils-2.3.3/utils/statd/monitor.c.orig nfs-utils-2.3.3/utils/statd/monitor.c +--- nfs-utils-2.3.3/utils/statd/monitor.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/statd/monitor.c 2019-11-11 09:19:10.393896856 -0500 +@@ -66,7 +66,7 @@ sm_mon_1_svc(struct mon *argp, struct sv + *my_name = argp->mon_id.my_id.my_name; + struct my_id *id = &argp->mon_id.my_id; + char *cp; +- notify_list *clnt; ++ notify_list *clnt = NULL; + struct sockaddr_in my_addr = { + .sin_family = AF_INET, + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), +@@ -223,6 +224,7 @@ sm_mon_1_svc(struct mon *argp, struct sv + + failure: + xlog_warn("STAT_FAIL to %s for SM_MON of %s", my_name, mon_name); ++ free(clnt); + return (&result); + } + +@@ -242,6 +244,7 @@ load_one_host(const char *hostname, + clnt->dns_name = strdup(hostname); + if (clnt->dns_name == NULL) { + nlist_free(NULL, clnt); ++ free(clnt); + return 0; + } + +diff -up nfs-utils-2.3.3/utils/statd/notlist.c.orig nfs-utils-2.3.3/utils/statd/notlist.c +--- nfs-utils-2.3.3/utils/statd/notlist.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/statd/notlist.c 2019-11-11 09:19:10.394896861 -0500 +@@ -210,7 +210,6 @@ nlist_free(notify_list **head, notify_li + if (NL_MON_NAME(entry)) + free(NL_MON_NAME(entry)); + free(entry->dns_name); +- free(entry); + } + + /* +@@ -219,8 +218,14 @@ nlist_free(notify_list **head, notify_li + void + nlist_kill(notify_list **head) + { +- while (*head) ++ notify_list *next; ++ ++ while (*head) { ++ next = (*head)->next; + nlist_free(head, *head); ++ free(*head); ++ *head = next; ++ } + } + + /* diff --git a/SOURCES/nfs-utils-2.3.3-covscan-rm-deadcode-leaks.patch b/SOURCES/nfs-utils-2.3.3-covscan-rm-deadcode-leaks.patch new file mode 100644 index 0000000..b109f97 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-covscan-rm-deadcode-leaks.patch @@ -0,0 +1,27 @@ +From c9305f75070abe76155d6db29889bf5dead218c2 Mon Sep 17 00:00:00 2001 +From: Steve Dickson +Date: Fri, 7 Feb 2020 10:18:21 -0500 +Subject: [PATCH] query_krb5_ccache: Removed dead code that was flagged by a + covscan + +Signed-off-by: Steve Dickson +--- + utils/gssd/krb5_util.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/utils/gssd/krb5_util.c b/utils/gssd/krb5_util.c +index bff759f..a1c43d2 100644 +--- a/utils/gssd/krb5_util.c ++++ b/utils/gssd/krb5_util.c +@@ -1066,8 +1066,6 @@ query_krb5_ccache(const char* cred_cache, char **ret_princname, + *ret_realm = strdup(str+1); + } + k5_free_unparsed_name(context, princstring); +- } else { +- found = 0; + } + } + krb5_free_principal(context, principal); +-- +2.24.1 + diff --git a/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch b/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch new file mode 100644 index 0000000..1935daf --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch @@ -0,0 +1,17 @@ +diff -up nfs-utils-2.3.3/utils/gssd/gssd.c.orig nfs-utils-2.3.3/utils/gssd/gssd.c +--- nfs-utils-2.3.3/utils/gssd/gssd.c.orig 2019-11-11 09:23:28.920435729 -0500 ++++ nfs-utils-2.3.3/utils/gssd/gssd.c 2019-11-26 13:59:52.812685585 -0500 +@@ -1020,11 +1020,11 @@ main(int argc, char *argv[]) + "support setting debug levels\n"); + #endif + ++ daemon_init(fg); ++ + if (gssd_check_mechs() != 0) + errx(1, "Problem with gssapi library"); + +- daemon_init(fg); +- + event_init(); + + pipefs_dir = opendir(pipefs_path); diff --git a/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch b/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch new file mode 100644 index 0000000..7624169 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch @@ -0,0 +1,29 @@ +commit 52db5259fe78c2b948df279b697412f99e12f229 +Author: Yongcheng Yang +Date: Fri Aug 23 14:06:42 2019 -0400 + + gssd: add configure options verbosity to man page rpc.gssd(8) + + Signed-off-by: Pierguido Lambri + Signed-off-by: Yongcheng Yang + Signed-off-by: Steve Dickson + +diff --git a/utils/gssd/gssd.man b/utils/gssd/gssd.man +index e620f0d1..cc3a210a 100644 +--- a/utils/gssd/gssd.man ++++ b/utils/gssd/gssd.man +@@ -305,6 +305,14 @@ section of the + .I /etc/nfs.conf + configuration file. Values recognized include: + .TP ++.B verbosity ++Value which is equivalent to the number of ++.BR -v . ++.TP ++.B rpc-verbosity ++Value which is equivalent to the number of ++.BR -r . ++.TP + .B use-memcache + A Boolean flag equivalent to + .BR -M . diff --git a/SOURCES/nfs-utils-2.3.3-gssd-memoryleak.patch b/SOURCES/nfs-utils-2.3.3-gssd-memoryleak.patch new file mode 100644 index 0000000..89764fe --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-memoryleak.patch @@ -0,0 +1,118 @@ +diff --git a/utils/gssd/krb5_util.c b/utils/gssd/krb5_util.c +index eb993aab..26e51edf 100644 +--- a/utils/gssd/krb5_util.c ++++ b/utils/gssd/krb5_util.c +@@ -459,7 +459,7 @@ gssd_get_single_krb5_cred(krb5_context context, + if (ccache) + krb5_cc_close(context, ccache); + krb5_free_cred_contents(context, &my_creds); +- free(k5err); ++ krb5_free_string(context, k5err); + return (code); + } + +@@ -698,7 +698,7 @@ gssd_search_krb5_keytab(krb5_context context, krb5_keytab kt, + "we failed to unparse principal name: %s\n", + k5err); + k5_free_kt_entry(context, kte); +- free(k5err); ++ krb5_free_string(context, k5err); + k5err = NULL; + continue; + } +@@ -745,7 +745,7 @@ gssd_search_krb5_keytab(krb5_context context, krb5_keytab kt, + if (retval < 0) + retval = 0; + out: +- free(k5err); ++ krb5_free_string(context, k5err); + return retval; + } + +@@ -774,7 +774,7 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, + int tried_all = 0, tried_default = 0, tried_upper = 0; + krb5_principal princ; + const char *notsetstr = "not set"; +- char *adhostoverride; ++ char *adhostoverride = NULL; + + + /* Get full target hostname */ +@@ -802,7 +802,6 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, + adhostoverride); + /* No overflow: Windows cannot handle strings longer than 19 chars */ + strcpy(myhostad, adhostoverride); +- free(adhostoverride); + } else { + strcpy(myhostad, myhostname); + for (i = 0; myhostad[i] != 0; ++i) { +@@ -811,6 +810,8 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, + myhostad[i] = '$'; + myhostad[i+1] = 0; + } ++ if (adhostoverride) ++ krb5_free_string(context, adhostoverride); + + if (!srchost) { + retval = get_full_hostname(myhostname, myhostname, sizeof(myhostname)); +@@ -901,7 +902,7 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, + k5err = gssd_k5_err_msg(context, code); + printerr(1, "%s while building principal for '%s'\n", + k5err, spn); +- free(k5err); ++ krb5_free_string(context, k5err); + k5err = NULL; + continue; + } +@@ -911,7 +912,7 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, + k5err = gssd_k5_err_msg(context, code); + printerr(3, "%s while getting keytab entry for '%s'\n", + k5err, spn); +- free(k5err); ++ krb5_free_string(context, k5err); + k5err = NULL; + /* + * We tried the active directory machine account +@@ -960,7 +961,7 @@ out: + k5_free_default_realm(context, default_realm); + if (realmnames) + krb5_free_host_realm(context, realmnames); +- free(k5err); ++ krb5_free_string(context, k5err); + return retval; + } + +@@ -1223,7 +1224,7 @@ gssd_destroy_krb5_machine_creds(void) + printerr(0, "WARNING: %s while resolving credential " + "cache '%s' for destruction\n", k5err, + ple->ccname); +- free(k5err); ++ krb5_free_string(context, k5err); + k5err = NULL; + continue; + } +@@ -1232,13 +1233,13 @@ gssd_destroy_krb5_machine_creds(void) + k5err = gssd_k5_err_msg(context, code); + printerr(0, "WARNING: %s while destroying credential " + "cache '%s'\n", k5err, ple->ccname); +- free(k5err); ++ krb5_free_string(context, k5err); + k5err = NULL; + } + } + krb5_free_context(context); + out: +- free(k5err); ++ krb5_free_string(context, k5err); + } + + /* +@@ -1321,7 +1322,7 @@ out_free_kt: + out_free_context: + krb5_free_context(context); + out: +- free(k5err); ++ krb5_free_string(context, k5err); + return retval; + } + diff --git a/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch b/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch new file mode 100644 index 0000000..334d286 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch @@ -0,0 +1,73 @@ +commit 0240df0e8ccf7be2706a6a10a2a620f8eda55275 +Author: Yongcheng Yang +Date: Thu Sep 5 07:36:26 2019 -0400 + + nfsd: Adjust nfs.conf setting/parsing of rdma port + + The rpc.nfsd program can use option "--rdma" to enable + RDMA on the standard port (nfsrdma/20049) or "--rdma=port" + for an alternate port. + + But now in /etc/nfs.conf, we need to specify the port + number (e.g. rdma=nfsrdma) to enable it, which is not + convenient. + The default setting "rdma=n" may cause more confusion. + + Update to enable RDMA on standard port when setting + boolean YES to "rdma=". And using "rdma-port=" for an + alternate port if necessary. + + Also let previous config (e.g. rdma=nfsrdma) work as well. + + Signed-off-by: Yongcheng Yang + Signed-off-by: Steve Dickson + +diff --git a/nfs.conf b/nfs.conf +index 85097fd..186a5b1 100644 +--- a/nfs.conf ++++ b/nfs.conf +@@ -63,6 +63,7 @@ + # vers4.1=y + # vers4.2=y + # rdma=n ++# rdma-port=20049 + # + [statd] + # debug=0 +diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c +index b256bd9..a412a02 100644 +--- a/utils/nfsd/nfsd.c ++++ b/utils/nfsd/nfsd.c +@@ -92,7 +92,14 @@ main(int argc, char **argv) + port = conf_get_str("nfsd", "port"); + if (!port) + port = "nfs"; +- rdma_port = conf_get_str("nfsd", "rdma"); ++ if (conf_get_bool("nfsd", "rdma", false)) { ++ rdma_port = conf_get_str("nfsd", "rdma-port"); ++ if (!rdma_port) ++ rdma_port = "nfsrdma"; ++ } ++ /* backward compatibility - nfs.conf used to set rdma port directly */ ++ if (!rdma_port) ++ rdma_port = conf_get_str("nfsd", "rdma"); + if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(protobits))) + NFSCTL_UDPSET(protobits); + else +diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man +index d83ef86..2701ba7 100644 +--- a/utils/nfsd/nfsd.man ++++ b/utils/nfsd/nfsd.man +@@ -144,7 +144,11 @@ The lease time for NFSv4, in seconds. + Set the port for TCP/UDP to bind to. + .TP + .B rdma +-Set RDMA port. Use "rdma=nfsrdma" to enable standard port. ++Enable RDMA port (with "on" or "yes" etc) on the standard port ++("nfsrdma", port 20049). ++.TP ++.B rdma-port ++Set an alternate RDMA port. + .TP + .B UDP + Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support. diff --git a/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch b/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch new file mode 100644 index 0000000..5fadb28 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch @@ -0,0 +1,159 @@ +diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py +index 48ef0964..bda9af67 100755 +--- a/tools/mountstats/mountstats.py ++++ b/tools/mountstats/mountstats.py +@@ -308,6 +308,8 @@ class DeviceData: + op = words[0][:-1] + self.__rpc_data['ops'] += [op] + self.__rpc_data[op] = [int(word) for word in words[1:]] ++ if len(self.__rpc_data[op]) < 9: ++ self.__rpc_data[op] += [0] + + def parse_stats(self, lines): + """Turn a list of lines from a mount stat file into a +@@ -475,7 +477,9 @@ class DeviceData: + retrans = stats[2] - count + if retrans != 0: + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ') +- print('\t%d major timeouts' % stats[3]) ++ print('\t%d major timeouts' % stats[3], end='') ++ if len(stats) >= 10 and stats[9] != 0: ++ print('\t%d errors (%d%%)' % (stats[9], ((stats[9] * 100) / count))) + else: + print('') + print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \ +@@ -580,7 +584,7 @@ class DeviceData: + self.__nfs_data['fstype'] = 'nfs4' + self.__rpc_data['ops'] = ops + for op in ops: +- self.__rpc_data[op] = [0 for i in range(8)] ++ self.__rpc_data[op] = [0 for i in range(9)] + + def accumulate_iostats(self, new_stats): + """Accumulate counters from all RPC op buckets in new_stats. This is +@@ -605,6 +609,8 @@ class DeviceData: + queued_for = float(rpc_stats[5]) + rtt = float(rpc_stats[6]) + exe = float(rpc_stats[7]) ++ if len(rpc_stats) >= 9: ++ errs = int(rpc_stats[8]) + + # prevent floating point exceptions + if ops != 0: +@@ -613,12 +619,15 @@ class DeviceData: + rtt_per_op = rtt / ops + exe_per_op = exe / ops + queued_for_per_op = queued_for / ops ++ if len(rpc_stats) >= 9: ++ errs_percent = (errs * 100) / ops + else: + kb_per_op = 0.0 + retrans_percent = 0.0 + rtt_per_op = 0.0 + exe_per_op = 0.0 + queued_for_per_op = 0.0 ++ errs_percent = 0.0 + + op += ':' + print(format(op.lower(), '<16s'), end='') +@@ -628,7 +637,10 @@ class DeviceData: + print(format('retrans', '>16s'), end='') + print(format('avg RTT (ms)', '>16s'), end='') + print(format('avg exe (ms)', '>16s'), end='') +- print(format('avg queue (ms)', '>16s')) ++ print(format('avg queue (ms)', '>16s'), end='') ++ if len(rpc_stats) >= 9: ++ print(format('errors', '>16s'), end='') ++ print() + + print(format((ops / sample_time), '>24.3f'), end='') + print(format((kilobytes / sample_time), '>16.3f'), end='') +@@ -637,7 +649,11 @@ class DeviceData: + print(format(retransmits, '>16'), end='') + print(format(rtt_per_op, '>16.3f'), end='') + print(format(exe_per_op, '>16.3f'), end='') +- print(format(queued_for_per_op, '>16.3f')) ++ print(format(queued_for_per_op, '>16.3f'), end='') ++ if len(rpc_stats) >= 9: ++ errors = '{0:>10.0f} ({1:>3.1f}%)'.format(errs, errs_percent).strip() ++ print(format(errors, '>16'), end='') ++ print() + + def display_iostats(self, sample_time): + """Display NFS and RPC stats in an iostat-like way +diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py +old mode 100644 +new mode 100755 +index f1556fb7..5b2260ad +--- a/tools/nfs-iostat/nfs-iostat.py ++++ b/tools/nfs-iostat/nfs-iostat.py +@@ -329,6 +329,8 @@ class DeviceData: + queued_for = float(rpc_stats[5]) + rtt = float(rpc_stats[6]) + exe = float(rpc_stats[7]) ++ if len(rpc_stats) >= 9: ++ errs = float(rpc_stats[8]) + + # prevent floating point exceptions + if ops != 0: +@@ -337,12 +339,16 @@ class DeviceData: + rtt_per_op = rtt / ops + exe_per_op = exe / ops + queued_for_per_op = queued_for / ops ++ if len(rpc_stats) >= 9: ++ errs_percent = (errs * 100) / ops + else: + kb_per_op = 0.0 + retrans_percent = 0.0 + rtt_per_op = 0.0 + exe_per_op = 0.0 + queued_for_per_op = 0.0 ++ if len(rpc_stats) >= 9: ++ errs_percent = 0.0 + + op += ':' + print(format(op.lower(), '<16s'), end='') +@@ -352,7 +358,10 @@ class DeviceData: + print(format('retrans', '>16s'), end='') + print(format('avg RTT (ms)', '>16s'), end='') + print(format('avg exe (ms)', '>16s'), end='') +- print(format('avg queue (ms)', '>16s')) ++ print(format('avg queue (ms)', '>16s'), end='') ++ if len(rpc_stats) >= 9: ++ print(format('errors', '>16s'), end='') ++ print() + + print(format((ops / sample_time), '>24.3f'), end='') + print(format((kilobytes / sample_time), '>16.3f'), end='') +@@ -361,7 +370,11 @@ class DeviceData: + print(format(retransmits, '>16'), end='') + print(format(rtt_per_op, '>16.3f'), end='') + print(format(exe_per_op, '>16.3f'), end='') +- print(format(queued_for_per_op, '>16.3f')) ++ print(format(queued_for_per_op, '>16.3f'), end='') ++ if len(rpc_stats) >= 9: ++ errors = '{0:>10.0f} ({1:>3.1f}%)'.format(errs, errs_percent).strip() ++ print(format(errors, '>16'), end='') ++ print() + + def ops(self, sample_time): + sends = float(self.__rpc_data['rpcsends']) +diff --git a/tools/nfs-iostat/nfsiostat.man b/tools/nfs-iostat/nfsiostat.man +index 9ae94c5f..940c0431 100644 +--- a/tools/nfs-iostat/nfsiostat.man ++++ b/tools/nfs-iostat/nfsiostat.man +@@ -97,6 +97,14 @@ This is the duration from the time the NFS client created the RPC request task t + .RE + .RE + .RE ++.RS 8 ++- \fBerrors\fR ++.RS ++This is the number of operations that completed with an error status (status < 0). This count is only available on kernels with RPC iostats version 1.1 or above. ++.RS ++.RE ++.RE ++.RE + .TP + Note that if an interval is used as argument to \fBnfsiostat\fR, then the diffrence from previous interval will be displayed, otherwise the results will be from the time that the share was mounted. + diff --git a/SOURCES/nfsconvert.py b/SOURCES/nfsconvert.py index f826107..9aee57f 100644 --- a/SOURCES/nfsconvert.py +++ b/SOURCES/nfsconvert.py @@ -153,6 +153,10 @@ GETOPT_MAPS = [('RPCNFSDARGS', OPTS_NFSD, LONG_NFSD, CONV_NFSD), ('BLKMAPDARGS', OPTS_BLKMAPD, [], CONV_BLKMAPD), ] +# any fixups we need to apply first +GETOPT_FIXUP = {'RPCNFSDARGS': ('--rdma', '--rdma=nfsrdma'), + } + # map for all of the single option values VALUE_MAPS = {'LOCKD_TCPPORT': (CONF_NFS, 'lockd', 'port', '$1'), 'LOCKD_UDPPORT': (CONF_NFS, 'lockd', 'udp-port', '$1'), @@ -207,6 +211,13 @@ def convert_getopt(optname, options, optstring, longopts, conversions): optcount = 0 try: args = options.strip('\"').split() + if optname in GETOPT_FIXUP: + (k, v) = GETOPT_FIXUP[optname] + for i, opt in enumerate(args): + if opt == k: + args[i] = v + elif opt == '--': + break optlist, optargs = getopt.gnu_getopt(args, optstring, longopts=longopts) except getopt.GetoptError as err: eprint(err) diff --git a/SPECS/nfs-utils.spec b/SPECS/nfs-utils.spec index f893054..b808452 100644 --- a/SPECS/nfs-utils.spec +++ b/SPECS/nfs-utils.spec @@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser Name: nfs-utils URL: http://linux-nfs.org/ Version: 2.3.3 -Release: 26%{?dist} +Release: 31%{?dist} Epoch: 1 # group all 32bit related archs @@ -39,14 +39,24 @@ Patch013: nfs-utils-2.3.3-covscan-resource-leaks.patch Patch014: nfs-utils-2.3.3-nfsman-typo.patch Patch015: nfs-utils-2.3.3-mount-fallback.patch Patch016: nfs-utils-2.3.3-mountd-memleak.patch +Patch017: nfs-utils-2.3.3-lseek-error-handling.patch +Patch018: nfs-utils-2.3.3-memleak-on-error.patch + +# +# RHEL 8.2 +# +Patch019: nfs-utils-2.3.3-nfsiostat-err-cnts.patch +Patch020: nfs-utils-2.3.3-gssd-man-verbose.patch +Patch021: nfs-utils-2.3.3-nfsconf-rdmaport.patch +Patch022: nfs-utils-2.3.3-gssd-early-daemon.patch +Patch023: nfs-utils-2.3.3-covscan-rm-deadcode-leaks.patch +Patch024: nfs-utils-2.3.3-gssd-memoryleak.patch Patch100: nfs-utils-1.2.1-statdpath-man.patch Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch Patch102: nfs-utils-1.2.5-idmap-errmsg.patch Patch103: nfs-utils-2.3.1-systemd-gssproxy-restart.patch Patch104: nfs-utils-2.3.1-systemd-svcgssd-removed.patch -Patch105: nfs-utils-2.3.3-lseek-error-handling.patch -Patch106: nfs-utils-2.3.3-memleak-on-error.patch Provides: exportfs = %{epoch}:%{version}-%{release} Provides: nfsstat = %{epoch}:%{version}-%{release} @@ -325,6 +335,25 @@ fi %{_libdir}/libnfsidmap.so %changelog +* Fri Mar 6 2020 Steve Dickson 2.3.3-31 +- gssd: Closed a memory leak in find_keytab_entry() (bz 1809277) + +* Fri Feb 7 2020 Steve Dickson 2.3.3-30 +- Removed dead code that was flagged by a covscan (bz 1746572) + +* Thu Jan 16 2020 Steve Dickson 2.3.3-29 +- statd: Fix permission denied error path (bz 1776096) + +* Tue Nov 26 2019 Steve Dickson 2.3.3-28 +- gssd: daemonize earlier (bz 1762847) + +* Mon Nov 11 2019 Steve Dickson 2.3.3-27 +- More coverity scans updates (bz 1746572) +- nfsd: Adjust nfs.conf setting/parsing of rdma port (bz 1710532) +- Add plain --rdma option to nfs.conf convertor (bz 1747295) +- mountstats: Add per-op error counts to iostat command (bz 1719983) +- gssd: add configure options verbosity to man page (bz 1749642) + * Wed Sep 18 2019 Steve Dickson 2.3.3-26 - Updated coverity scans patch to not do a double free (bz 1752326)