Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  security.rs

  Sprache: Rust
 

// SPDX-License-Identifier: GPL-2.0

// Copyright (C) 2024 Google LLC.

//! Linux Security Modules (LSM).
//!
//! C header: [`include/linux/security.h`](srctree/include/linux/security.h).

use crate::{
    bindings,
    error::{to_result, Result},
};

/// A security context string.
///
/// # Invariants
///
/// The `ctx` field corresponds to a valid security context as returned by a successful call to
/// `security_secid_to_secctx`, that has not yet been released by `security_release_secctx`.
pub struct SecurityCtx {
    ctx: bindings::lsm_context,
}

impl SecurityCtx {
    /// Get the security context given its id.
    #[inline]
    pub fn from_secid(secid: u32) -> Result<Self> {
        // SAFETY: `struct lsm_context` can be initialized to all zeros.
        let mut ctx: bindings::lsm_context = unsafe { core::mem::zeroed() };

        // SAFETY: Just a C FFI call. The pointer is valid for writes.
        to_result(unsafe { bindings::security_secid_to_secctx(secid, &>mut ctx) })?;

        // INVARIANT: If the above call did not fail, then we have a valid security context.
        Ok(Self { ctx })
    }

    /// Returns whether the security context is empty.
    #[inline]
    pub fn is_empty(&self) -> bool {
        self.ctx.len == 0
    }

    /// Returns the length of this security context.
    #[inline]
    pub fn len(&self) -> usize {
        self.ctx.len as usize
    }

    /// Returns the bytes for this security context.
    #[inline]
    pub fn as_bytes(&self) -> &[u8] {
        let ptr = self.ctx.context;
        if ptr.is_null() {
            debug_assert_eq!(self.len(), 0);
            // We can't pass a null pointer to `slice::from_raw_parts` even if the length is zero.
            return &[];
        }

        // SAFETY: The call to `security_secid_to_secctx` guarantees that the pointer is valid for
        // `self.len()` bytes. Furthermore, if the length is zero, then we have ensured that the
        // pointer is not null.
        unsafe { core::slice::from_raw_parts(ptr.cast(), self.len()) }
    }
}

impl Drop for SecurityCtx {
    #[inline]
    fn drop(&mut self) {
        // SAFETY: By the invariant of `Self`, this releases an lsm context that came from a
        // successful call to `security_secid_to_secctx` and has not yet been released.
        unsafe { bindings::security_release_secctx(&mut self.ctx) };
    }
}

Messung V0.5 in Prozent
C=68 H=81 G=74

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-06-18) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik