]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3731: TOS setsockopt() requires int value
authorAmos Jeffries <squid3@treenet.co.nz>
Wed, 9 Jan 2013 00:14:43 +0000 (17:14 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 9 Jan 2013 00:14:43 +0000 (17:14 -0700)
FreeBSD is confirmed errors on 8-bit variable size. Other BSD are
documented in a way that implies they do as well, although not at this
stage confirmed to be failing.

Linux seems to be the only confirmed system working with 8-bit size sent
to setsockopt(). So we revert this to 'int' (32-bit or 64-bit) as was
working in Squid 3.1.

src/ip/Qos.cci

index 035f8a864eac55361c48c7e26f2cb4b9647403aa..ad77c452a4c381583725edaa718f964005628e2a 100644 (file)
@@ -4,8 +4,13 @@
 int
 Ip::Qos::setSockTos(const Comm::ConnectionPointer &conn, tos_t tos)
 {
-#ifdef IP_TOS
-    int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos_t));
+#if defined(IP_TOS)
+    // Bug 3731: FreeBSD produces 'invalid option'
+    // unless we pass it a 32-bit variable storing 8-bits of data.
+    // NP: it is documented as 'int' for all systems, even those like Linux which accept 8-bit char
+    //     so we convert to a int before setting.
+    int bTos = tos;
+    int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos));
     if (x < 0)
         debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IP_TOS) on " << conn << ": " << xstrerror());
     return x;