Bug 19971 - bug in /usr/include/sys/socket.h
Summary: bug in /usr/include/sys/socket.h
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: misc (show other bugs)
Version: 4.0-RELEASE
Hardware: Any Any
: Normal Affects Only Me
Assignee: Jeroen Ruigrok van der Werven
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2000-07-16 18:20 UTC by MartinKaeske
Modified: 2001-01-08 20:24 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description MartinKaeske 2000-07-16 18:20:01 UTC
 	/usr/include/sys/socket.h uses a macro called ALIGN (used by CMSG_DATA)
	but never defines one nor an additional header is included 
	(<machine/param.h> has an ALIGN-macro).
	This circumstance causes the compiler to assume ALIGN is a function
	and the linker to fail.

Fix: 

Either give socket.h an own ALIGN-macro or include <machine/param.h> in
	socket.h to use the ALIGN-macro of param.h. Or tell all the guys
	using socket.h-functions to include <machine/param.h> first.
	I prefer providing socket.h with an own macro, for example the one
	from <machine/param.h>
How-To-Repeat: 
	I hope the description makes it obvious :-)
Comment 1 Sheldon Hearn freebsd_committer freebsd_triage 2000-07-17 17:46:15 UTC
State Changed
From-To: open->feedback

Are you sure you're including the correct headers in the correct order   
as per the socket(2) manual page? 

#include <sys/types.h> 
#include <sys/socket.h>
Comment 2 Sheldon Hearn 2000-07-17 18:36:59 UTC
On Mon, 17 Jul 2000 19:33:32 +0200, Martin Kaeske wrote:

> int main(void)
> {
> 	struct cmsghdr cmsg;
> 	CMSG_DATA(&cmsg);
> 	exit(0);
> }

Oh right.  Geez, I remember a _huuuge_ discussion relating to this on
one of the mailing lists, but I can't remember what the issue was, nor
which listt. :-(

I'll dig around.

Ciao,
Sheldon.
Comment 3 Sheldon Hearn 2000-07-18 14:43:07 UTC
Right, I did some digging, which turned out to be useless.  So I asked
bruce Evans about the situation.  This was his reply.

Ciao,
Sheldon.

------- Forwarded Message

Date: Tue, 18 Jul 2000 23:37:32 +1000 (EST)
From: Bruce Evans <bde@zeta.org.au>
To: Sheldon Hearn <sheldonh@uunet.co.za>
Subject: Re: The CMSG_*() and ALIGN() macros
In-Reply-To: <48154.963919398@axl.ops.uunet.co.za>
Message-ID: <Pine.BSF.4.21.0007182324480.1464-100000@besplex.bde.org>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Tue, 18 Jul 2000, Sheldon Hearn wrote:

> Could you either point me at the right archive or explain why
> we shouldn't mandate the inclusion of <sys/param.h> instead of
> <sys/types.h> in the socket(2) manpage and others which include
> <sys/socket.h>?

Because <sys/socket.h> implements socket stuff, not all the goop in
<sys/param.h>.

> Is the final word that folks who want CMSG_*() should just know for
> themselves to do the right thing?  Would a new manual page for the
> macros help?

That is too much to ask, since we changed the interface.

Here is my last saved mail from shin about this.  I was essentially
happy with these patches, but don't seem to have replied.  I thought
that shin was going to commit them, but he disappeared almost immediately
after writing this.

Bruce

From bde Mon Apr  3 21:55:23 2000
Return-Path: <shin@nd.net.fujitsu.co.jp>
Received: from fgwmail5.fujitsu.co.jp (fgwmail5.fujitsu.co.jp [192.51.44.35])
	by mailman.zeta.org.au (8.8.7/8.8.7) with ESMTP id CAA15739
	for <bde@zeta.org.au>; Mon, 3 Apr 2000 02:09:11 +1000
Received: from m5.gw.fujitsu.co.jp by fgwmail5.fujitsu.co.jp (8.9.3/3.7W-MX0002-Fujitsu Gateway)
	id BAA16840 for <bde@zeta.org.au>; Mon, 3 Apr 2000 01:09:09 +0900 (JST)
	(envelope-from shin@nd.net.fujitsu.co.jp)
Received: from incapgw.fujitsu.co.jp by m5.gw.fujitsu.co.jp (8.9.3/3.7W-0003-Fujitsu Domain Master)
	id BAA27587; Mon, 3 Apr 2000 01:09:08 +0900 (JST)
Received: from localhost ([192.168.245.154]) by incapgw.fujitsu.co.jp (8.9.3/3.7W-0002)
	id BAA11137; Mon, 3 Apr 2000 01:09:05 +0900 (JST)
To: bde@zeta.org.au
Subject: Re: 'machine/param.h' required for 'sys/socket.h' 
In-Reply-To: <Pine.BSF.4.21.0004021744400.1236-100000@alphplex.bde.org>
References: <20000402074908D.shin@nd.net.fujitsu.co.jp>
	<Pine.BSF.4.21.0004021744400.1236-100000@alphplex.bde.org>
X-Mailer: Mew version 1.94 on Emacs 20.4 / Mule 4.0 (HANANOEN)
X-Prom-Mew: Prom-Mew 1.93.4 (procmail reader for Mew)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Mon_Apr__3_01:09:57_2000_809)--"
Content-Transfer-Encoding: 7bit
Message-Id: <20000403011000P.shin@nd.net.fujitsu.co.jp>
Date: Mon, 03 Apr 2000 01:10:00 +0900
From: Yoshinobu Inoue <shin@nd.net.fujitsu.co.jp>
X-Dispatcher: imput version 990905(IM130)
Content-Length: 7447
Lines: 246
Status: RO
X-Status: 
X-Keywords:                 
X-UID: 19734

