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()