2 * Copyright (c) 2003 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 // transwalkers - server side transition data walking support
22 // These are data walker operators for securely marshaling and unmarshaling
23 // data structures across IPC. They are also in charge of fixing byte order
24 // inconsistencies between server and clients.
26 #include <transwalkers.h>
29 using LowLevelMemoryUtilities::increment
;
30 using LowLevelMemoryUtilities::difference
;
35 return Server::connection().process
.byteFlipped();
40 // CheckingRelocateWalkers
42 CheckingReconstituteWalker::CheckingReconstituteWalker(void *ptr
, void *base
, size_t size
, bool flip
)
43 : mBase(base
), mFlip(flip
)
46 Flippers::flip(mBase
); // came in reversed; fix for base use
47 mOffset
= difference(ptr
, mBase
);
48 mLimit
= increment(mBase
, size
);
55 void relocate(Context
&context
, void *base
, Context::Attr
*attrs
, uint32 attrSize
)
58 CheckingReconstituteWalker
relocator(attrs
, base
, attrSize
, flipClient());
59 context
.ContextAttributes
= attrs
; // fix context->attr vector link
60 for (uint32 n
= 0; n
< context
.attributesInUse(); n
++)
61 walk(relocator
, context
[n
]);
66 // Outbound flipping support
68 FlipWalker::~FlipWalker()
70 for (set
<Flipper
>::const_iterator it
= mFlips
.begin(); it
!= mFlips
.end(); it
++)
74 void FlipWalker::doFlips(bool active
)
77 secdebug("flipwalkers", "starting outbound flips");
78 for (set
<Flipper
>::const_iterator it
= mFlips
.begin(); it
!= mFlips
.end(); it
++)
80 secdebug("flipwalkers", "outbound flips done");