- ----Next_Part(Mon_Apr__3_01:09:57_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

> > Index: alpha/include/param.h
> > ===================================================================
> > RCS file: /home/ncvs/src/sys/alpha/include/param.h,v
> > retrieving revision 1.17
> > diff -u -r1.17 param.h
> 
> Similarly.  Diffing the alpha version with the i386 versions shows many
> gratuitous differences and bugs (broken dbtob() on alpha...).  It's
> interesting that the alpha version doesn't have
> "#ifndef _MACHINE_PARAM_H_ ...".

Yes, so maybe there is no multiple inclusion for <sys/param.h>
and <sys/pipe.h>.

I once tried to merge some differences between param.h for
i386 and alpha, but quit it because I thought it might create
new namespace pollution for the copied side.
(Or is it permissible?)

Also I didn't touched dbtob() macro, because I don't know what
is correct fix for alpha.

I attach the updated patches.
Please let me know if you think other changes(like ones I
withhold above) should also be fixed in this time.

Yoshinobu Inoue


- ----Next_Part(Mon_Apr__3_01:09:57_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="namespace.diff2"

Index: sys/socket.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/socket.h,v
retrieving revision 1.39
diff -u -r1.39 socket.h
- --- sys/socket.h	2000/03/11 19:51:04	1.39
+++ sys/socket.h	2000/04/02 15:09:58
@@ -37,6 +37,14 @@
 #ifndef _SYS_SOCKET_H_
 #define	_SYS_SOCKET_H_
 
+#ifdef _NO_NAMESPACE_POLLUTION
+#include <machine/param.h>
+#else
+#define	_NO_NAMESPACE_POLLUTION
+#include <machine/param.h>
+#undef	_NO_NAMESPACE_POLLUTION
+#endif
+
 /*
  * Definitions related to sockets: types, address families, options.
  */
@@ -352,20 +360,20 @@
 
 /* given pointer to struct cmsghdr, return pointer to data */
 #define	CMSG_DATA(cmsg)		((u_char *)(cmsg) + \
- -				 ALIGN(sizeof(struct cmsghdr)))
+				 _ALIGN(sizeof(struct cmsghdr)))
 
 /* given pointer to struct cmsghdr, return pointer to next cmsghdr */
 #define	CMSG_NXTHDR(mhdr, cmsg)	\
