When running www/squidguard on amd64 (and I assume other 64-bit
platforms), it segfaults.   It fails in the call to the sgDbUpdate
function:

  sgDbUpdate(sp->userDb, user, (char *) setuserinfo(),
            sizeof(struct UserInfo));

This code would be fine, except that setuserinfo is not actually
declared.  When you call an undeclared function in C, it assumes a
return type of int, which is 32-bit on amd64.  However, it should
be returning a 64-bit pointer.  So you end up losing the high bits
in the pointer, and it no longer references a valid address.

The only reason this doesn't fail on 32-bit platforms is that
sizeof(int) == sizeof(char *) on those platforms.

Found the hard way by me.  I tried to report it upstream, but their
bugtracker appears to be down.

OKs for the patch below?

Thanks,
Jeremy

Index: Makefile
===================================================================
RCS file: /cvs/ports/www/squidguard/Makefile,v
retrieving revision 1.18
diff -u -p -r1.18 Makefile
--- Makefile    12 Jun 2013 20:36:34 -0000      1.18
+++ Makefile    12 Aug 2013 17:09:29 -0000
@@ -3,7 +3,7 @@
 COMMENT =              filter, redirector and access controller for Squid
 
 DISTNAME =             squidGuard-1.4
-REVISION =             6
+REVISION =             7
 CATEGORIES =           www
 
 HOMEPAGE =             http://www.squidguard.org/
Index: patches/patch-src_sg_h_in
===================================================================
RCS file: /cvs/ports/www/squidguard/patches/patch-src_sg_h_in,v
retrieving revision 1.1
diff -u -p -r1.1 patch-src_sg_h_in
--- patches/patch-src_sg_h_in   9 Feb 2010 13:44:28 -0000       1.1
+++ patches/patch-src_sg_h_in   12 Aug 2013 16:58:14 -0000
@@ -2,8 +2,12 @@ $OpenBSD: patch-src_sg_h_in,v 1.1 2010/0
 
 squidGuard 1.4 patch 20091019; increase MAX_BUF above squid's MAX_URL value.
 
---- src/sg.h.in.orig   Fri Nov 16 16:58:32 2007
-+++ src/sg.h.in        Wed Feb  3 12:26:15 2010
+Fix segfault on 64-bit due to calling an undeclared function.  The function
+is supposed to return a pointer (64-bit) but when undeclared returns an int
+(32-bit). 
+
+--- src/sg.h.in.orig   Fri Nov 16 08:58:32 2007
++++ src/sg.h.in        Mon Aug 12 02:40:28 2013
 @@ -73,7 +73,7 @@ int tolower();
  #define REQUEST_TYPE_REDIRECT   2
  #define REQUEST_TYPE_PASS       3
@@ -13,3 +17,11 @@ squidGuard 1.4 patch 20091019; increase 
  
  #define DEFAULT_LOGFILE "squidGuard.log"
  #define WARNING_LOGFILE "squidGuard.log"
+@@ -412,6 +412,7 @@ char   *niso __P((time_t));
+ struct UserQuotaInfo *setuserquota __P(());
+ void sgSourceUserQuota __P((char *, char *, char *));
+ 
++struct UserInfo *setuserinfo();
+ 
+ void   *sgMalloc __P((size_t));
+ void   *sgCalloc __P((size_t, size_t));

Reply via email to