lio 0.11.5.0 → 0.11.6.0
raw patch · 16 files changed
+441/−41 lines, 16 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- LIO.Concurrent: relActualLabel :: ResultExceedsLabel l -> Maybe l
- LIO.Concurrent: relContext :: ResultExceedsLabel l -> [String]
- LIO.Concurrent: relDeclaredLabel :: ResultExceedsLabel l -> l
- LIO.Concurrent: relLocation :: ResultExceedsLabel l -> String
- LIO.Core: inspContext :: InsufficientPrivs -> [String]
- LIO.Core: inspFailure :: InsufficientPrivs -> String
- LIO.Core: inspNeeded :: InsufficientPrivs -> p
- LIO.Core: inspSupplied :: InsufficientPrivs -> p
- LIO.Core: instance Label l => MonadLIO l (LIO l)
- LIO.Core: lerrContext :: LabelError l -> [String]
- LIO.Core: lerrCurClearance :: LabelError l -> l
- LIO.Core: lerrCurLabel :: LabelError l -> l
- LIO.Core: lerrFailure :: LabelError l -> String
- LIO.Core: lerrLabels :: LabelError l -> [l]
- LIO.Core: lerrPrivs :: LabelError l -> [GenericPrivDesc l]
- LIO.Core: lioClearance :: LIOState l -> !l
- LIO.Core: lioLabel :: LIOState l -> !l
- LIO.DCLabel: dcIntegrity :: DCLabel -> !CNF
- LIO.DCLabel: dcSecrecy :: DCLabel -> !CNF
- LIO.DCLabel: instance Eq CNF
- LIO.DCLabel: instance Eq DCLabel
- LIO.DCLabel: instance Eq Disjunction
- LIO.DCLabel: instance Eq Principal
- LIO.DCLabel: instance Label DCLabel
- LIO.DCLabel: instance Monoid CNF
- LIO.DCLabel: instance Monoid Disjunction
- LIO.DCLabel: instance Ord CNF
- LIO.DCLabel: instance Ord DCLabel
- LIO.DCLabel: instance Ord Disjunction
- LIO.DCLabel: instance Ord Principal
- LIO.DCLabel: instance PrivDesc DCLabel CNF
- LIO.DCLabel: instance Read CNF
- LIO.DCLabel: instance Read DCLabel
- LIO.DCLabel: instance Read Disjunction
- LIO.DCLabel: instance Read Principal
- LIO.DCLabel: instance Show CNF
- LIO.DCLabel: instance Show DCLabel
- LIO.DCLabel: instance Show Disjunction
- LIO.DCLabel: instance Show Principal
- LIO.DCLabel: instance SpeaksFor CNF
- LIO.DCLabel: instance ToCNF (Priv CNF)
- LIO.DCLabel: instance ToCNF Bool
- LIO.DCLabel: instance ToCNF CNF
- LIO.DCLabel: instance ToCNF Disjunction
- LIO.DCLabel: instance ToCNF Principal
- LIO.DCLabel: instance ToCNF [Char]
- LIO.DCLabel: instance Typeable CNF
- LIO.DCLabel: instance Typeable DCLabel
- LIO.DCLabel: instance Typeable Disjunction
- LIO.DCLabel: instance Typeable Principal
- LIO.Delegate: instance Typeable2 Gate
- LIO.Error: inspContext :: InsufficientPrivs -> [String]
- LIO.Error: inspFailure :: InsufficientPrivs -> String
- LIO.Error: inspNeeded :: InsufficientPrivs -> p
- LIO.Error: inspSupplied :: InsufficientPrivs -> p
- LIO.Error: instance Annotatable (LabelError l)
- LIO.Error: instance Annotatable (ResultExceedsLabel l)
- LIO.Error: instance Annotatable AnyLabelError
- LIO.Error: instance Annotatable InsufficientPrivs
- LIO.Error: instance Exception AnyLabelError
- LIO.Error: instance Exception InsufficientPrivs
- LIO.Error: instance Label l => Exception (LabelError l)
- LIO.Error: instance Label l => Exception (ResultExceedsLabel l)
- LIO.Error: instance Show (GenericPrivDesc l)
- LIO.Error: instance Show AnyLabelError
- LIO.Error: instance Show InsufficientPrivs
- LIO.Error: instance Show l => Show (LabelError l)
- LIO.Error: instance Show l => Show (ResultExceedsLabel l)
- LIO.Error: instance Typeable AnyLabelError
- LIO.Error: instance Typeable InsufficientPrivs
- LIO.Error: instance Typeable1 LabelError
- LIO.Error: instance Typeable1 ResultExceedsLabel
- LIO.Error: lerrContext :: LabelError l -> [String]
- LIO.Error: lerrCurClearance :: LabelError l -> l
- LIO.Error: lerrCurLabel :: LabelError l -> l
- LIO.Error: lerrFailure :: LabelError l -> String
- LIO.Error: lerrLabels :: LabelError l -> [l]
- LIO.Error: lerrPrivs :: LabelError l -> [GenericPrivDesc l]
- LIO.Error: relActualLabel :: ResultExceedsLabel l -> Maybe l
- LIO.Error: relContext :: ResultExceedsLabel l -> [String]
- LIO.Error: relDeclaredLabel :: ResultExceedsLabel l -> l
- LIO.Error: relLocation :: ResultExceedsLabel l -> String
- LIO.Exception: SomeException :: e -> SomeException
- LIO.Label: instance Label l => PrivDesc l NoPrivs
- LIO.Label: instance Monoid NoPrivs
- LIO.Label: instance PrivDesc l p => PrivDesc l (Priv p)
- LIO.Label: instance Read NoPrivs
- LIO.Label: instance Show NoPrivs
- LIO.Label: instance SpeaksFor NoPrivs
- LIO.Label: instance SpeaksFor p => SpeaksFor (Priv p)
- LIO.Label: instance Typeable NoPrivs
- LIO.Run: lioClearance :: LIOState l -> !l
- LIO.Run: lioLabel :: LIOState l -> !l
- LIO.TCB: instance (Show l, Show a) => Show (LResStatus l a)
- LIO.TCB: instance (Show l, Show a) => ShowTCB (Labeled l a)
- LIO.TCB: instance Applicative (LIO l)
- LIO.TCB: instance Eq a => Eq (Priv a)
- LIO.TCB: instance Eq l => Eq (LIOState l)
- LIO.TCB: instance Exception UncatchableTCB
- LIO.TCB: instance Functor (LIO l)
- LIO.TCB: instance LabelOf Labeled
- LIO.TCB: instance LabelOf LabeledResult
- LIO.TCB: instance Monad (LIO l)
- LIO.TCB: instance Monoid p => Monoid (Priv p)
- LIO.TCB: instance Read l => Read (LIOState l)
- LIO.TCB: instance Show UncatchableTCB
- LIO.TCB: instance Show a => Show (Priv a)
- LIO.TCB: instance Show l => Show (LIOState l)
- LIO.TCB: instance Typeable UncatchableTCB
- LIO.TCB: instance Typeable1 Priv
- LIO.TCB: instance Typeable2 LIO
- LIO.TCB: instance Typeable2 Labeled
- LIO.TCB: lioClearance :: LIOState l -> !l
- LIO.TCB: lioLabel :: LIOState l -> !l
- LIO.TCB: lresBlockTCB :: LabeledResult l a -> !(MVar ())
- LIO.TCB: lresLabelTCB :: LabeledResult l a -> !l
- LIO.TCB: lresStatusTCB :: LabeledResult l a -> !(IORef (LResStatus l a))
- LIO.TCB: lresThreadIdTCB :: LabeledResult l a -> !ThreadId
- LIO.TCB.LObj: instance (Label l, Show t) => ShowTCB (LObj l t)
- LIO.TCB.LObj: instance GuardIO l (IO r) (LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> IO r) (a1 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> IO r) (a1 -> a2 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> IO r) (a1 -> a2 -> a3 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> IO r) (a1 -> a2 -> a3 -> a4 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> LIO l r)
- LIO.TCB.LObj: instance GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> LIO l r)
- LIO.TCB.LObj: instance LabelOf LObj
- LIO.TCB.LObj: instance Typeable2 LObj
- LIO.TCB.MLObj: instance LabelIO l (IO r) (LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> IO r) (a1 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> IO r) (a1 -> a2 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> IO r) (a1 -> a2 -> a3 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> IO r) (a1 -> a2 -> a3 -> a4 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> LIO l r)
- LIO.TCB.MLObj: instance LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> LIO l r)
- LIO.TCB.MLObj: instance MLabelOf MLObj
- LIO.TCB.MLObj: instance MLabelPolicy ExternalML l
- LIO.TCB.MLObj: instance MLabelPolicy InternalML l
- LIO.TCB.MLObj: instance MLabelPolicyDefault ExternalML
- LIO.TCB.MLObj: instance MLabelPolicyDefault InternalML
- LIO.TCB.MLObj: instance Show ExternalML
- LIO.TCB.MLObj: instance Show InternalML
- LIO.TCB.MLObj: instance Typeable ExternalML
- LIO.TCB.MLObj: instance Typeable InternalML
- LIO.TCB.MLObj: instance Typeable2 MLabel
- LIO.TCB.MLObj: instance Typeable3 MLObj
- LIO.TCB.MLObj: mlLabel :: MLabel policy l -> !(IORef l)
- LIO.TCB.MLObj: mlLabelLabel :: MLabel policy l -> !l
- LIO.TCB.MLObj: mlPolicy :: MLabel policy l -> policy
- LIO.TCB.MLObj: mlUsers :: MLabel policy l -> !(MVar (Map Unique (l -> IO Bool)))
+ LIO.Concurrent: [relActualLabel] :: ResultExceedsLabel l -> Maybe l
+ LIO.Concurrent: [relContext] :: ResultExceedsLabel l -> [String]
+ LIO.Concurrent: [relDeclaredLabel] :: ResultExceedsLabel l -> l
+ LIO.Concurrent: [relLocation] :: ResultExceedsLabel l -> String
+ LIO.Concurrent.LChan.Trans: dupLChan :: (MonadLIO l m, Label l) => LChan l a -> m (LChan l a)
+ LIO.Concurrent.LChan.Trans: dupLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LChan l a -> m (LChan l a)
+ LIO.Concurrent.LChan.Trans: newLChan :: (MonadLIO l m, Label l) => l -> m (LChan l a)
+ LIO.Concurrent.LChan.Trans: newLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m (LChan l a)
+ LIO.Concurrent.LChan.Trans: readLChan :: (MonadLIO l m, Label l) => LChan l a -> m a
+ LIO.Concurrent.LChan.Trans: readLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LChan l a -> m a
+ LIO.Concurrent.LChan.Trans: writeLChan :: (MonadLIO l m, Label l) => LChan l a -> a -> m ()
+ LIO.Concurrent.LChan.Trans: writeLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LChan l a -> a -> m ()
+ LIO.Concurrent.LMVar.Trans: isEmptyLMVar :: (MonadLIO l m, Label l) => LMVar l a -> m Bool
+ LIO.Concurrent.LMVar.Trans: isEmptyLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> m Bool
+ LIO.Concurrent.LMVar.Trans: newEmptyLMVar :: (MonadLIO l m, Label l) => l -> m (LMVar l a)
+ LIO.Concurrent.LMVar.Trans: newEmptyLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m (LMVar l a)
+ LIO.Concurrent.LMVar.Trans: newLMVar :: (MonadLIO l m, Label l) => l -> a -> m (LMVar l a)
+ LIO.Concurrent.LMVar.Trans: newLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (LMVar l a)
+ LIO.Concurrent.LMVar.Trans: putLMVar :: (MonadLIO l m, Label l) => LMVar l a -> a -> m ()
+ LIO.Concurrent.LMVar.Trans: putLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> a -> m ()
+ LIO.Concurrent.LMVar.Trans: readLMVar :: (MonadLIO l m, Label l) => LMVar l a -> m a
+ LIO.Concurrent.LMVar.Trans: readLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> m a
+ LIO.Concurrent.LMVar.Trans: swapLMVar :: (MonadLIO l m, Label l) => LMVar l a -> a -> m a
+ LIO.Concurrent.LMVar.Trans: swapLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> a -> m a
+ LIO.Concurrent.LMVar.Trans: takeLMVar :: (MonadLIO l m, Label l) => LMVar l a -> m a
+ LIO.Concurrent.LMVar.Trans: takeLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> m a
+ LIO.Concurrent.LMVar.Trans: tryPutLMVar :: (MonadLIO l m, Label l) => LMVar l a -> a -> m Bool
+ LIO.Concurrent.LMVar.Trans: tryPutLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> a -> m Bool
+ LIO.Concurrent.LMVar.Trans: tryTakeLMVar :: (MonadLIO l m, Label l) => LMVar l a -> m (Maybe a)
+ LIO.Concurrent.LMVar.Trans: tryTakeLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LMVar l a -> m (Maybe a)
+ LIO.Core: [inspContext] :: InsufficientPrivs -> [String]
+ LIO.Core: [inspFailure] :: InsufficientPrivs -> String
+ LIO.Core: [inspNeeded] :: InsufficientPrivs -> p
+ LIO.Core: [inspSupplied] :: InsufficientPrivs -> p
+ LIO.Core: [lerrContext] :: LabelError l -> [String]
+ LIO.Core: [lerrCurClearance] :: LabelError l -> l
+ LIO.Core: [lerrCurLabel] :: LabelError l -> l
+ LIO.Core: [lerrFailure] :: LabelError l -> String
+ LIO.Core: [lerrLabels] :: LabelError l -> [l]
+ LIO.Core: [lerrPrivs] :: LabelError l -> [GenericPrivDesc l]
+ LIO.Core: [lioClearance] :: LIOState l -> !l
+ LIO.Core: [lioLabel] :: LIOState l -> !l
+ LIO.Core.Trans: getClearance :: (MonadLIO l m, Label l) => m l
+ LIO.Core.Trans: getLabel :: (MonadLIO l m, Label l) => m l
+ LIO.Core.Trans: guardAlloc :: (MonadLIO l m, Label l) => l -> m ()
+ LIO.Core.Trans: guardAllocP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()
+ LIO.Core.Trans: guardWrite :: (MonadLIO l m, Label l) => l -> m ()
+ LIO.Core.Trans: guardWriteP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()
+ LIO.Core.Trans: setClearance :: (MonadLIO l m, Label l) => l -> m ()
+ LIO.Core.Trans: setClearanceP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()
+ LIO.Core.Trans: setLabel :: (MonadLIO l m, Label l) => l -> m ()
+ LIO.Core.Trans: setLabelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()
+ LIO.Core.Trans: taint :: (MonadLIO l m, Label l) => l -> m ()
+ LIO.Core.Trans: taintP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()
+ LIO.DCLabel: [dcIntegrity] :: DCLabel -> !CNF
+ LIO.DCLabel: [dcSecrecy] :: DCLabel -> !CNF
+ LIO.DCLabel: infix 6 %%
+ LIO.DCLabel: infixl 7 \/
+ LIO.DCLabel: infixr 7 /\
+ LIO.DCLabel: instance GHC.Base.Monoid LIO.DCLabel.CNF
+ LIO.DCLabel: instance GHC.Base.Monoid LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance GHC.Classes.Eq LIO.DCLabel.CNF
+ LIO.DCLabel: instance GHC.Classes.Eq LIO.DCLabel.DCLabel
+ LIO.DCLabel: instance GHC.Classes.Eq LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance GHC.Classes.Eq LIO.DCLabel.Principal
+ LIO.DCLabel: instance GHC.Classes.Ord LIO.DCLabel.CNF
+ LIO.DCLabel: instance GHC.Classes.Ord LIO.DCLabel.DCLabel
+ LIO.DCLabel: instance GHC.Classes.Ord LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance GHC.Classes.Ord LIO.DCLabel.Principal
+ LIO.DCLabel: instance GHC.Read.Read LIO.DCLabel.CNF
+ LIO.DCLabel: instance GHC.Read.Read LIO.DCLabel.DCLabel
+ LIO.DCLabel: instance GHC.Read.Read LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance GHC.Read.Read LIO.DCLabel.Principal
+ LIO.DCLabel: instance GHC.Show.Show LIO.DCLabel.CNF
+ LIO.DCLabel: instance GHC.Show.Show LIO.DCLabel.DCLabel
+ LIO.DCLabel: instance GHC.Show.Show LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance GHC.Show.Show LIO.DCLabel.Principal
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF (LIO.TCB.Priv LIO.DCLabel.CNF)
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF GHC.Types.Bool
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF LIO.DCLabel.CNF
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF LIO.DCLabel.Disjunction
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF LIO.DCLabel.Principal
+ LIO.DCLabel: instance LIO.DCLabel.ToCNF [GHC.Types.Char]
+ LIO.DCLabel: instance LIO.Label.Label LIO.DCLabel.DCLabel
+ LIO.DCLabel: instance LIO.Label.PrivDesc LIO.DCLabel.DCLabel LIO.DCLabel.CNF
+ LIO.DCLabel: instance LIO.Label.SpeaksFor LIO.DCLabel.CNF
+ LIO.Error: [inspContext] :: InsufficientPrivs -> [String]
+ LIO.Error: [inspFailure] :: InsufficientPrivs -> String
+ LIO.Error: [inspNeeded] :: InsufficientPrivs -> p
+ LIO.Error: [inspSupplied] :: InsufficientPrivs -> p
+ LIO.Error: [lerrContext] :: LabelError l -> [String]
+ LIO.Error: [lerrCurClearance] :: LabelError l -> l
+ LIO.Error: [lerrCurLabel] :: LabelError l -> l
+ LIO.Error: [lerrFailure] :: LabelError l -> String
+ LIO.Error: [lerrLabels] :: LabelError l -> [l]
+ LIO.Error: [lerrPrivs] :: LabelError l -> [GenericPrivDesc l]
+ LIO.Error: [relActualLabel] :: ResultExceedsLabel l -> Maybe l
+ LIO.Error: [relContext] :: ResultExceedsLabel l -> [String]
+ LIO.Error: [relDeclaredLabel] :: ResultExceedsLabel l -> l
+ LIO.Error: [relLocation] :: ResultExceedsLabel l -> String
+ LIO.Error: instance GHC.Exception.Exception LIO.Error.AnyLabelError
+ LIO.Error: instance GHC.Exception.Exception LIO.Error.InsufficientPrivs
+ LIO.Error: instance GHC.Show.Show (LIO.Error.GenericPrivDesc l)
+ LIO.Error: instance GHC.Show.Show LIO.Error.AnyLabelError
+ LIO.Error: instance GHC.Show.Show LIO.Error.InsufficientPrivs
+ LIO.Error: instance GHC.Show.Show l => GHC.Show.Show (LIO.Error.LabelError l)
+ LIO.Error: instance GHC.Show.Show l => GHC.Show.Show (LIO.Error.ResultExceedsLabel l)
+ LIO.Error: instance LIO.Error.Annotatable (LIO.Error.LabelError l)
+ LIO.Error: instance LIO.Error.Annotatable (LIO.Error.ResultExceedsLabel l)
+ LIO.Error: instance LIO.Error.Annotatable LIO.Error.AnyLabelError
+ LIO.Error: instance LIO.Error.Annotatable LIO.Error.InsufficientPrivs
+ LIO.Error: instance LIO.Label.Label l => GHC.Exception.Exception (LIO.Error.LabelError l)
+ LIO.Error: instance LIO.Label.Label l => GHC.Exception.Exception (LIO.Error.ResultExceedsLabel l)
+ LIO.Error.Trans: labelError :: (MonadLIO l m, Label l) => String -> [l] -> m a
+ LIO.Error.Trans: labelErrorP :: (MonadLIO l m, Label l, PrivDesc l p) => String -> Priv p -> [l] -> m a
+ LIO.Exception: [SomeException] :: SomeException
+ LIO.Exception: displayException :: Exception e => e -> String
+ LIO.LIORef.Trans: atomicModifyLIORef :: (MonadLIO l m, Label l) => LIORef l a -> (a -> (a, b)) -> m b
+ LIO.LIORef.Trans: atomicModifyLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> (a -> (a, b)) -> m b
+ LIO.LIORef.Trans: modifyLIORef :: (MonadLIO l m, Label l) => LIORef l a -> (a -> a) -> m ()
+ LIO.LIORef.Trans: modifyLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> (a -> a) -> m ()
+ LIO.LIORef.Trans: newLIORef :: (MonadLIO l m, Label l) => l -> a -> m (LIORef l a)
+ LIO.LIORef.Trans: newLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (LIORef l a)
+ LIO.LIORef.Trans: readLIORef :: (MonadLIO l m, Label l) => LIORef l a -> m a
+ LIO.LIORef.Trans: readLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> m a
+ LIO.LIORef.Trans: writeLIORef :: (MonadLIO l m, Label l) => LIORef l a -> a -> m ()
+ LIO.LIORef.Trans: writeLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> a -> m ()
+ LIO.Label: instance GHC.Base.Monoid LIO.Label.NoPrivs
+ LIO.Label: instance GHC.Read.Read LIO.Label.NoPrivs
+ LIO.Label: instance GHC.Show.Show LIO.Label.NoPrivs
+ LIO.Label: instance LIO.Label.Label l => LIO.Label.PrivDesc l LIO.Label.NoPrivs
+ LIO.Label: instance LIO.Label.PrivDesc l p => LIO.Label.PrivDesc l (LIO.TCB.Priv p)
+ LIO.Label: instance LIO.Label.SpeaksFor LIO.Label.NoPrivs
+ LIO.Label: instance LIO.Label.SpeaksFor p => LIO.Label.SpeaksFor (LIO.TCB.Priv p)
+ LIO.Labeled.Trans: lAp :: (MonadLIO l m, Label l) => Labeled l (a -> b) -> Labeled l a -> m (Labeled l b)
+ LIO.Labeled.Trans: lFmap :: (MonadLIO l m, Label l) => Labeled l a -> (a -> b) -> m (Labeled l b)
+ LIO.Labeled.Trans: label :: (MonadLIO l m, Label l) => l -> a -> m (Labeled l a)
+ LIO.Labeled.Trans: labelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (Labeled l a)
+ LIO.Labeled.Trans: relabelLabeledP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> Labeled l a -> m (Labeled l a)
+ LIO.Labeled.Trans: taintLabeled :: (MonadLIO l m, Label l) => l -> Labeled l a -> m (Labeled l a)
+ LIO.Labeled.Trans: taintLabeledP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> Labeled l a -> m (Labeled l a)
+ LIO.Labeled.Trans: unlabel :: (MonadLIO l m, Label l) => Labeled l a -> m a
+ LIO.Labeled.Trans: unlabelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> Labeled l a -> m a
+ LIO.Monad: class (Label l, Monad m) => MonadLIO l m | m -> l
+ LIO.Monad: instance LIO.Label.Label l => LIO.Monad.MonadLIO l (LIO.TCB.LIO l)
+ LIO.Monad: liftLIO :: MonadLIO l m => LIO l a -> m a
+ LIO.Run: [lioClearance] :: LIOState l -> !l
+ LIO.Run: [lioLabel] :: LIOState l -> !l
+ LIO.TCB: [lioClearance] :: LIOState l -> !l
+ LIO.TCB: [lioLabel] :: LIOState l -> !l
+ LIO.TCB: [lresBlockTCB] :: LabeledResult l a -> !(MVar ())
+ LIO.TCB: [lresLabelTCB] :: LabeledResult l a -> !l
+ LIO.TCB: [lresStatusTCB] :: LabeledResult l a -> !(IORef (LResStatus l a))
+ LIO.TCB: [lresThreadIdTCB] :: LabeledResult l a -> !ThreadId
+ LIO.TCB: instance (GHC.Show.Show a, GHC.Show.Show l) => GHC.Show.Show (LIO.TCB.LResStatus l a)
+ LIO.TCB: instance (GHC.Show.Show l, GHC.Show.Show a) => LIO.TCB.ShowTCB (LIO.TCB.Labeled l a)
+ LIO.TCB: instance GHC.Base.Applicative (LIO.TCB.LIO l)
+ LIO.TCB: instance GHC.Base.Functor (LIO.TCB.LIO l)
+ LIO.TCB: instance GHC.Base.Monad (LIO.TCB.LIO l)
+ LIO.TCB: instance GHC.Base.Monoid p => GHC.Base.Monoid (LIO.TCB.Priv p)
+ LIO.TCB: instance GHC.Classes.Eq a => GHC.Classes.Eq (LIO.TCB.Priv a)
+ LIO.TCB: instance GHC.Classes.Eq l => GHC.Classes.Eq (LIO.TCB.LIOState l)
+ LIO.TCB: instance GHC.Exception.Exception LIO.TCB.UncatchableTCB
+ LIO.TCB: instance GHC.Read.Read l => GHC.Read.Read (LIO.TCB.LIOState l)
+ LIO.TCB: instance GHC.Show.Show LIO.TCB.UncatchableTCB
+ LIO.TCB: instance GHC.Show.Show a => GHC.Show.Show (LIO.TCB.Priv a)
+ LIO.TCB: instance GHC.Show.Show l => GHC.Show.Show (LIO.TCB.LIOState l)
+ LIO.TCB: instance LIO.TCB.LabelOf LIO.TCB.Labeled
+ LIO.TCB: instance LIO.TCB.LabelOf LIO.TCB.LabeledResult
+ LIO.TCB.LObj: instance (LIO.Label.Label l, GHC.Show.Show t) => LIO.TCB.ShowTCB (LIO.TCB.LObj.LObj l t)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (GHC.Types.IO r) (LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> GHC.Types.IO r) (a1 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> GHC.Types.IO r) (a1 -> a2 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LObj.GuardIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> LIO.TCB.LIO l r)
+ LIO.TCB.LObj: instance LIO.TCB.LabelOf LIO.TCB.LObj.LObj
+ LIO.TCB.MLObj: [mlLabelLabel] :: MLabel policy l -> !l
+ LIO.TCB.MLObj: [mlLabel] :: MLabel policy l -> !(IORef l)
+ LIO.TCB.MLObj: [mlPolicy] :: MLabel policy l -> policy
+ LIO.TCB.MLObj: [mlUsers] :: MLabel policy l -> !(MVar (Map Unique (l -> IO Bool)))
+ LIO.TCB.MLObj: instance GHC.Show.Show LIO.TCB.MLObj.ExternalML
+ LIO.TCB.MLObj: instance GHC.Show.Show LIO.TCB.MLObj.InternalML
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (GHC.Types.IO r) (LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> GHC.Types.IO r) (a1 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> GHC.Types.IO r) (a1 -> a2 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.LabelIO l (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> GHC.Types.IO r) (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> LIO.TCB.LIO l r)
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.MLabelOf LIO.TCB.MLObj.MLObj
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.MLabelPolicy LIO.TCB.MLObj.ExternalML l
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.MLabelPolicy LIO.TCB.MLObj.InternalML l
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.MLabelPolicyDefault LIO.TCB.MLObj.ExternalML
+ LIO.TCB.MLObj: instance LIO.TCB.MLObj.MLabelPolicyDefault LIO.TCB.MLObj.InternalML
- LIO.Delegate: delegate :: SpeaksFor p => Priv p -> p -> Priv p
+ LIO.Delegate: delegate :: (SpeaksFor p) => Priv p -> p -> Priv p
- LIO.Delegate: guardGate :: SpeaksFor p => String -> p -> a -> Gate p a
+ LIO.Delegate: guardGate :: (SpeaksFor p) => String -> p -> a -> Gate p a
- LIO.Error: insufficientPrivs :: SpeaksFor p => String -> p -> p -> a
+ LIO.Error: insufficientPrivs :: (SpeaksFor p) => String -> p -> p -> a
- LIO.Error: labelError :: Label l => String -> [l] -> LIO l a
+ LIO.Error: labelError :: (Label l) => String -> [l] -> LIO l a
- LIO.Error: lerrFromException :: Exception e => SomeException -> Maybe e
+ LIO.Error: lerrFromException :: (Exception e) => SomeException -> Maybe e
- LIO.Exception: class (Typeable e, Show e) => Exception e
+ LIO.Exception: class (Typeable * e, Show e) => Exception e
- LIO.Label: isPriv :: Typeable p => p -> Bool
+ LIO.Label: isPriv :: (Typeable p) => p -> Bool
- LIO.Run: privInit :: SpeaksFor p => p -> IO (Priv p)
+ LIO.Run: privInit :: (SpeaksFor p) => p -> IO (Priv p)
- LIO.TCB.MLObj: mlObjTCB :: MLabelPolicyDefault policy => l -> l -> a -> LIO l (MLObj policy l a)
+ LIO.TCB.MLObj: mlObjTCB :: (MLabelPolicyDefault policy) => l -> l -> a -> LIO l (MLObj policy l a)
- LIO.TCB.MLObj: newMLabelP :: PrivDesc l p => Priv p -> policy -> l -> l -> LIO l (MLabel policy l)
+ LIO.TCB.MLObj: newMLabelP :: (PrivDesc l p) => Priv p -> policy -> l -> l -> LIO l (MLabel policy l)
- LIO.TCB.MLObj: readMLabelP :: PrivDesc l p => Priv p -> MLabel policy l -> LIO l l
+ LIO.TCB.MLObj: readMLabelP :: (PrivDesc l p) => Priv p -> MLabel policy l -> LIO l l
- LIO.TCB.MLObj: withMLabelP :: PrivDesc l p => Priv p -> MLabel policy l -> LIO l a -> LIO l a
+ LIO.TCB.MLObj: withMLabelP :: (PrivDesc l p) => Priv p -> MLabel policy l -> LIO l a -> LIO l a
Files
- LIO/Concurrent/LChan/Trans.hs +50/−0
- LIO/Concurrent/LMVar/Trans.hs +100/−0
- LIO/Core.hs +9/−16
- LIO/Core/Trans.hs +73/−0
- LIO/DCLabel.hs +2/−3
- LIO/Error/Trans.hs +29/−0
- LIO/LIORef/Trans.hs +71/−0
- LIO/Label.hs +2/−6
- LIO/Labeled/Trans.hs +58/−0
- LIO/Monad.hs +19/−0
- LIO/TCB.hs +2/−2
- examples/channel.hs +8/−5
- examples/dclabel.hs +1/−0
- examples/gate.hs +1/−1
- examples/waitAndCatch.hs +3/−4
- lio.cabal +13/−4
+ LIO/Concurrent/LChan/Trans.hs view
@@ -0,0 +1,50 @@+{-# LANGUAGE Safe #-}++{- | 'MonadLIO' generalizations for "LIO.Concurrent.LChan". -}+module LIO.Concurrent.LChan.Trans (+ newLChan+ , newLChanP+ , writeLChan+ , writeLChanP+ , readLChan+ , readLChanP+ , dupLChan+ , dupLChanP+ ) where++import safe LIO.Core+import safe LIO.Label++import safe qualified LIO.Concurrent.LChan as C++-- | See 'LIO.Concurrent.LChan.newLChan'.+newLChan :: (MonadLIO l m, Label l) => l -> m (C.LChan l a)+newLChan = liftLIO . C.newLChan++-- | See 'LIO.Concurrent.LChan.newLChanP'.+newLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m (C.LChan l a)+newLChanP p = liftLIO . C.newLChanP p++-- | See 'LIO.Concurrent.LChan.writeLChan'.+writeLChan :: (MonadLIO l m, Label l) => C.LChan l a -> a -> m ()+writeLChan c = liftLIO . C.writeLChan c++-- | See 'LIO.Concurrent.LChan.writeLChanP'.+writeLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> C.LChan l a -> a -> m ()+writeLChanP p c = liftLIO . C.writeLChanP p c++-- | See 'LIO.Concurrent.LChan.readLChan'.+readLChan :: (MonadLIO l m, Label l) => C.LChan l a -> m a+readLChan = liftLIO . C.readLChan++-- | See 'LIO.Concurrent.LChan.readLChanP'.+readLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> C.LChan l a -> m a+readLChanP p = liftLIO . C.readLChanP p++-- | See 'LIO.Concurrent.LChan.dupLChan'.+dupLChan :: (MonadLIO l m, Label l) => C.LChan l a -> m (C.LChan l a)+dupLChan = liftLIO . C.dupLChan++-- | See 'LIO.Concurrent.LChan.dupLChanP'.+dupLChanP :: (MonadLIO l m, PrivDesc l p) => Priv p -> C.LChan l a -> m (C.LChan l a)+dupLChanP p = liftLIO . C.dupLChanP p
+ LIO/Concurrent/LMVar/Trans.hs view
@@ -0,0 +1,100 @@+{-# LANGUAGE Safe #-}++{- | 'MonadLIO' generalizations for "LIO.Concurrent.LMVar". -}+module LIO.Concurrent.LMVar.Trans+ ( newEmptyLMVar+ , newEmptyLMVarP+ , newLMVar+ , newLMVarP+ , takeLMVar+ , takeLMVarP+ , tryTakeLMVar+ , tryTakeLMVarP+ , putLMVar+ , putLMVarP+ , tryPutLMVar+ , tryPutLMVarP+ , readLMVar+ , readLMVarP+ , swapLMVar+ , swapLMVarP+ , isEmptyLMVar+ , isEmptyLMVarP+ ) where++import safe LIO.Core+import safe LIO.Label++import safe qualified LIO.Concurrent.LMVar as M++-- | See 'LIO.Concurrent.LMVar.newEmptyLMVar'.+newEmptyLMVar :: (MonadLIO l m, Label l) => l -> m (M.LMVar l a)+newEmptyLMVar = liftLIO . M.newEmptyLMVar++-- | See 'LIO.Concurrent.LMVar.newEmptyLMVarP'.+newEmptyLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m (M.LMVar l a)+newEmptyLMVarP p = liftLIO . M.newEmptyLMVarP p++-- | See 'LIO.Concurrent.LMVar.newLMVar'.+newLMVar :: (MonadLIO l m, Label l) => l -> a -> m (M.LMVar l a)+newLMVar l = liftLIO . M.newLMVar l++-- | See 'LIO.Concurrent.LMVar.newLMVarP'.+newLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (M.LMVar l a)+newLMVarP p l = liftLIO . M.newLMVarP p l++-- | See 'LIO.Concurrent.LMVar.takeLMVar'.+takeLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> m a+takeLMVar = liftLIO . M.takeLMVar++-- | See 'LIO.Concurrent.LMVar.takeLMVarP'.+takeLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> m a+takeLMVarP p = liftLIO . M.takeLMVarP p++-- | See 'LIO.Concurrent.LMVar.tryTakeLMVar'.+tryTakeLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> m (Maybe a)+tryTakeLMVar = liftLIO . M.tryTakeLMVar++-- | See 'LIO.Concurrent.LMVar.tryTakeLMVarP'.+tryTakeLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> m (Maybe a)+tryTakeLMVarP p = liftLIO . M.tryTakeLMVarP p++-- | See 'LIO.Concurrent.LMVar.putLMVar'.+putLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> a -> m ()+putLMVar mvar = liftLIO . M.putLMVar mvar++-- | See 'LIO.Concurrent.LMVar.putLMVarP'.+putLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> a -> m ()+putLMVarP p mvar = liftLIO . M.putLMVarP p mvar++-- | See 'LIO.Concurrent.LMVar.tryPutLMVar'.+tryPutLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> a -> m Bool+tryPutLMVar mvar = liftLIO . M.tryPutLMVar mvar++-- | See 'LIO.Concurrent.LMVar.tryPutLMVarP'.+tryPutLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> a -> m Bool+tryPutLMVarP p mvar = liftLIO . M.tryPutLMVarP p mvar++-- | See 'LIO.Concurrent.LMVar.readLMVar'.+readLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> m a+readLMVar = liftLIO . M.readLMVar++-- | See 'LIO.Concurrent.LMVar.readLMVarP'.+readLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> m a+readLMVarP p = liftLIO . M.readLMVarP p++-- | See 'LIO.Concurrent.LMVar.swapLMVar'.+swapLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> a -> m a+swapLMVar mvar = liftLIO . M.swapLMVar mvar++-- | See 'LIO.Concurrent.LMVar.swapLMVarP'.+swapLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> a -> m a+swapLMVarP p mvar = liftLIO . M.swapLMVarP p mvar++-- | See 'LIO.Concurrent.LMVar.isEmptyLMVar'.+isEmptyLMVar :: (MonadLIO l m, Label l) => M.LMVar l a -> m Bool+isEmptyLMVar = liftLIO . M.isEmptyLMVar++-- | See 'LIO.Concurrent.LMVar.isEmptyLMVarP'.+isEmptyLMVarP :: (MonadLIO l m, PrivDesc l p) => Priv p -> M.LMVar l a -> m Bool+isEmptyLMVarP p = liftLIO . M.isEmptyLMVarP p
LIO/Core.hs view
@@ -41,7 +41,7 @@ label to ensure that @l_r ``canFlowTo`` l_cur@. This is acomplished using a function such as 'taint'. -The second purpose of the current label is to prevent inforation leaks+The second purpose of the current label is to prevent information leaks into public channels. Specifically, it is only permissible to modify or write to data labeled @l_w@ when @l_cur``canFlowTo`` l_w@. Thus, the following attempt to leak the @val@ after reading it from a secret@@ -91,6 +91,7 @@ import safe LIO.Error import safe LIO.Exception import safe LIO.Label+import safe LIO.Monad(MonadLIO(..)) import safe LIO.Run import LIO.TCB @@ -316,8 +317,13 @@ -- -- > guardWrite l = guardAlloc l >> taint l ----- This guarantees that @l@ ``canFlowTo`` the current label (and--- clearance), and that the current label ``canFlowTo`` @l@.+-- The 'guardAlloc' ensures that we can write(-only) to the object+-- labeled @l@, i.e., the current label ``canFlowTo`` @l@ (and @l@+-- ``canFlowTo`` the current clearance). If this check succeeds then+-- we raise the current label with 'taint' to reflect the fact that+-- this is a also a read effect. Note that if the write-only guard+-- succeeds, the 'taint' will always suceed (we're simply raising the+-- current label to a label that is below the clearance). -- guardWrite :: Label l => l -> LIO l () guardWrite newl = withContext "guardWrite" $ do@@ -330,16 +336,3 @@ guardWriteP p newl = withContext "guardWriteP" $ do guardAllocP p newl taintP p newl------- Monad base------- | Synonym for monad in which 'LIO' is the base monad.-class (Label l, Monad m) => MonadLIO l m | m -> l where- -- | Lift an 'LIO' computation.- liftLIO :: LIO l a -> m a--instance Label l => MonadLIO l (LIO l) where- liftLIO = id-
+ LIO/Core/Trans.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE Safe #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances #-}++{- | 'MonadLIO' generalizations for "LIO.Core". -}+module LIO.Core.Trans (+ getLabel+ , setLabel+ , setLabelP+ , getClearance+ , setClearance+ , setClearanceP+ , guardAlloc+ , guardAllocP+ , taint+ , taintP+ , guardWrite+ , guardWriteP+ ) where++import safe LIO.Label+import safe LIO.Monad++import safe qualified LIO.Core as C++-- | See 'LIO.Core.getLabel'.+getLabel :: (MonadLIO l m, Label l) => m l+getLabel = liftLIO C.getLabel++-- | See 'LIO.Core.setLabel'.+setLabel :: (MonadLIO l m, Label l) => l -> m ()+setLabel = liftLIO . C.setLabel++-- | See 'LIO.Core.setLabelP'.+setLabelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()+setLabelP p = liftLIO . C.setLabelP p++-- | See 'LIO.Core.getClearance'.+getClearance :: (MonadLIO l m, Label l) => m l+getClearance = liftLIO C.getClearance++-- | See 'LIO.Core.setClearance'.+setClearance :: (MonadLIO l m, Label l) => l -> m ()+setClearance = liftLIO . C.setClearance++-- | See 'LIO.Core.setClearanceP'.+setClearanceP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()+setClearanceP p = liftLIO . C.setClearanceP p++-- | See 'LIO.Core.guardAlloc'.+guardAlloc :: (MonadLIO l m, Label l) => l -> m ()+guardAlloc = liftLIO . C.guardAlloc++-- | See 'LIO.Core.guardAllocP'.+guardAllocP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()+guardAllocP p = liftLIO . C.guardAllocP p++-- | See 'LIO.Core.taint'.+taint :: (MonadLIO l m, Label l) => l -> m ()+taint = liftLIO . C.taint++-- | See 'LIO.Core.taintP'.+taintP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()+taintP p = liftLIO . C.taintP p++-- | See 'LIO.Core.guardWrite'.+guardWrite :: (MonadLIO l m, Label l) => l -> m ()+guardWrite = liftLIO . C.guardWrite++-- | See 'LIO.Core.guardWriteP'.+guardWriteP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> m ()+guardWriteP p = liftLIO . C.guardWriteP p
LIO/DCLabel.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE Safe #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -110,13 +110,12 @@ , cTrue, cFalse, cToSet, cFromList ) where -import safe Control.Applicative import safe Control.Monad import safe Data.Bits import safe qualified Data.ByteString as S import Data.Hashable import safe Data.List-import safe Data.Monoid+import safe Data.Monoid () import safe Data.Set (Set) import safe qualified Data.Set as Set import safe Data.String
+ LIO/Error/Trans.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE Safe #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE ExistentialQuantification #-}++{- | 'MonadLIO' generalizations for "LIO.Error". -}+module LIO.Error.Trans (+ labelError+ , labelErrorP+ ) where++import safe LIO.Label+import safe LIO.Monad++import safe qualified LIO.Error as E++-- | See 'LIO.Error.labelError'.+labelError :: (MonadLIO l m, Label l)+ => String -- ^ Function that failed.+ -> [l] -- ^ Labels involved in error.+ -> m a+labelError fl = liftLIO . E.labelError fl++-- | See 'LIO.Error.labelErrorP'.+labelErrorP :: (MonadLIO l m, Label l, PrivDesc l p)+ => String -- ^ Function that failed.+ -> Priv p -- ^ Privileges involved.+ -> [l] -- ^ Labels involved.+ -> m a+labelErrorP fl p = liftLIO . E.labelErrorP fl p
+ LIO/LIORef/Trans.hs view
@@ -0,0 +1,71 @@+{-# LANGUAGE Safe #-}+{-# LANGUAGE ConstraintKinds,+ FlexibleContexts #-}++{- | 'MonadLIO' generalizations for "LIO.LIORef". -}+module LIO.LIORef.Trans (+ newLIORef+ , newLIORefP+ , readLIORef+ , readLIORefP+ , writeLIORef+ , writeLIORefP+ , modifyLIORef+ , modifyLIORefP+ , atomicModifyLIORef+ , atomicModifyLIORefP+ ) where++import safe LIO.Core+import safe LIO.Label++import safe LIO.LIORef (LIORef)+import safe qualified LIO.LIORef as R++-- | See 'LIO.LIORef.newLIORef'.+newLIORef :: (MonadLIO l m, Label l)+ => l -- ^ Label of reference+ -> a -- ^ Initial value+ -> m (LIORef l a) -- ^ Mutable reference+newLIORef l = liftLIO . R.newLIORef l++-- | See 'LIO.LIORef.newLIORefP'.+newLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (LIORef l a)+newLIORefP p l = liftLIO . R.newLIORefP p l++-- | See 'LIO.LIORef.readLIORef'.+readLIORef :: (MonadLIO l m, Label l) => LIORef l a -> m a+readLIORef = liftLIO . R.readLIORef++-- | See 'LIO.LIORef.readLIORefP'.+readLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> m a+readLIORefP priv = liftLIO . R.readLIORefP priv++-- | See 'LIO.LIORef.writeLIORef'.+writeLIORef :: (MonadLIO l m, Label l) => LIORef l a -> a -> m ()+writeLIORef ref = liftLIO . R.writeLIORef ref++-- | See 'LIO.LIORef.writeLIORefP'.+writeLIORefP :: (MonadLIO l m, PrivDesc l p) => Priv p -> LIORef l a -> a -> m ()+writeLIORefP priv ref = liftLIO . R.writeLIORefP priv ref++-- | See 'LIO.LIORef.modifyLIORef'.+modifyLIORef :: (MonadLIO l m, Label l)+ => LIORef l a -- ^ Labeled reference+ -> (a -> a) -- ^ Modifier+ -> m ()+modifyLIORef ref = liftLIO . R.modifyLIORef ref++-- | See 'LIO.LIORef.modifyLIORefP'.+modifyLIORefP :: (MonadLIO l m, PrivDesc l p)+ => Priv p -> LIORef l a -> (a -> a) -> m ()+modifyLIORefP priv ref = liftLIO . R.modifyLIORefP priv ref++-- | See 'LIO.LIORef.atomicModifyLIORef'.+atomicModifyLIORef :: (MonadLIO l m, Label l) => LIORef l a -> (a -> (a, b)) -> m b+atomicModifyLIORef ref = liftLIO . R.atomicModifyLIORef ref++-- | See 'LIO.LIORef.atomicModifyLIORefP'.+atomicModifyLIORefP :: (MonadLIO l m, PrivDesc l p)+ => Priv p -> LIORef l a -> (a -> (a, b)) -> m b+atomicModifyLIORefP priv ref = liftLIO . R.atomicModifyLIORefP priv ref
LIO/Label.hs view
@@ -18,7 +18,7 @@ , NoPrivs(..), noPrivs ) where -import safe Data.Monoid+import safe Data.Monoid () import safe Data.Typeable import LIO.TCB@@ -46,7 +46,7 @@ with current label @lcur@ observes data labeled @l1@, it must hold that @l1 ``canFlowTo`` lcur@. If the thread is later permitted to modify an object labeled @l2@, it must hold that @lcur ``canFlowTo``-l2@. By transitifity of the ``canFlowTo`` relation, it holds that @l1+l2@. By transitivity of the ``canFlowTo`` relation, it holds that @l1 ``canFlowTo`` l2@. -}@@ -221,10 +221,6 @@ -- Less formally, @downgradeP p l@ returns a label representing -- the furthest you can downgrade data labeled @l@ given -- privileges described by @p@.- --- -- Yet another way to view this function is that @downgradeP p l@- -- returns the greatest lower bound (under 'canFlowTo') of the set- -- of all labels @l'@ such that @'canFlowToP' p l' l@. downgradeP :: p -- ^ Privilege description -> l -- ^ Label to downgrade -> l -- ^ Lowest label equivelent to input
+ LIO/Labeled/Trans.hs view
@@ -0,0 +1,58 @@+{-# LANGUAGE Trustworthy #-}++{- | 'MonadLIO' generalizations for "LIO.Labeled". -}+module LIO.Labeled.Trans (+ label+ , labelP+ , unlabel+ , unlabelP+ , relabelLabeledP+ , taintLabeled+ , taintLabeledP+ , lFmap+ , lAp+ ) where++import safe LIO.Label+import safe LIO.Core+import LIO.TCB++import safe qualified LIO.Labeled as L++-- | See 'LIO.Labeled.label'.+label :: (MonadLIO l m, Label l) => l -> a -> m (Labeled l a)+label l = liftLIO . L.label l++-- | See 'LIO.Labeled.labelP'.+labelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> l -> a -> m (Labeled l a)+labelP p l = liftLIO . L.labelP p l++-- | See 'LIO.Labeled.unlabel'.+unlabel :: (MonadLIO l m, Label l) => Labeled l a -> m a+unlabel = liftLIO . L.unlabel++-- | See 'LIO.Labeled.unlabelP'.+unlabelP :: (MonadLIO l m, PrivDesc l p) => Priv p -> Labeled l a -> m a+unlabelP p = liftLIO . L.unlabelP p++-- | See 'LIO.Labeled.relabelLabeledP'.+relabelLabeledP :: (MonadLIO l m, PrivDesc l p)+ => Priv p -> l -> Labeled l a -> m (Labeled l a)+relabelLabeledP p newl = liftLIO . L.relabelLabeledP p newl++-- | See 'LIO.Labeled.taintLabeled'.+taintLabeled :: (MonadLIO l m, Label l) => l -> Labeled l a -> m (Labeled l a)+taintLabeled l = liftLIO . L.taintLabeled l++-- | See 'LIO.Labeled.taintLabeledP'.+taintLabeledP :: (MonadLIO l m, PrivDesc l p)+ => Priv p -> l -> Labeled l a -> m (Labeled l a)+taintLabeledP p l = liftLIO . L.taintLabeledP p l++-- | See 'LIO.Labeled.lFmap'.+lFmap :: (MonadLIO l m, Label l) => Labeled l a -> (a -> b) -> m (Labeled l b)+lFmap l = liftLIO . L.lFmap l++-- | See 'LIO.Labeled.lAp'.+lAp :: (MonadLIO l m, Label l) => Labeled l (a -> b) -> Labeled l a -> m (Labeled l b)+lAp lf = liftLIO . L.lAp lf
+ LIO/Monad.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances #-}++module LIO.Monad (+ MonadLIO(..)+ ) where++import safe LIO.Label+import LIO.TCB++-- | Synonym for monad in which 'LIO' is the base monad.+class (Label l, Monad m) => MonadLIO l m | m -> l where+ -- | Lift an 'LIO' computation.+ liftLIO :: LIO l a -> m a++instance Label l => MonadLIO l (LIO l) where+ liftLIO = id
LIO/TCB.hs view
@@ -34,11 +34,11 @@ , LabeledResult(..), LResStatus(..) ) where -import safe Control.Applicative+import safe Control.Applicative () import safe Control.Exception (Exception(..), SomeException(..)) import safe qualified Control.Concurrent as IO import safe Control.Monad-import safe Data.Monoid+import safe Data.Monoid () import safe Data.IORef import safe Data.Typeable
examples/channel.hs view
@@ -9,15 +9,18 @@ import LIO.TCB (ioTCB) +main :: IO () main = evalDC $ do- log <- newLChan ("Logger" %% True)+ logger <- newLChan ("Logger" %% True) forkLIO $ forever $ do- msg <- readLChan log+ msg <- readLChan logger lcur <- getLabel ioTCB $ putStrLn $ show lcur ++ " > " ++ msg forkLIO $ do- writeLChan log "in them alternate threads"+ writeLChan logger "in them alternate threads" forkLIO $ do taint ("Alice" %% True)- writeLChan log "i has failed"- forM_ [1..10] $ \i -> writeLChan log $ "yo "++ show i+ writeLChan logger "i has failed"+ forM_ oneToTen $ \i -> writeLChan logger $ "yo "++ show i+ where oneToTen :: [Int]+ oneToTen = [1..10]
examples/dclabel.hs view
@@ -24,6 +24,7 @@ p :: DCPriv p = PrivTCB $ "Alice" /\ "Carla" +main :: IO () main = do putStrLn $ "Label 1: " ++ show l1 putStrLn $ "Label 2: " ++ show l2
examples/gate.hs view
@@ -1,5 +1,4 @@ import LIO-import LIO.Delegate import LIO.DCLabel import LIO.TCB@@ -18,6 +17,7 @@ bob = PrivTCB . toCNF $ "Bob" clark = PrivTCB . toCNF $ "Clark" +main :: IO () main = putStrLn . show $ [ callGate addGate alice 1 2 -- Just 3 , callGate addGate bob 3 4 -- Just 7
examples/waitAndCatch.hs view
@@ -2,19 +2,18 @@ module Main (main) where -import Prelude hiding (catch)+import Prelude import LIO import LIO.TCB (ioTCB) import LIO.DCLabel import LIO.Concurrent-import Control.Exception (SomeException) -l,m,h :: DCLabel+l,m :: DCLabel l = "A" \/ "B" %% True m = "M" %% True-h = "A" /\ "B" %% True +main :: IO () main = do lr <- evalDC $ do lb <- label m (6 :: Int)
lio.cabal view
@@ -1,13 +1,15 @@ Name: lio-Version: 0.11.5.0+Version: 0.11.6.0 Cabal-Version: >= 1.8 Build-type: Simple License: GPL License-File: LICENSE Author: Hails team-Maintainer: Hails team <hails at scs dot stanford dot edu>+Maintainer: Deian Stefan <deian at cs dot ucsd dot edu> Synopsis: Labeled IO Information Flow Control Library Category: Security+Homepage: https://github.com/plsyssec/lio+Bug-Reports: https://github.com/plsyssec/lio/issues Description: The /Labeled IO/ (LIO) library is an information flow control (IFC)@@ -60,11 +62,11 @@ Source-repository head Type: git- Location: git://github.com/scslab/lio.git+ Location: https://github.com/PLSysSec/lio.git Library Build-Depends:- base >= 4.5 && < 5.0+ base >= 4.5 && < 6.0 ,containers ,bytestring >= 0.10 ,hashable >= 1.2@@ -80,18 +82,25 @@ LIO.Label -- * Core library LIO.Core+ LIO.Core.Trans+ LIO.Monad LIO.Error+ LIO.Error.Trans LIO.Exception -- * Labeled values LIO.Labeled+ LIO.Labeled.Trans -- * Labeled IORefs LIO.LIORef+ LIO.LIORef.Trans -- * LIO privileges LIO.Delegate -- * Concurrency LIO.Concurrent LIO.Concurrent.LMVar+ LIO.Concurrent.LMVar.Trans LIO.Concurrent.LChan+ LIO.Concurrent.LChan.Trans -- * DCLabels LIO.DCLabel -- * Privileged internals