- -	(((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
- -	  ALIGN(sizeof(struct cmsghdr)) > \
+	(((caddr_t)(cmsg) + _ALIGN((cmsg)->cmsg_len) + \
+	  _ALIGN(sizeof(struct cmsghdr)) > \
 	    (caddr_t)(mhdr)->msg_control + (mhdr)->msg_controllen) ? \
 	    (struct cmsghdr *)NULL : \
- -	    (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len)))
+	    (struct cmsghdr *)((caddr_t)(cmsg) + _ALIGN((cmsg)->cmsg_len)))
 
 #define	CMSG_FIRSTHDR(mhdr)	((struct cmsghdr *)(mhdr)->msg_control)
 
- -#define	CMSG_SPACE(l)		(ALIGN(sizeof(struct cmsghdr)) + ALIGN(l))
- -#define	CMSG_LEN(l)		(ALIGN(sizeof(struct cmsghdr)) + (l))
+#define	CMSG_SPACE(l)		(_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(l))
+#define	CMSG_LEN(l)		(_ALIGN(sizeof(struct cmsghdr)) + (l))
 
 /* "Socket"-level control message types: */
 #define	SCM_RIGHTS	0x01		/* access rights (array of int) */
Index: i386/include/param.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/param.h,v
retrieving revision 1.55
diff -u -r1.55 param.h
- --- i386/include/param.h	2000/03/29 05:39:04	1.55
+++ i386/include/param.h	2000/04/02 15:09:58
@@ -37,21 +37,37 @@
  * $FreeBSD: src/sys/i386/include/param.h,v 1.55 2000/03/29 05:39:04 jlemon Exp $
  */
 
- -#ifndef _MACHINE_PARAM_H_
- -#define	_MACHINE_PARAM_H_
- -
 /*
  * Machine dependent constants for Intel 386.
  */
+
+/*
+ * Round p (pointer or byte index) up to a correctly-aligned value
+ * for all data types (int, long, ...).   The result is unsigned int
+ * and must be cast to any desired pointer type.
+ */
+#ifndef _ALIGNBYTES
+#define	_ALIGNBYTES	(sizeof(int) - 1)
+#endif
+#ifndef _ALIGN
+#define	_ALIGN(p)	(((unsigned)(p) + _ALIGNBYTES) & ~_ALIGNBYTES)
+#endif
+
 #ifndef _MACHINE
 #define	_MACHINE	i386
 #endif
- -#ifndef MACHINE
- -#define MACHINE		"i386"
- -#endif
 #ifndef _MACHINE_ARCH
 #define	_MACHINE_ARCH	i386
 #endif
+
+#ifndef _NO_NAMESPACE_POLLUTION
+
+#ifndef _MACHINE_PARAM_H_
+#define	_MACHINE_PARAM_H_
+
+#ifndef MACHINE
+#define	MACHINE		"i386"
+#endif
 #ifndef MACHINE_ARCH
 #define	MACHINE_ARCH	"i386"
 #endif
@@ -70,13 +86,8 @@
 #define NCPUS		1
 #endif
 
- -/*
- - * Round p (pointer or byte index) up to a correctly-aligned value
- - * for all data types (int, long, ...).   The result is unsigned int
- - * and must be cast to any desired pointer type.
- - */
- -#define ALIGNBYTES	(sizeof(int) - 1)
- -#define ALIGN(p)	(((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES)
+#define	ALIGNBYTES	_ALIGNBYTES
+#define	ALIGN(p)	_ALIGN(p)
 
 #define PAGE_SHIFT	12		/* LOG2(PAGE_SIZE) */
 #define PAGE_SIZE	(1<<PAGE_SHIFT)	/* bytes/page */
@@ -158,3 +169,4 @@
 #define	pgtok(x)		((x) * (PAGE_SIZE / 1024))
 
 #endif /* !_MACHINE_PARAM_H_ */
+#endif /* !_NO_NAMESPACE_POLLUTION */
Index: alpha/include/param.h
===================================================================
RCS file: /home/ncvs/src/sys/alpha/include/param.h,v
retrieving revision 1.17
diff -u -r1.17 param.h
- --- alpha/include/param.h	2000/02/29 08:48:10	1.17
+++ alpha/include/param.h	2000/04/02 15:09:58
@@ -46,15 +46,43 @@
 /*
  * Machine dependent constants for the Alpha.
  */
+
+/*
+ * Round p (pointer or byte index) up to a correctly-aligned value for all
+ * data types (int, long, ...).   The result is u_long and must be cast to
+ * any desired pointer type.
+ *
+ * ALIGNED_POINTER is a boolean macro that checks whether an address
+ * is valid to fetch data elements of type t from on this architecture.
+ * This does not reflect the optimal alignment, just the possibility
+ * (within reasonable limits). 
+ *
+ */
+#ifndef _ALIGNBYTES
+#define	_ALIGNBYTES		7
+#endif
+#ifndef _ALIGN
+#define	_ALIGN(p)		(((u_long)(p) + _ALIGNBYTES) &~ _ALIGNBYTES)
+#endif
+#ifndef _ALIGNED_POINTER
+#define	_ALIGNED_POINTER(p,t)	((((u_long)(p)) & (sizeof(t)-1)) == 0)
+#endif
+
 #ifndef _MACHINE
 #define	_MACHINE	alpha
 #endif
- -#ifndef MACHINE
- -#define	MACHINE		"alpha"
- -#endif
 #ifndef _MACHINE_ARCH
 #define	_MACHINE_ARCH	alpha
 #endif
+
+#ifndef _NO_NAMESPACE_POLLUTION
+
+#ifndef _MACHINE_PARAM_H_
+#define	_MACHINE_PARAM_H_
+
+#ifndef MACHINE
+#define	MACHINE		"alpha"
+#endif
 #ifndef MACHINE_ARCH
 #define	MACHINE_ARCH	"alpha"
 #endif
@@ -72,20 +100,9 @@
 
 #define NCPUS		1
 
- -/*
- - * Round p (pointer or byte index) up to a correctly-aligned value for all
- - * data types (int, long, ...).   The result is u_long and must be cast to
- - * any desired pointer type.
- - *
- - * ALIGNED_POINTER is a boolean macro that checks whether an address
- - * is valid to fetch data elements of type t from on this architecture.
- - * This does not reflect the optimal alignment, just the possibility
- - * (within reasonable limits). 
- - *
- - */
- -#define	ALIGNBYTES		7
- -#define	ALIGN(p)		(((u_long)(p) + ALIGNBYTES) &~ ALIGNBYTES)
- -#define ALIGNED_POINTER(p,t)	((((u_long)(p)) & (sizeof(t)-1)) == 0)
+#define	ALIGNBYTES		_ALIGNBYTES
+#define	ALIGN(p)		_ALIGN(p)
+#define	ALIGNED_POINTER(p,t)	_ALIGNED_POINTER(p,t)
 
 #define	PAGE_SIZE	(1 << ALPHA_PGSHIFT)		/* bytes/page */
 #define PAGE_SHIFT	ALPHA_PGSHIFT
@@ -161,3 +178,6 @@
 #define	alpha_ptob(x)		((unsigned long)(x) << PAGE_SHIFT)
 
 #define pgtok(x)                ((x) * (PAGE_SIZE / 1024)) 
+
+#endif /* !_MACHINE_PARAM_H_ */
+#endif /* !_NO_NAMESPACE_POLLUTION */

- ----Next_Part(Mon_Apr__3_01:09:57_2000_809)----




------- End of Forwarded Message
Comment 4 Sheldon Hearn freebsd_committer freebsd_triage 2000-07-19 13:11:50 UTC
State Changed
From-To: feedback->open

After some research, it appears that Yoshinobu Inoue has already 
formulated a proposed patch for this.  Unfortunately, Inoue-san 
is unavailable at present, so what this PR really needs now is 
for some brave soul to step into the quagmire.
Comment 5 MartinKaeske 2000-07-20 17:24:35 UTC
Why doesn't we simply add an  ALIGN macro to socket.h?
Something like :

#ifdef ALIGNBYTES
#define ALIGNBYTES   (sizeof(int) - 1)
#ifdef ALIGN
#define ALIGN(p)  (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES)
#endif  /* ALIGN */
#endif  /* ALIGNBYTES */

I think it's better than including <machine/param.h> just for a single
macro,
Comment 6 Jeroen Ruigrok van der Werven freebsd_committer freebsd_triage 2000-08-23 12:36:02 UTC
Responsible Changed
From-To: freebsd-bugs->asmodai

I'm working on solving this issue.
Comment 7 Jeroen Ruigrok van der Werven freebsd_committer freebsd_triage 2000-11-14 09:29:34 UTC
State Changed
From-To: open->feedback

CURRENT now has a solution in the source code. 
This will be revisited soon since Bruce Evans had some improvements. 

But this should at least remove the bogus dependency introduced in the 
header files. 
4-STABLE will be done as soon as the solution in CURRENT is final.
Comment 8 Jeroen Ruigrok van der Werven freebsd_committer freebsd_triage 2001-01-08 20:23:54 UTC
State Changed
From-To: feedback->closed

Fix present in both CURRENT and 4.2-STABLE.