On Feb 9, 2012, at 7:04 PM, Guy Harris wrote:

> *However*, that's not the only place where structures involving times get 
> passed between the kernel and userland.  They *also* get passed in the 
> BIOCGRTIMEOUT and BIOCSRTIMEOUT ioctls, the argument to which is a pointer to 
> a struct timeval.  This being a BSD-flavored OS, the ioctl cookie includes 
> the size of the structure, so an ioctl with a 32-bit struct timeval will have 
> a different ioctl cookie from an ioctl with a 64-bit struct timeval.
> 
> From a quick look at the top of the trunk, _BSD_TIME_T_ is always defined as 
> __int64_t and _BSD_SUSECONDS_T_ is always defined as int, so struct timeval 
> would, *modulo padding at the end* (I presume that's the "48bits for i386 and 
> 64bits for amd64" - presumably meaning "48 bits for 32-bit platforms and 64 
> bits for 64-bit platforms"), be laid out the same, so that should work as 
> well.

Except that the padding means that the ioctl cookies will be different, so 
32-bit code that attempts a BIOCSRTIMEOUT on a 64-bit kernel will succeed only 
if the kernel has a case in the switch statement to handle the 32-bit version 
of the BIOCSRTIMEOUT cookie.  Given that struct timeval50 is

struct timeval50 {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* and microseconds */
};

BIOCSORTIMEOUT is *NOT* the 32-bit BIOCSRTIMEOUT cookie, so it appears that a 
64-bit kernel will *NOT* handle a BIOCSRTIMEOUT from 32-bit userland, so any 
32-bit program that uses a libpcap built 32-bit on NetBSD with a 64-bit time_t 
will not work (that includes, but is not necessarily limited to, tcpdump).

Fixing that will require defining, on a 64-bit kernel, an ioctl cookie with the 
codes for BIOCSRTIMEOUT and with the size of a 48-bit struct timeval, and 
putting into bpf_ioctl() a case for that cookie that handles the 48-bit struct 
timeval argument.  (The same should be done for BIOCGRTIMEOUT; with the 
possible exception of BIOCGETIF and BIOCSETIF, it looks as if the other BPF 
ioctls have the same in-memory arguments in 32-bit and 64-bit mode.)-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.

Reply via email to