Re: dillo plugin patches

Rodrigo Arias <[email protected]> Sat, 1 Nov 2025 00:34:17 +0100
Newsgroups gmane.comp.web.dillo.devel
Message-ID <[email protected]>
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.
_______________________________________________
Dillo-dev mailing list -- dillo-dev-lx9mn2B4QYRWk0Htik3J/[email protected]
To unsubscribe send an email to dillo-dev-leave-lx9mn2B4QYRWk0Htik3J/[email protected]