Closed Bug 235 Opened 26 years ago Closed 24 years ago

PRNetAddr doesn't match sockaddr_in

Categories

(NSPR :: NSPR, defect, P3)

Other
BSDI
defect

Tracking

(Not tracked)

VERIFIED FIXED

People

(Reporter: driehuis, Assigned: wtc)

Details

Created by Bert Driehuis (driehuis@playbeing.org) on Wednesday, April 15, 1998 4:01:59 PM PDT Additional Details : Building Mozilla 1998-04-08 fails on BSD/OS 3.0. On investigation, the definition of PRNetAddr (which is cast into a sockaddr_in in ns/nsprpub/src/md/unix/unix.c in the MD_connect routine) turns out to use a short in host order for the sin_family field. BSD/OS 3.0 (and I'd imagine all 4.4lite2 derived unixes, but I haven't checked) define this field as u_char sa_len; u_char sa_family; which happens to be byte-swapped w.r.t. the assumptions in ns/nsprpub/include/prio.h, where these two bytes are addressed as one PRUint16. This needs to be addressed, probably in ns/nsprpub/src/md/unix/unix.c, by filling in a sockaddr_in from the PRNetAddr structure, before performing the connect. I haven't provided a fix, since I'm not positive about the proper way of fixing it. I'll see if I can come up with a solution that works with BSD/OS 3.0 without obviously breaking ports on which casting to sockaddr_in works. Updated by Bert Driehuis (driehuis@playbeing.org) on Wednesday, April 15, 1998 4:35:06 PM PDT Additional Details : This patch gets the BSDI 3.0 version working: *** nsprpub/pr/src/md/unix/unix.c.dist Thu Apr 9 02:52:30 1998 --- nsprpub/pr/src/md/unix/unix.c Thu Apr 16 01:21:47 1998 *************** *** 1062,1065 **** --- 1062,1072 ---- PRThread *me = _PR_MD_CURRENT_THREAD(); PRInt32 osfd = fd->secret->md.osfd; + #ifdef __bsdi__ + struct sockaddr the_addr; + the_addr = *((struct sockaddr *)addr); + the_addr.sa_len = sizeof(the_addr); + the_addr.sa_family = addr->inet.family; + addr = (PRNetAddr *) &the_addr; + #endif #ifdef IRIX extern PRInt32 _MD_irix_connect( *************** *** 2317,2321 **** osflags |= O_TRUNC; if (flags & PR_SYNC) { ! #if defined(FREEBSD) osflags |= O_FSYNC; #else --- 2324,2328 ---- osflags |= O_TRUNC; if (flags & PR_SYNC) { ! #if defined(FREEBSD) || defined(__bsdi__) osflags |= O_FSYNC; #else (the FreeBSD/BSDI fix could probably have been avoided by conditionalizing on BS D44LITE2 or something like that, that would help NetBSD as well, I guess). Are there any systems that Mozilla runs on that don't define sa_len? I could unfortunately not update my report using Mozilla 1998-04-08 because of apparent JavaScript lossage ("try again: you didn't specify a short description). Fortunately, 4.04 works just fine :-) Updated by Wan-Teh Chang (wtc@netscape.com) on Wednesday, May 6, 1998 8:02:09 PM PDT Additional Details : Assigned bug to myself. The O_FSYNC bug has been fixed. I will look at the sockaddr_in.sa_len bug. Updated by Wan-Teh Chang (wtc@netscape.com) on Thursday, May 7, 1998 8:56:24 AM PDT Additional Details : I just fixed the sockaddr_in.sa_len problem in mozilla/nsprpub/pr/include/md/_bsdi.h, revision 3.2, in conjunction with a prior fix to mozilla/nsprpub/pr/src/md/unix.c. I define the macro _PR_HAVE_SOCKADDR_LEN in _bsdi.h. (This macro is also defined for _aix.h, _freebsd.h, and _rhapsody.h, indicating their BSD4.4 heritage.) The code in unix.c checks the _PR_HAVE_SOCKADDR_LEN macro and does the appropriate things. I ran a few socket tests (in mozilla/nsprpub/pr/tests) on our BSD/OS 2.1 and 3.0 machines and they all pased. Closed the bug. PS: To answer your question, yes, there are platforms that do not have a length field in their sockaddr, e.g., Solaris.
NSPR now has its own Bugzilla product. Moving this bug to the NSPR product.
these bugs are closed but have no resolution. reopening...
Status: CLOSED → REOPENED
marking as fixed.
Status: REOPENED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
VERIFIED due to no changes in over a year
Status: RESOLVED → VERIFIED
Blocks: 1297618
No longer blocks: 1297618
You need to log in before you can comment on or make changes to this bug.