* [PATCH 0/3] Minimal fixes for issues reported by static checkers
@ 2023-11-07 12:28 Stefano Brivio
2023-11-07 12:28 ` [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide Stefano Brivio
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Stefano Brivio @ 2023-11-07 12:28 UTC (permalink / raw)
To: passt-dev; +Cc: David Gibson
These are reported by clang-tidy and Coverity after David's series,
I'm applying minimal fixes for them to go ahead and apply those
series, as we should really make a new release at this point.
They are all trivial, I'm posting them to ease reviews but I already
applied these.
Stefano Brivio (3):
netlink: Sequence numbers are actually 32 bits wide
port_fwd: Don't try to read bound ports from invalid file handles
log: Match implicit va_start() with va_end() in vlogmsg()
log.c | 2 ++
netlink.c | 20 ++++++++++----------
port_fwd.c | 3 +++
3 files changed, 15 insertions(+), 10 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide
2023-11-07 12:28 [PATCH 0/3] Minimal fixes for issues reported by static checkers Stefano Brivio
@ 2023-11-07 12:28 ` Stefano Brivio
2023-11-07 23:32 ` David Gibson
2023-11-07 12:28 ` [PATCH 2/3] port_fwd: Don't try to read bound ports from invalid file handles Stefano Brivio
2023-11-07 12:28 ` [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg() Stefano Brivio
2 siblings, 1 reply; 6+ messages in thread
From: Stefano Brivio @ 2023-11-07 12:28 UTC (permalink / raw)
To: passt-dev; +Cc: David Gibson
Harmless, as we use sequence numbers monotonically anyway, but now
clang-tidy reports:
/home/sbrivio/passt/netlink.c:155:7: error: format specifies type 'unsigned short' but the argument has type '__u32' (aka 'unsigned int') [clang-diagnostic-format,-warnings-as-errors]
nh->nlmsg_seq, seq);
^
/home/sbrivio/passt/log.h:26:7: note: expanded from macro 'die'
err(__VA_ARGS__); \
^~~~~~~~~~~
/home/sbrivio/passt/log.h:19:34: note: expanded from macro 'err'
^~~~~~~~~~~
Suppressed 222820 warnings (222816 in non-user code, 4 NOLINT).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
1 warning treated as error
make: *** [Makefile:255: clang-tidy] Error 1
Fixes: 9d4ab98d538f ("netlink: Add nl_do() helper for simple operations with error checking")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
netlink.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/netlink.c b/netlink.c
index 768c6fd..6cc04a0 100644
--- a/netlink.c
+++ b/netlink.c
@@ -113,7 +113,7 @@ fail:
*
* Return: sequence number of request on success, terminates on error
*/
-static uint16_t nl_send(int s, void *req, uint16_t type,
+static uint32_t nl_send(int s, void *req, uint16_t type,
uint16_t flags, ssize_t len)
{
struct nlmsghdr *nh;
@@ -146,12 +146,12 @@ static uint16_t nl_send(int s, void *req, uint16_t type,
* > 0 @n if there are more responses to request @seq
* terminates if sequence numbers are out of sync
*/
-static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint16_t seq)
+static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint32_t seq)
{
ASSERT(NLMSG_OK(nh, n));
if (nh->nlmsg_seq != seq)
- die("netlink: Unexpected sequence number (%hu != %hu)",
+ die("netlink: Unexpected sequence number (%u != %u)",
nh->nlmsg_seq, seq);
if (nh->nlmsg_type == NLMSG_DONE) {
@@ -229,7 +229,7 @@ static int nl_do(int s, void *req, uint16_t type, uint16_t flags, ssize_t len)
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, req, type, flags, len);
nl_foreach(nh, status, s, buf, seq)
@@ -259,7 +259,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
struct rtattr *rta;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
size_t na;
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
@@ -313,7 +313,7 @@ int nl_route_get_def(int s, unsigned int ifi, sa_family_t af, void *gw)
bool found = false;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
@@ -438,7 +438,7 @@ int nl_route_dup(int s_src, unsigned int ifi_src,
unsigned dup_routes = 0;
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
- uint16_t seq;
+ uint32_t seq;
unsigned i;
seq = nl_send(s_src, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
@@ -550,7 +550,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWADDR) {
@@ -674,7 +674,7 @@ int nl_addr_dup(int s_src, unsigned int ifi_src,
char buf[NLBUFSIZ];
struct nlmsghdr *nh;
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
int rc = 0;
seq = nl_send(s_src, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
@@ -729,7 +729,7 @@ int nl_link_get_mac(int s, unsigned int ifi, void *mac)
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETLINK, 0, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWLINK) {
--
@@ -113,7 +113,7 @@ fail:
*
* Return: sequence number of request on success, terminates on error
*/
-static uint16_t nl_send(int s, void *req, uint16_t type,
+static uint32_t nl_send(int s, void *req, uint16_t type,
uint16_t flags, ssize_t len)
{
struct nlmsghdr *nh;
@@ -146,12 +146,12 @@ static uint16_t nl_send(int s, void *req, uint16_t type,
* > 0 @n if there are more responses to request @seq
* terminates if sequence numbers are out of sync
*/
-static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint16_t seq)
+static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint32_t seq)
{
ASSERT(NLMSG_OK(nh, n));
if (nh->nlmsg_seq != seq)
- die("netlink: Unexpected sequence number (%hu != %hu)",
+ die("netlink: Unexpected sequence number (%u != %u)",
nh->nlmsg_seq, seq);
if (nh->nlmsg_type == NLMSG_DONE) {
@@ -229,7 +229,7 @@ static int nl_do(int s, void *req, uint16_t type, uint16_t flags, ssize_t len)
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, req, type, flags, len);
nl_foreach(nh, status, s, buf, seq)
@@ -259,7 +259,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
struct rtattr *rta;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
size_t na;
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
@@ -313,7 +313,7 @@ int nl_route_get_def(int s, unsigned int ifi, sa_family_t af, void *gw)
bool found = false;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
@@ -438,7 +438,7 @@ int nl_route_dup(int s_src, unsigned int ifi_src,
unsigned dup_routes = 0;
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
- uint16_t seq;
+ uint32_t seq;
unsigned i;
seq = nl_send(s_src, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
@@ -550,7 +550,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWADDR) {
@@ -674,7 +674,7 @@ int nl_addr_dup(int s_src, unsigned int ifi_src,
char buf[NLBUFSIZ];
struct nlmsghdr *nh;
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
int rc = 0;
seq = nl_send(s_src, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
@@ -729,7 +729,7 @@ int nl_link_get_mac(int s, unsigned int ifi, void *mac)
struct nlmsghdr *nh;
char buf[NLBUFSIZ];
ssize_t status;
- uint16_t seq;
+ uint32_t seq;
seq = nl_send(s, &req, RTM_GETLINK, 0, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWLINK) {
--
2.39.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] port_fwd: Don't try to read bound ports from invalid file handles
2023-11-07 12:28 [PATCH 0/3] Minimal fixes for issues reported by static checkers Stefano Brivio
2023-11-07 12:28 ` [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide Stefano Brivio
@ 2023-11-07 12:28 ` Stefano Brivio
2023-11-07 12:28 ` [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg() Stefano Brivio
2 siblings, 0 replies; 6+ messages in thread
From: Stefano Brivio @ 2023-11-07 12:28 UTC (permalink / raw)
To: passt-dev; +Cc: David Gibson
This is a minimal fix for what would be reported by Coverity as
"Improper use of negative value" (CWE-394): port_fwd_init() doesn't
guarantee that all the pre-opened file handles are actually valid.
We should probably warn on failing open() and open_in_ns() in
port_fwd_init(), too, but that's outside the scope of this minimal
fix.
Before commit 5a0485425bc9 ("port_fwd: Pre-open /proc/net/* files
rather than on-demand"), we used to have a single open() call and
a check after it.
Fixes: 5a0485425bc9 ("port_fwd: Pre-open /proc/net/* files rather than on-demand")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
port_fwd.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/port_fwd.c b/port_fwd.c
index fc4d5cb..eac8d2f 100644
--- a/port_fwd.c
+++ b/port_fwd.c
@@ -45,6 +45,9 @@ static void procfs_scan_listen(int fd, unsigned int lstate,
unsigned int state;
char *line;
+ if (fd < 0)
+ return;
+
if (lseek(fd, 0, SEEK_SET)) {
warn("lseek() failed on /proc/net file: %s", strerror(errno));
return;
--
@@ -45,6 +45,9 @@ static void procfs_scan_listen(int fd, unsigned int lstate,
unsigned int state;
char *line;
+ if (fd < 0)
+ return;
+
if (lseek(fd, 0, SEEK_SET)) {
warn("lseek() failed on /proc/net file: %s", strerror(errno));
return;
--
2.39.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg()
2023-11-07 12:28 [PATCH 0/3] Minimal fixes for issues reported by static checkers Stefano Brivio
2023-11-07 12:28 ` [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide Stefano Brivio
2023-11-07 12:28 ` [PATCH 2/3] port_fwd: Don't try to read bound ports from invalid file handles Stefano Brivio
@ 2023-11-07 12:28 ` Stefano Brivio
2023-11-07 23:31 ` David Gibson
2 siblings, 1 reply; 6+ messages in thread
From: Stefano Brivio @ 2023-11-07 12:28 UTC (permalink / raw)
To: passt-dev; +Cc: David Gibson
According to C99, 7.15.1:
Each invocation of the va_start and va_copy macros shall be matched
by a corresponding invocation of the va_end macro in the same
function
and the same applies to C11. I still have to come across a platform
where va_end() actually does something, but thus spake the standard.
This would be reported by Coverity as "Missing varargs init or
cleanup" (CWE-573).
Fixes: c0426ff10bc9 ("log: Add vlogmsg()")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
log.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/log.c b/log.c
index 95c4fa4..b206f72 100644
--- a/log.c
+++ b/log.c
@@ -67,6 +67,8 @@ void vlogmsg(int pri, const char *format, va_list ap)
logfile_write(pri, format, ap2);
else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG)))
passt_vsyslog(pri, format, ap2);
+
+ va_end(ap2);
}
if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) ||
--
@@ -67,6 +67,8 @@ void vlogmsg(int pri, const char *format, va_list ap)
logfile_write(pri, format, ap2);
else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG)))
passt_vsyslog(pri, format, ap2);
+
+ va_end(ap2);
}
if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) ||
--
2.39.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg()
2023-11-07 12:28 ` [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg() Stefano Brivio
@ 2023-11-07 23:31 ` David Gibson
0 siblings, 0 replies; 6+ messages in thread
From: David Gibson @ 2023-11-07 23:31 UTC (permalink / raw)
To: Stefano Brivio; +Cc: passt-dev
[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]
On Tue, Nov 07, 2023 at 01:28:33PM +0100, Stefano Brivio wrote:
> According to C99, 7.15.1:
>
> Each invocation of the va_start and va_copy macros shall be matched
> by a corresponding invocation of the va_end macro in the same
> function
>
> and the same applies to C11. I still have to come across a platform
> where va_end() actually does something, but thus spake the standard.
> This would be reported by Coverity as "Missing varargs init or
> cleanup" (CWE-573).
Oops. I'm pretty sure this one will cause real problems on some
platforms. Well caught.
> Fixes: c0426ff10bc9 ("log: Add vlogmsg()")
> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
> ---
> log.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/log.c b/log.c
> index 95c4fa4..b206f72 100644
> --- a/log.c
> +++ b/log.c
> @@ -67,6 +67,8 @@ void vlogmsg(int pri, const char *format, va_list ap)
> logfile_write(pri, format, ap2);
> else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG)))
> passt_vsyslog(pri, format, ap2);
> +
> + va_end(ap2);
> }
>
> if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) ||
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide
2023-11-07 12:28 ` [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide Stefano Brivio
@ 2023-11-07 23:32 ` David Gibson
0 siblings, 0 replies; 6+ messages in thread
From: David Gibson @ 2023-11-07 23:32 UTC (permalink / raw)
To: Stefano Brivio; +Cc: passt-dev
[-- Attachment #1: Type: text/plain, Size: 4701 bytes --]
On Tue, Nov 07, 2023 at 01:28:31PM +0100, Stefano Brivio wrote:
> Harmless, as we use sequence numbers monotonically anyway, but now
> clang-tidy reports:
>
> /home/sbrivio/passt/netlink.c:155:7: error: format specifies type 'unsigned short' but the argument has type '__u32' (aka 'unsigned int') [clang-diagnostic-format,-warnings-as-errors]
> nh->nlmsg_seq, seq);
> ^
> /home/sbrivio/passt/log.h:26:7: note: expanded from macro 'die'
> err(__VA_ARGS__); \
> ^~~~~~~~~~~
> /home/sbrivio/passt/log.h:19:34: note: expanded from macro 'err'
> ^~~~~~~~~~~
> Suppressed 222820 warnings (222816 in non-user code, 4 NOLINT).
> Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
> 1 warning treated as error
> make: *** [Makefile:255: clang-tidy] Error 1
Hrm. I wonder why clang-tidy didn't find this one for me :/
> Fixes: 9d4ab98d538f ("netlink: Add nl_do() helper for simple operations with error checking")
> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
> ---
> netlink.c | 20 ++++++++++----------
> 1 file changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/netlink.c b/netlink.c
> index 768c6fd..6cc04a0 100644
> --- a/netlink.c
> +++ b/netlink.c
> @@ -113,7 +113,7 @@ fail:
> *
> * Return: sequence number of request on success, terminates on error
> */
> -static uint16_t nl_send(int s, void *req, uint16_t type,
> +static uint32_t nl_send(int s, void *req, uint16_t type,
> uint16_t flags, ssize_t len)
> {
> struct nlmsghdr *nh;
> @@ -146,12 +146,12 @@ static uint16_t nl_send(int s, void *req, uint16_t type,
> * > 0 @n if there are more responses to request @seq
> * terminates if sequence numbers are out of sync
> */
> -static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint16_t seq)
> +static int nl_status(const struct nlmsghdr *nh, ssize_t n, uint32_t seq)
> {
> ASSERT(NLMSG_OK(nh, n));
>
> if (nh->nlmsg_seq != seq)
> - die("netlink: Unexpected sequence number (%hu != %hu)",
> + die("netlink: Unexpected sequence number (%u != %u)",
> nh->nlmsg_seq, seq);
>
> if (nh->nlmsg_type == NLMSG_DONE) {
> @@ -229,7 +229,7 @@ static int nl_do(int s, void *req, uint16_t type, uint16_t flags, ssize_t len)
> struct nlmsghdr *nh;
> char buf[NLBUFSIZ];
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
>
> seq = nl_send(s, req, type, flags, len);
> nl_foreach(nh, status, s, buf, seq)
> @@ -259,7 +259,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
> struct rtattr *rta;
> char buf[NLBUFSIZ];
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
> size_t na;
>
> seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
> @@ -313,7 +313,7 @@ int nl_route_get_def(int s, unsigned int ifi, sa_family_t af, void *gw)
> bool found = false;
> char buf[NLBUFSIZ];
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
>
> seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
> nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
> @@ -438,7 +438,7 @@ int nl_route_dup(int s_src, unsigned int ifi_src,
> unsigned dup_routes = 0;
> struct nlmsghdr *nh;
> char buf[NLBUFSIZ];
> - uint16_t seq;
> + uint32_t seq;
> unsigned i;
>
> seq = nl_send(s_src, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
> @@ -550,7 +550,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
> struct nlmsghdr *nh;
> char buf[NLBUFSIZ];
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
>
> seq = nl_send(s, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
> nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWADDR) {
> @@ -674,7 +674,7 @@ int nl_addr_dup(int s_src, unsigned int ifi_src,
> char buf[NLBUFSIZ];
> struct nlmsghdr *nh;
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
> int rc = 0;
>
> seq = nl_send(s_src, &req, RTM_GETADDR, NLM_F_DUMP, sizeof(req));
> @@ -729,7 +729,7 @@ int nl_link_get_mac(int s, unsigned int ifi, void *mac)
> struct nlmsghdr *nh;
> char buf[NLBUFSIZ];
> ssize_t status;
> - uint16_t seq;
> + uint32_t seq;
>
> seq = nl_send(s, &req, RTM_GETLINK, 0, sizeof(req));
> nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWLINK) {
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-11-08 1:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-07 12:28 [PATCH 0/3] Minimal fixes for issues reported by static checkers Stefano Brivio
2023-11-07 12:28 ` [PATCH 1/3] netlink: Sequence numbers are actually 32 bits wide Stefano Brivio
2023-11-07 23:32 ` David Gibson
2023-11-07 12:28 ` [PATCH 2/3] port_fwd: Don't try to read bound ports from invalid file handles Stefano Brivio
2023-11-07 12:28 ` [PATCH 3/3] log: Match implicit va_start() with va_end() in vlogmsg() Stefano Brivio
2023-11-07 23:31 ` David Gibson
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).