From nobody@FreeBSD.org  Fri Jan  6 21:02:17 2006
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 787D316A41F
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  6 Jan 2006 21:02:17 +0000 (GMT)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [216.136.204.117])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 445D643D45
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  6 Jan 2006 21:02:17 +0000 (GMT)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.13.1/8.13.1) with ESMTP id k06L2Gmv018672
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 6 Jan 2006 21:02:16 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.13.1/8.13.1/Submit) id k06L2GgQ018671;
	Fri, 6 Jan 2006 21:02:16 GMT
	(envelope-from nobody)
Message-Id: <200601062102.k06L2GgQ018671@www.freebsd.org>
Date: Fri, 6 Jan 2006 21:02:16 GMT
From: Tanaka Akira <akr@m17n.org>
To: freebsd-gnats-submit@FreeBSD.org
Subject: FD_ISSET returns long, not int.
X-Send-Pr-Version: www-2.3

>Number:         91421
>Category:       ia64
>Synopsis:       FD_ISSET returns long, not int.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ia64
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jan 06 21:10:02 GMT 2006
>Closed-Date:    Fri Jan 13 03:13:18 GMT 2006
>Last-Modified:  Fri Jan 13 03:13:18 GMT 2006
>Originator:     Tanaka Akira
>Release:        6.0-RELEASE
>Organization:
AIST
>Environment:
FreeBSD td150.testdrive.hp.com 6.0-RELEASE FreeBSD 6.0-RELEASE #0: Wed Nov  2 10:01:27 UTC 2005     root@pluto2.freebsd.org:/usr/obj/usr/src/sys/GENERIC  ia64

>Description:
On IA64 (and other LP64 environments),
(int)FD_ISSET(32, &fds) is evaluated to 0, even if 32 is set in fds.

Since SUSv3 defines FD_ISSET defines as follows, cast to int should be safe.

    int FD_ISSET(int fd, fd_set *fdset);

This problem is caused because FD_ISSET() returns single unsigned long bitmap.
(__fds_bits is an array of unsigned long)

td150.testdrive.hp.com> grep FD_ISSET /usr/include/sys/select.h
#define FD_ISSET(n, p)  ((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n))

Since unsigned long is longer than int on LP64, 
(int)FD_ISSET() discards upper 32bits.

>How-To-Repeat:
td150.testdrive.hp.com> cat tst.c
#include <stdio.h>
#include <sys/select.h>

int main()
{
  fd_set fds;
  FD_ZERO(&fds);
  FD_SET(32, &fds);
  printf("%d\n", (int)FD_ISSET(32, &fds));
  printf("%lx\n", (long)FD_ISSET(32, &fds));
  return 0;
}
td150.testdrive.hp.com> gcc tst.c
td150.testdrive.hp.com> ./a.out
0
100000000

>Fix:
add "!= 0".

#define FD_ISSET(n, p)  (((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0)

>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->patched 
State-Changed-By: marcel 
State-Changed-When: Fri Jan 6 22:13:20 UTC 2006 
State-Changed-Why:  
Fix committed to -CURRENT and will be merged onto the 6.x branch in a week. 
Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=91421 
State-Changed-From-To: patched->closed 
State-Changed-By: marcel 
State-Changed-When: Fri Jan 13 03:12:14 UTC 2006 
State-Changed-Why:  
Fixed as of version 6.1. 


http://www.freebsd.org/cgi/query-pr.cgi?pr=91421 
>Unformatted:
