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
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()
_______________________________________________
Dillo-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]