Closed Bug 30914 Opened 25 years ago Closed 24 years ago

PR_PushIOLayer should not swap the contents of the fd's

Categories

(NSPR :: NSPR, defect, P3)

defect

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: wtc, Assigned: srinivas)

Details

Attachments

(1 file)

When we push a fd onto the top of a fd stack,
the current implementation of PR_PushIOLayer
swaps the contents of the new fd and the fd at
the top of the stack so that the address of
the top of the stack won't change. (PR_PopIOLayer
switches the contents back if the top of a stack
is popped.)  While this fd swapping is not obvious,
things do work correctly if you push and pop the
fd's in the right order.

However, this fd swapping is problematic if you
pass a pointer to a fd to some callback function
and then push some other fd on top of that fd.
The pointer you passed to the callback function
will be pointing to the contents of the new
fd.  We ran into this problem in our Mac socket
I/O code where we pass a pointer to a fd to OpenTransport
notifier routines.

We can avoid the fd content swapping by adding a dummy
top fd and always push new fd's underneath the
dummy top fd.  Then the address of the top of the stack
will also remain unchanged after pushing and popping.

Since this change will break backward compatibility,
it can only be considered for NSPR 5.0.
How about adding the new functionality without breaking existing API:

- Define new functions, say, PR_CreateLayer and PR_DestroyLayer, to create and 
destroy the dummy FD.
- Modify PR_PushIOLayer/PopIOLayer to recognize the dummy FD (at the top of the 
stack). These functions work the same way for the current type of layers.
That's a good idea.  We probably can get by with just
a PR_CreateLayer function.  It seems that the functionality
of PR_DestroyLayer can be subsumed by PR_PopIOLayer or
PR_Close.
The following patch defines a new function, PR_CreateIOLayer, for a creating the 
new style stack with a dummy header. To destroy a stack, PR_Close can be called 
for the top of the stack.
The test program pr/tests/layer.c is modified to create the new style stack.
Status: NEW → ASSIGNED
Checked in the patch.

Files modified:

/cvsroot/mozilla/nsprpub/pr/include/prio.h,v  <--  prio.h
new revision: 3.22; previous revision: 3.21

/cvsroot/mozilla/nsprpub/pr/src/io/prlayer.c,v  <--  prlayer.c
new revision: 3.11; previous revision: 3.10

/cvsroot/mozilla/nsprpub/pr/tests/layer.c,v  <--  layer.c
new revision: 3.7; previous revision: 3.6

Markign fixed.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Target Milestone: --- → 4.1
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: