Re: dillo plugin patches
John McCue <[email protected]> Sat, 1 Nov 2025 15:36:49 -0400
| Newsgroups | gmane.comp.web.dillo.devel |
|---|---|
| Message-ID | <[email protected]> |
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
_______________________________________________
Dillo-dev mailing list -- dillo-dev-lx9mn2B4QYRWk0Htik3J/[email protected]
To unsubscribe send an email to dillo-dev-leave-lx9mn2B4QYRWk0Htik3J/[email protected]
warn_openbsd.txt
(text/plain, 3.3 KB)
cc -c -o gopher.filter.dpi.o gopher.filter.dpi.c
gopher.filter.dpi.c:222:36: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
222 | printf("<tr><td>%s</td><td><pre>%*s<a href=\"", icon(type), indent, "");
| ~~^ ~~~~~~
gopher.filter.dpi.c:256:20: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
256 | printf("\"><pre>%*s", indent, "");
| ~~^ ~~~~~~
gopher.filter.dpi.c:257:14: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
257 | printf("\n%*s<input name=__gopher__query__ size=72 placeholder=\"", indent, "");
| ~~^ ~~~~~~
gopher.filter.dpi.c:270:36: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
270 | printf("<tr><td>%s</td><td><pre>%*s<a href=\"telnet://", icon(type), indent, "");
| ~~^ ~~~~~~
4 warnings generated.
cc -c -o io.o io.c
cc -c -o dpi.o dpi.c
dpi.c:19:47: warning: format specifies type 'unsigned int *' but the argument has type 'char *' [-Wformat]
19 | rc = sscanf(buf, "<cmd='auth' msg='%4x' '>", key);
| ~~~ ^~~
| %3s
dpi.c:26:35: warning: format specifies type 'unsigned int *' but the argument has type 'char *' [-Wformat]
26 | rc = sscanf(keys, "%*d %4x' '>", local_key);
| ~~~ ^~~~~~~~~
| %3s
dpi.c:27:34: warning: field precision should have type 'int', but argument has type 'ssize_t' (aka 'long') [-Wformat]
27 | if (rc < 0) err(1, "comm key: %.*s", sz, keys);
| ~~^~ ~~
dpi.c:28:35: warning: field precision should have type 'int', but argument has type 'ssize_t' (aka 'long') [-Wformat]
28 | if (rc < 1) errx(1, "comm key: %.*s", sz, keys);
| ~~^~ ~~
dpi.c:18:2: warning: array index 30 is past the end of the array (that has type 'char[30]') [-Warray-bounds]
18 | buf[30] = '\0';
| ^ ~~
dpi.c:10:2: note: array 'buf' declared here
10 | char buf[30];
| ^
dpi.c:41:31: warning: field precision should have type 'int', but argument has type 'unsigned long' [-Wformat]
41 | err(1, "bad open_url cmd: %.*s", sizeof(buf), buf);
| ~~^~ ~~~~~~~~~~~
dpi.c:51:26: warning: field precision should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
51 | err(1, "bad url end: %.*s", len, url_buf);
| ~~^~ ~~~
7 warnings generated.
cc gopher.filter.dpi.o io.o dpi.o -o gopher.filter.dpi
ld: warning: gopher.filter.dpi.c(gopher.filter.dpi.o:(respond)): warning: strcpy() is almost always misused, please use strlcpy()