Compare commits
No commits in common. "c8s" and "c8-beta" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1 @@
|
||||
SOURCES/libtirpc-1.1.4.tar.bz2
|
||||
/libtirpc-1.1.4.tar.bz2
|
||||
|
1
.libtirpc.metadata
Normal file
1
.libtirpc.metadata
Normal file
@ -0,0 +1 @@
|
||||
d85717035cb9bd6c45557a1eb1351d3af9a69ff7 SOURCES/libtirpc-1.1.4.tar.bz2
|
@ -2,7 +2,7 @@
|
||||
|
||||
Name: libtirpc
|
||||
Version: 1.1.4
|
||||
Release: 12%{?dist}
|
||||
Release: 8%{?dist}
|
||||
Summary: Transport Independent RPC Library
|
||||
Group: System Environment/Libraries
|
||||
License: SISSL and BSD
|
||||
@ -47,14 +47,6 @@ Patch008: libtirpc-1.1.4-v2proto-mech.patch
|
||||
# bz 2112116
|
||||
Patch009: libtirpc-1.1.4-multithr-cleanup.patch
|
||||
|
||||
#
|
||||
# RHEL 8.10
|
||||
#
|
||||
Patch010: libtirpc-1.1.4-null-ptrs-not-reused.patch
|
||||
Patch011: libtirpc-1.1.4-double-free.patch
|
||||
Patch012: libtirpc-1.1.4-null-ptrs-not-reused-fixed.patch
|
||||
Patch013: libtirpc-1.1.4-ip_local_reserved_ports.patch
|
||||
|
||||
BuildRequires: automake, autoconf, libtool, pkgconfig
|
||||
BuildRequires: krb5-devel
|
||||
|
||||
@ -174,18 +166,6 @@ mv %{buildroot}%{_mandir}/man3 %{buildroot}%{_mandir}/man3t
|
||||
%{_mandir}/*/*
|
||||
|
||||
%changelog
|
||||
* Fri Apr 26 2024 Steve Dickson <steved@redhat.com> 1.1.4-12
|
||||
- binddynport.c honor ip_local_reserved_ports (RHEL-27005)
|
||||
|
||||
* Tue Mar 19 2024 Steve Dickson <steved@redhat.com> 1.1.4-11
|
||||
- rpcb_clnt.c (fixed): Eliminate double frees in delete_cache() (RHEL-11293)
|
||||
|
||||
* Tue Mar 5 2024 Steve Dickson <steved@redhat.com> 1.1.4-10
|
||||
- rpcb_clnt.c: Eliminate double frees in delete_cache() (RHEL-11293)
|
||||
|
||||
* Mon Mar 4 2024 Steve Dickson <steved@redhat.com> 1.1.4-9
|
||||
- Null pointers so they are not used again (RHEL-11370)
|
||||
|
||||
* Wed Aug 3 2022 Steve Dickson <steved@redhat.com> 1.1.4-8
|
||||
- rpcb_clnt.c add mechanism to try v2 protocol first (bz 2107650)
|
||||
- Multithreaded cleanup (bz 2112116)
|
@ -1,6 +0,0 @@
|
||||
--- !Policy
|
||||
product_versions:
|
||||
- rhel-8
|
||||
decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: osci.brew-build.revdeps.integration}
|
@ -1,32 +0,0 @@
|
||||
commit 1d2e10afb2ffc35cb3623f57a15f712359f18e75
|
||||
Author: Herb Wartens <wartens2@llnl.gov>
|
||||
Date: Tue Aug 1 10:36:16 2023 -0400
|
||||
|
||||
rpcb_clnt.c: Eliminate double frees in delete_cache()
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2224666
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
|
||||
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
||||
index c0a9e12..68fe69a 100644
|
||||
--- a/src/rpcb_clnt.c
|
||||
+++ b/src/rpcb_clnt.c
|
||||
@@ -262,12 +262,15 @@ delete_cache(addr)
|
||||
for (cptr = front; cptr != NULL; cptr = cptr->ac_next) {
|
||||
if (!memcmp(cptr->ac_taddr->buf, addr->buf, addr->len)) {
|
||||
/* Unlink from cache. We'll destroy it after releasing the mutex. */
|
||||
- if (cptr->ac_uaddr)
|
||||
+ if (cptr->ac_uaddr) {
|
||||
free(cptr->ac_uaddr);
|
||||
- if (prevptr)
|
||||
+ cptr->ac_uaddr = NULL;
|
||||
+ }
|
||||
+ if (prevptr) {
|
||||
prevptr->ac_next = cptr->ac_next;
|
||||
- else
|
||||
+ } else {
|
||||
front = cptr->ac_next;
|
||||
+ }
|
||||
cachesize--;
|
||||
break;
|
||||
}
|
@ -1,185 +0,0 @@
|
||||
From 20148930201b732c5dd1003933dd70543d3e929d Mon Sep 17 00:00:00 2001
|
||||
From: Otto Hollmann <otto.hollmann@suse.com>
|
||||
Date: Sat, 7 Oct 2023 03:48:22 -0400
|
||||
Subject: [PATCH] binddynport.c honor ip_local_reserved_ports
|
||||
|
||||
Read reserved ports from /proc/sys/net/ipv4/ip_local_reserved_ports,
|
||||
store them into bit-wise array and before binding to random port check
|
||||
if port is not reserved.
|
||||
|
||||
Currently, there is no way how to reserve ports so then will not be
|
||||
used by rpcbind.
|
||||
|
||||
Random ports are opened by rpcbind because of rmtcalls. There is
|
||||
compile-time flag for disabling them, but in some cases we can not
|
||||
simply disable them.
|
||||
|
||||
One solution would be run time option --enable-rmtcalls as already
|
||||
discussed, but it was rejected. So if we want to keep rmtcalls enabled
|
||||
and also be able to reserve some ports, there is no other way than
|
||||
filtering available ports. The easiest and clearest way seems to be
|
||||
just respect kernel list of ip_reserved_ports.
|
||||
|
||||
Unfortunately there is one known disadvantage/side effect - it affects
|
||||
probability of ports which are right after reserved ones. The bigger
|
||||
reserved block is, the higher is probability of selecting following
|
||||
unreserved port. But if there is no reserved port, impact of this patch
|
||||
is minimal/none.
|
||||
|
||||
Signed-off-by: Otto Hollmann <otto.hollmann@suse.com>
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
---
|
||||
src/binddynport.c | 108 ++++++++++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 100 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/binddynport.c b/src/binddynport.c
|
||||
index 062629a..c2e9a20 100644
|
||||
--- a/src/binddynport.c
|
||||
+++ b/src/binddynport.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
+#include <syslog.h>
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
|
||||
@@ -56,6 +57,84 @@ enum {
|
||||
NPORTS = ENDPORT - LOWPORT + 1,
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * This function decodes information about given port from provided array and
|
||||
+ * return if port is reserved or not.
|
||||
+ *
|
||||
+ * @reserved_ports an array of size at least "NPORTS / (8*sizeof(char)) + 1".
|
||||
+ * @port port number within range LOWPORT and ENDPORT
|
||||
+ *
|
||||
+ * Returns 0 if port is not reserved, non-negative if port is reserved.
|
||||
+ */
|
||||
+static int is_reserved(char *reserved_ports, int port) {
|
||||
+ port -= LOWPORT;
|
||||
+ if (port < 0 || port >= NPORTS)
|
||||
+ return 0;
|
||||
+ return reserved_ports[port/(8*sizeof(char))] & 1<<(port%(8*sizeof(char)));
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * This function encodes information about given *reserved* port into provided
|
||||
+ * array. Don't call this function for ports which are not reserved.
|
||||
+ *
|
||||
+ * @reserved_ports an array of size at least "NPORTS / (8*sizeof(char)) + 1".
|
||||
+ * @port port number within range LOWPORT and ENDPORT
|
||||
+ *
|
||||
+ */
|
||||
+static void set_reserved(char *reserved_ports, int port) {
|
||||
+ port -= LOWPORT;
|
||||
+ if (port < 0 || port >= NPORTS)
|
||||
+ return;
|
||||
+ reserved_ports[port/(8*sizeof(char))] |= 1<<(port%(8*sizeof(char)));
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Parse local reserved ports obtained from
|
||||
+ * /proc/sys/net/ipv4/ip_local_reserved_ports into bit array.
|
||||
+ *
|
||||
+ * @reserved_ports a zeroed array of size at least
|
||||
+ * "NPORTS / (8*sizeof(char)) + 1". Will be used for bit-wise encoding of
|
||||
+ * reserved ports.
|
||||
+ *
|
||||
+ * On each call, reserved ports are read from /proc and bit-wise stored into
|
||||
+ * provided array
|
||||
+ *
|
||||
+ * Returns 0 on success, -1 on failure.
|
||||
+ */
|
||||
+
|
||||
+static int parse_reserved_ports(char *reserved_ports) {
|
||||
+ int from=0, to;
|
||||
+ char delimiter = ',';
|
||||
+ int res;
|
||||
+ FILE * file_ptr = fopen("/proc/sys/net/ipv4/ip_local_reserved_ports","r");
|
||||
+ if (file_ptr == NULL) {
|
||||
+ (void) syslog(LOG_ERR,
|
||||
+ "Unable to open open /proc/sys/net/ipv4/ip_local_reserved_ports.");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ do {
|
||||
+ if ((res = fscanf(file_ptr, "%d", &to)) != 1) {
|
||||
+ if (res == EOF) break;
|
||||
+ goto err;
|
||||
+ }
|
||||
+ if (delimiter != '-') {
|
||||
+ from = to;
|
||||
+ }
|
||||
+ for (int i = from; i <= to; ++i) {
|
||||
+ set_reserved(reserved_ports, i);
|
||||
+ }
|
||||
+ } while ((res = fscanf(file_ptr, "%c", &delimiter)) == 1);
|
||||
+ if (res != EOF)
|
||||
+ goto err;
|
||||
+ fclose(file_ptr);
|
||||
+ return 0;
|
||||
+err:
|
||||
+ (void) syslog(LOG_ERR,
|
||||
+ "An error occurred while parsing ip_local_reserved_ports.");
|
||||
+ fclose(file_ptr);
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Bind a socket to a dynamically-assigned IP port.
|
||||
*
|
||||
@@ -81,7 +160,8 @@ int __binddynport(int fd)
|
||||
in_port_t port, *portp;
|
||||
struct sockaddr *sap;
|
||||
socklen_t salen;
|
||||
- int i, res;
|
||||
+ int i, res, array_size;
|
||||
+ char *reserved_ports = NULL;
|
||||
|
||||
if (__rpc_sockisbound(fd))
|
||||
return 0;
|
||||
@@ -119,21 +199,33 @@ int __binddynport(int fd)
|
||||
gettimeofday(&tv, NULL);
|
||||
seed = tv.tv_usec * getpid();
|
||||
}
|
||||
+ array_size = NPORTS / (8*sizeof(char)) + 1;
|
||||
+ reserved_ports = malloc(array_size);
|
||||
+ if (!reserved_ports) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+ memset(reserved_ports, 0, array_size);
|
||||
+ if (parse_reserved_ports(reserved_ports) < 0)
|
||||
+ goto out;
|
||||
+
|
||||
port = (rand_r(&seed) % NPORTS) + LOWPORT;
|
||||
for (i = 0; i < NPORTS; ++i) {
|
||||
- *portp = htons(port++);
|
||||
- res = bind(fd, sap, salen);
|
||||
- if (res >= 0) {
|
||||
- res = 0;
|
||||
- break;
|
||||
+ *portp = htons(port);
|
||||
+ if (!is_reserved(reserved_ports, port++)) {
|
||||
+ res = bind(fd, sap, salen);
|
||||
+ if (res >= 0) {
|
||||
+ res = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ if (errno != EADDRINUSE)
|
||||
+ break;
|
||||
}
|
||||
- if (errno != EADDRINUSE)
|
||||
- break;
|
||||
if (port > ENDPORT)
|
||||
port = LOWPORT;
|
||||
}
|
||||
|
||||
out:
|
||||
+ free(reserved_ports);
|
||||
mutex_unlock(&port_lock);
|
||||
return res;
|
||||
}
|
||||
--
|
||||
2.40.1
|
||||
|
@ -1,23 +0,0 @@
|
||||
commit 6951a9c3139c9c7dbb0bdae70737996011fc7a37
|
||||
Author: Herb Wartens <wartens2@llnl.gov>
|
||||
Date: Mon Mar 18 11:07:15 2024 -0400
|
||||
|
||||
rpcb_clnt.c: memory leak in destroy_addr
|
||||
|
||||
Piece was dropped from original fix.
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2225226
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
|
||||
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
||||
index 68fe69a..d909efc 100644
|
||||
--- a/src/rpcb_clnt.c
|
||||
+++ b/src/rpcb_clnt.c
|
||||
@@ -121,6 +121,7 @@ destroy_addr(addr)
|
||||
free(addr->ac_taddr->buf);
|
||||
addr->ac_taddr->buf = NULL;
|
||||
}
|
||||
+ free(addr->ac_taddr);
|
||||
addr->ac_taddr = NULL;
|
||||
}
|
||||
free(addr);
|
@ -1,48 +0,0 @@
|
||||
commit 89c63bdfd79b1c94384daaaa03a9e3582540f843
|
||||
Author: Herb Wartens <wartens2@llnl.gov>
|
||||
Date: Tue Aug 1 10:21:42 2023 -0400
|
||||
|
||||
rpcb_clnt.c: memory leak in destroy_addr
|
||||
|
||||
Null pointers so they are not used again
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2225226
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
|
||||
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
||||
index d178d86..c0a9e12 100644
|
||||
--- a/src/rpcb_clnt.c
|
||||
+++ b/src/rpcb_clnt.c
|
||||
@@ -104,17 +104,27 @@ destroy_addr(addr)
|
||||
{
|
||||
if (addr == NULL)
|
||||
return;
|
||||
- if(addr->ac_host != NULL)
|
||||
+ if (addr->ac_host != NULL) {
|
||||
free(addr->ac_host);
|
||||
- if(addr->ac_netid != NULL)
|
||||
+ addr->ac_host = NULL;
|
||||
+ }
|
||||
+ if (addr->ac_netid != NULL) {
|
||||
free(addr->ac_netid);
|
||||
- if(addr->ac_uaddr != NULL)
|
||||
+ addr->ac_netid = NULL;
|
||||
+ }
|
||||
+ if (addr->ac_uaddr != NULL) {
|
||||
free(addr->ac_uaddr);
|
||||
- if(addr->ac_taddr != NULL) {
|
||||
- if(addr->ac_taddr->buf != NULL)
|
||||
+ addr->ac_uaddr = NULL;
|
||||
+ }
|
||||
+ if (addr->ac_taddr != NULL) {
|
||||
+ if(addr->ac_taddr->buf != NULL) {
|
||||
free(addr->ac_taddr->buf);
|
||||
+ addr->ac_taddr->buf = NULL;
|
||||
+ }
|
||||
+ addr->ac_taddr = NULL;
|
||||
}
|
||||
free(addr);
|
||||
+ addr = NULL;
|
||||
}
|
||||
|
||||
/*
|
Loading…
Reference in New Issue
Block a user