On Wed, 19 Feb 2025, Charadon wrote:

I installed trickle using pkgin, and for some reason whenever I run it with anything it dies with a Memory Fault.

Anyone had any luck running this? I can't find anyone else online having this issue.


This is a NetBSD-specific issue caused by compat-related symbol renaming.
Apply the following 2 patches in sequence. The first, collects most of the
important (except the thread-related one) from GitHub. This fixes some issues
in trickle-1.07.

The second is the NetBSD-specific fix. Compile trickle as:

ac_cv_func_sendfile=no ./configure --prefix=/usr/pkg --sysconfdir=/usr/pkg/etc

otherwise, `configure' thinks NetBSD has sendfile(1)--which it doesn't. (Else
delete line 79 in `configure.in` then regen `configure` the std. way...)

-RVP

PS. Oh! and make sure none of the `-D_FORTIFY_SOURCE=N` / 
`-fstack-protector-XXX`
flags are set either. Those too will play havoc with the way this thing is
implemented.

---START GitHub PATCH---
diff -urN trickle-1.07.orig/bwstat.c trickle-1.07/bwstat.c
--- trickle-1.07.orig/bwstat.c  2004-10-24 09:31:27.000000000 +0000
+++ trickle-1.07/bwstat.c       2025-02-20 05:55:50.358534095 +0000
@@ -69,6 +69,7 @@
        if ((bs = calloc(1, sizeof(*bs))) == NULL)
                return (NULL);

+       bs->pts = 1;
        TAILQ_INSERT_TAIL(&statq, bs, next);

        return (bs);
@@ -143,7 +144,8 @@
 struct timeval *
 bwstat_getdelay(struct bwstat *bs, size_t *len, uint lim, short which)
 {
-       uint rate = 0, ncli = 0, npts = 0, pool = 0, ent, xent;
+       uint rate = 0, npts = 0, ent;
+       int ncli = 0, pool = 0, xent;
        double delay;
        static struct timeval tv;
        struct bwstathead poolq;
@@ -201,7 +203,7 @@
                if (ncli > 0) {
                        xent = pool / npts;

-                       if (xent == 0)
+                       if (xent <= 0)
                                break;

                        TAILQ_FOREACH(xbs, &poolq, qnext)
diff -urN trickle-1.07.orig/trickle-overload.c trickle-1.07/trickle-overload.c
--- trickle-1.07.orig/trickle-overload.c        2004-12-13 01:21:53.000000000 
+0000
+++ trickle-1.07/trickle-overload.c     2025-02-20 06:01:22.992531037 +0000
@@ -302,6 +302,13 @@
            domain, type, protocol, sock);
 #endif /* DEBUG */

+#ifdef SOCK_NONBLOCK
+       type &= ~SOCK_NONBLOCK;
+#endif
+#ifdef SOCK_CLOEXEC
+       type &= ~SOCK_CLOEXEC;
+#endif
+
        if (sock != -1 && domain == AF_INET && type == SOCK_STREAM) {
                if ((sd = calloc(1, sizeof(*sd))) == NULL)
                        return (-1);
@@ -311,7 +318,6 @@
                }

                /* All sockets are equals. */
-               sd->stat->pts = 1;
                sd->stat->lsmooth = lsmooth;
                sd->stat->tsmooth = tsmooth;
                sd->sock = sock;
@@ -393,18 +399,14 @@
 }

 static struct delay *
-select_shift(struct delayhead *dhead, struct timeval *inittv,
+select_shift(struct delayhead *dhead, struct timeval *difftv,
     struct timeval **delaytv)
 {
-       struct timeval curtv, difftv;
        struct delay *d;
        struct sockdesc *sd;

-       gettimeofday(&curtv, NULL);
-       timersub(&curtv, inittv, &difftv);
-
        TAILQ_FOREACH(d, dhead, next) {
-               if (timercmp(&d->delaytv, &difftv, >))
+               if (timercmp(&d->delaytv, difftv, >))
                        break;
                sd = d->sd;

@@ -413,7 +415,7 @@
        }

        if (d != NULL)
-               timersub(&d->delaytv, &difftv, *delaytv);
+               timersub(&d->delaytv, difftv, *delaytv);
        else
                *delaytv = NULL;

@@ -431,8 +433,8 @@
 {
        struct sockdesc *sd;
        fd_set *fdsets[] = { wfds, rfds }, *fds;
-       struct timeval *delaytv, *selecttv = NULL, *timeout = NULL, _timeout,
-           inittv, curtv, difftv;
+       struct timeval *delaytv, _delaytv, *selecttv = NULL, *timeout = NULL,
+           _timeout, inittv, curtv, difftv;
        short which;
        struct delayhead dhead;
        struct delay *d, *_d;
@@ -462,15 +464,18 @@
                            FD_ISSET(sd->sock, fds) &&
                            select_delay(&dhead, sd, which)) {
                                FD_CLR(sd->sock, fds);
-                               nfds--;
                        }

        gettimeofday(&inittv, NULL);
        curtv = inittv;
        d = TAILQ_FIRST(&dhead);
-       delaytv = d != NULL ? &d->delaytv : NULL;
+       if (d != NULL) {
+               _delaytv = d->delaytv;
+               delaytv = &_delaytv;
+       } else
+               delaytv = NULL;
+       timersub(&curtv, &inittv, &difftv);
  again:
-       timersub(&inittv, &curtv, &difftv);
        selecttv = NULL;

        if (delaytv != NULL)
@@ -498,15 +503,15 @@
 #endif /* DEBUG */

        if (ret == 0 && delaytv != NULL && selecttv == delaytv) {
-               _d = select_shift(&dhead, &inittv, &delaytv);
+               gettimeofday(&curtv, NULL);
+               timersub(&curtv, &inittv, &difftv);
+               _d = select_shift(&dhead, &difftv, &delaytv);
                while ((d = TAILQ_FIRST(&dhead)) != _d) {
                        FD_SET(d->sd->sock, fdsets[d->which]);
-                       nfds++;
                        TAILQ_REMOVE(&dhead, d, next);
                        free(d);
                }

-               gettimeofday(&curtv, NULL);
                goto again;
        }

@@ -994,7 +999,6 @@
                }

                sd->sock = ret;
-               sd->stat->pts = 1;
                sd->stat->lsmooth = lsmooth;
                sd->stat->tsmooth = tsmooth;
                TAILQ_INSERT_TAIL(&sdhead, sd, next);
---END GitHub PATCH---

---START NetBSD PATCH---
diff -urN trickle-1.07.orig/trickle-overload.c trickle-1.07/trickle-overload.c
--- trickle-1.07.orig/trickle-overload.c        2025-02-20 05:50:22.992531037 
+0000
+++ trickle-1.07/trickle-overload.c     2025-02-20 06:21:15.397992571 +0000
@@ -196,7 +196,12 @@

        GETADDR(write);

+#ifdef __NetBSD__
+       if ((libc_socket = dlsym(dh, "__socket30")) == NULL)
+               errx(0, "[trickle] Failed to get __socket30() address");
+#else
        GETADDR(socket);
+#endif
 /*     GETADDR(setsockopt); */
        GETADDR(close);

@@ -213,7 +218,12 @@
 #endif /* !__FreeBSD__ */
        GETADDR(sendto);

+#ifdef __NetBSD__
+       if ((libc_select = dlsym(dh, "__select50")) == NULL)
+               errx(0, "[trickle] Failed to get __select50() address");
+#else
        GETADDR(select);
+#endif
 //     GETADDR(poll);

        GETADDR(dup);
@@ -527,7 +537,7 @@
 #define POLL_WRMASK (POLLOUT | POLLWRNORM | POLLWRBAND)
 #define POLL_RDMASK (POLLIN | /* POLLNORM | */  POLLPRI | POLLRDNORM | 
POLLRDBAND)

-#if defined(__linux__) || (defined(__svr4__) && defined(__sun__)) || 
defined(__OpenBSD__)
+#if defined(__linux__) || (defined(__svr4__) && defined(__sun__)) || 
defined(__OpenBSD__) || defined(__NetBSD__)
 int
 poll(struct pollfd *fds, nfds_t nfds, int __timeout)
 #elif defined(__FreeBSD__)
---END NetBSD PATCH---

Reply via email to