Hi, I added an exception for your email to the list. Following replies should get archived. On Fri, Oct 31, 2025 at 11:34:04AM -0400, John McCue wrote:
Hi Rodrigo,
Attached are these 3 patches, the third one is a very minor one for the gemini plugin's Makefile.
Thanks for the patches.
1. io.txt -- A patch to io.c to avoid a compile error on OpenBSD. This is based upon the email I responded to earlier today.
2. dpi.txt -- Corrects an odd issue on OpenBSD with the gopher plugin. Access a gopher hole works fine on first try, accessing a 2nd hole does nothing, no data is presented. Selecting the "Stop" button in dillo works to stop the attempted load. My wild guess is one of the casts fixed the issue.
I cannot reproduce this, with or without the patch. Tested in order: - gopher://gopher.quux.org:70/1/ - gopher://gopher.floodgap.com/ If you can reliably reproduce this, you could dump the backtrace while is "doing nothing" in case it got stuck in some network operation.
3. gemini_mk.txt -- a simple change to the gemini plugin's Makefile. It allows the gemini plugin to 'compile' on NetBSD. NetBSD installs packages in /usr/pkg.
As mentioned in the last email, I will be happy to test on OpenBSD and NetBSD.
Thanks John
diff --git a/dpi.c b/dpi.c index 7b38800..52547f8 100644 --- a/dpi.c +++ b/dpi.c @@ -7,7 +7,7 @@ #include "io.h"
static void check_auth() { - char buf[30]; + char buf[31]; int rc; char key[4], local_key[4]; char keys[128]; @@ -16,16 +16,16 @@ static void check_auth() { rc = read_all(STDIN_FILENO, buf, 29); if (rc < 0) err(1, "read auth"); buf[30] = '\0'; - rc = sscanf(buf, "<cmd='auth' msg='%4x' '>", key); + rc = sscanf(buf, "<cmd='auth' msg='%4x' '>", (unsigned int *) key);
The address of key may not be aligned to the size of a word. Some architectures will cause an invalid access trying to write an int to a non-aligned address. A better solution is to declare key as an unsigned int. I applied your fixes and then changed the key variables.
if (rc < 0) err(1, "auth: %.*s", 29, buf); if (rc < 1) errx(1, "auth: %.*s", 29, buf); home = getenv("HOME"); if (!home) home = "."; sz = read_file(keys, sizeof(keys), "%s/.dillo/dpid_comm_keys", home); if (sz < 0) err(1, "read dillo comm keys"); - rc = sscanf(keys, "%*d %4x' '>", local_key); - if (rc < 0) err(1, "comm key: %.*s", sz, keys); - if (rc < 1) errx(1, "comm key: %.*s", sz, keys); + rc = sscanf(keys, "%*d %4x' '>", (unsigned int *) local_key); + if (rc < 0) err(1, "comm key: %.*s", (int) sz, keys); + if (rc < 1) errx(1, "comm key: %.*s", (int) sz, keys); if (memcmp(key, local_key, 4)) errx(1, "wrong dillo key"); }
@@ -38,7 +38,7 @@ static void get_url(char *url_buf, size_t url_len) { rc = read_all(STDIN_FILENO, buf, sizeof(buf)); if (rc < 0) err(1, "read open_url"); if (strncmp(buf, "<cmd='open_url' url='", 21)) { - err(1, "bad open_url cmd: %.*s", sizeof(buf), buf); + err(1, "bad open_url cmd: %.*s", (int) sizeof(buf), buf); } len = url_len; rc = read_some(STDIN_FILENO, url_buf, &len); @@ -48,7 +48,7 @@ static void get_url(char *url_buf, size_t url_len) { if (url_buf[i] == '\'' && url_buf[i+1] == ' ') break; } if (i > len-3 || strncmp(url_buf + i, "' '>", 4)) { - err(1, "bad url end: %.*s", len, url_buf); + err(1, "bad url end: %.*s", (int) len, url_buf); } url_buf[i] = '\0'; }
diff --git a/Makefile b/Makefile index 1ff7047..e41e173 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ $(DPIDRC): mkdir -p $(DPI_DIR) if [ -f /etc/dillo/dpidrc ]; then cp /etc/dillo/dpidrc $@; \ elif [ -f /usr/local/etc/dillo/dpidrc ]; then cp /usr/local/etc/dillo/dpidrc $@; \ + elif [ -f /usr/pkg/etc/dillo/dpidrc ]; then cp /usr/pkg/etc/dillo/dpidrc $@; \ else echo "Can't find dpidrc, is dillo installed?"; false; fi
This is not in our upstream, but I would rather avoid having each possible path here. I added a DILLO_PREFIX variable, empty by default. So you can use `make install DILLO_PREFIX=/usr/pkg` to find dpidrc in your system. By default it only looks at /etc/dillo/dpidrc.
install-proto: $(DPIDRC)
diff --git a/io.c b/io.c index 615f346..f437c2e 100644 --- a/io.c +++ b/io.c @@ -7,6 +7,7 @@ #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> +#include <sys/socket.h>
Applied.
#include "io.h"
I fixed several other problems and set the C standard to C99 and enabled POSIX 2001 by default in CFLAGS. I also performed the build with gcc and clang on Linux with -Werror -Wall -Wextra -pedantic as well as with -fsanitize=address to see if I catch something while running the plugin. Nothing so far. I pushed it here (we are moving away from GitHub): https://git.dillo-browser.org/plugins/gopher/log/?h=fix-bsd Let me know if you encounter problems building it on any BSD. Thanks!, Rodrigo.
On Sat, Nov 01, 2025 at 12:34:17AM +0100, Rodrigo Arias wrote:
Hi,
I added an exception for your email to the list. Following replies should get archived.
Thanks
On Fri, Oct 31, 2025 at 11:34:04AM -0400, John McCue wrote:
[...]
2. dpi.txt -- Corrects an odd issue on OpenBSD with the gopher plugin. Access a gopher hole works fine on first try, accessing a 2nd hole does nothing, no data is presented. Selecting the "Stop" button in dillo works to stop the attempted load. My wild guess is one of the casts fixed the issue.
I cannot reproduce this, with or without the patch. Tested in order:
- gopher://gopher.quux.org:70/1/ - gopher://gopher.floodgap.com/
If you can reliably reproduce this, you could dump the backtrace while is "doing nothing" in case it got stuck in some network operation.
I'll try and backtrace, I never did that before, I usually throw printfs all over the place. But ... the version from git clone https://git.dillo-browser.org/plugins/gopher is working after I added this <sys/socket.h> to io.c to compile it. I also checked the original version, that works now, very odd. I will play around with this to see if I could figure out what I may have done differently. [...]
buf[30] = '\0'; - rc = sscanf(buf, "<cmd='auth' msg='%4x' '>", key); + rc = sscanf(buf, "<cmd='auth' msg='%4x' '>", (unsigned int *) key);
The address of key may not be aligned to the size of a word. Some architectures will cause an invalid access trying to write an int to a non-aligned address.
A better solution is to declare key as an unsigned int. I applied your fixes and then changed the key variables.
This sounds fine by me, I just made changes to "get it working" :) [...]
diff --git a/Makefile b/Makefile index 1ff7047..e41e173 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ $(DPIDRC): mkdir -p $(DPI_DIR) if [ -f /etc/dillo/dpidrc ]; then cp /etc/dillo/dpidrc $@; \ elif [ -f /usr/local/etc/dillo/dpidrc ]; then cp /usr/local/etc/dillo/dpidrc $@; \ + elif [ -f /usr/pkg/etc/dillo/dpidrc ]; then cp /usr/pkg/etc/dillo/dpidrc $@; \ else echo "Can't find dpidrc, is dillo installed?"; false; fi
This is not in our upstream, but I would rather avoid having each possible path here. I added a DILLO_PREFIX variable, empty by default. So you can use `make install DILLO_PREFIX=/usr/pkg` to find dpidrc in your system. By default it only looks at /etc/dillo/dpidrc.
Fine by me.
diff --git a/io.c b/io.c index 615f346..f437c2e 100644 --- a/io.c +++ b/io.c @@ -7,6 +7,7 @@ #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> +#include <sys/socket.h>
Applied.
#include "io.h"
I fixed several other problems and set the C standard to C99 and enabled POSIX 2001 by default in CFLAGS. I also performed the build with gcc and clang on Linux with -Werror -Wall -Wextra -pedantic as well as with -fsanitize=address to see if I catch something while running the plugin. Nothing so far.
I pushed it here (we are moving away from GitHub):
https://git.dillo-browser.org/plugins/gopher/log/?h=fix-bsd
Let me know if you encounter problems building it on any BSD.
After I added this <sys/socket.h> to io.c I can compile it on OpenBSD. I attached the warnings to this email as warn_openbsd.txt in case you want it. I think many of the warnings can be ignored. NetBSD has no warnings and it too works fine.
Thanks!, Rodrigo.
John
Hi,
I'll try and backtrace, I never did that before, I usually throw printfs all over the place. But ...
the version from git clone https://git.dillo-browser.org/plugins/gopher
is working after I added this <sys/socket.h> to io.c to compile it.
Should be there: https://git.dillo-browser.org/plugins/gopher/tree/io.c?h=fix-bsd#n10 Make sure you use the "fix-bsd" branch (currently at a32f745): % git clone -b fix-bsd https://git.dillo-browser.org/plugins/gopher Cloning into 'gopher'... % cd gopher % git branch -v * fix-bsd a32f745 Build with C99 standard and POSIX 2001 % grep sys/socket io.c #include <sys/socket.h>
I also checked the original version, that works now, very odd. I will play around with this to see if I could figure out what I may have done differently.
Thanks!
After I added this <sys/socket.h> to io.c I can compile it on OpenBSD.
I attached the warnings to this email as warn_openbsd.txt in case you want it. I think many of the warnings can be ignored.
NetBSD has no warnings and it too works fine.
All those warnings should be fixed in the fix-bsd branch. Additional problems may be caught by the new CFLAGS flags that stick to the C99 standard (no GNUsisms) and POSIX 2001. Best, Rodrigo.
On Sat, Nov 01, 2025 at 09:20:39PM +0100, Rodrigo Arias wrote:
Hi,
I'll try and backtrace, I never did that before, I usually throw printfs all over the place. But ...
the version from git clone https://git.dillo-browser.org/plugins/gopher
is working after I added this <sys/socket.h> to io.c to compile it.
Should be there:
https://git.dillo-browser.org/plugins/gopher/tree/io.c?h=fix-bsd#n10
Make sure you use the "fix-bsd" branch (currently at a32f745):
Thanks, I got the "fix-bsd" branch. Both OpenBSD and NetBSD compiled without warnings. Plus testing succeeded, no issues on either system. I think the issues are fixed. [...]
I attached the warnings to this email as warn_openbsd.txt in case you want it. I think many of the warnings can be ignored.
NetBSD has no warnings and it too works fine.
All those warnings should be fixed in the fix-bsd branch. Additional problems may be caught by the new CFLAGS flags that stick to the C99 standard (no GNUsisms) and POSIX 2001.
Correct, no warnings anywhere.
Best, Rodrigo.
Thanks for all your work, John
participants (2)
-
John McCue -
Rodrigo Arias