|
@@ -124,3 +124,51 @@ appel à \inltype{fork}. Dans l'architecture que j'ai construite, nous réalison
|
|
les opérations de façon synchrone, même entre deux processus, ce qui permettra
|
|
les opérations de façon synchrone, même entre deux processus, ce qui permettra
|
|
d'attacher des débogueurs au processus Zygote et basculer directement sur le
|
|
d'attacher des débogueurs au processus Zygote et basculer directement sur le
|
|
processus enfant à chaque création de nouveau processus.
|
|
processus enfant à chaque création de nouveau processus.
|
|
|
|
+
|
|
|
|
+\section{Démarrage de la sandbox}
|
|
|
|
+
|
|
|
|
+Du côté de l'application cliente qui utilise libvlc et doit être sandboxée, il
|
|
|
|
+faut pouvoir gérer les deux cas de création de processus. Je propose alors une
|
|
|
|
+API inspirée des travaux existants de Guillaume Fournier sur la sandbox seccomp,
|
|
|
|
+mais ne dépendant pas directement des objets libvlc et permettant plus
|
|
|
|
+d'évolution sur les paramètres passables au démarrage de la sandbox.
|
|
|
|
+
|
|
|
|
+\begin{code}{c}{API de sandboxing}
|
|
|
|
+vlc_sandbox_t *vlc_sandbox_Init( struct vlc_sandbox_cfg *cfg );
|
|
|
|
+VLC_API int vlc_sandbox_Start( vlc_sandbox_t *sandbox );
|
|
|
|
+VLC_API void vlc_sandbox_Close( vlc_sandbox_t *sandbox );
|
|
|
|
+VLC_API bool vlc_sandbox_ShouldExit( vlc_sandbox_t *sandbox );
|
|
|
|
+/* donne la valeur de retour pour le programme */
|
|
|
|
+VLC_API int vlc_sandbox_Exit( vlc_sandbox_t *sandbox );
|
|
|
|
+\end{code}
|
|
|
|
+
|
|
|
|
+Le client peut alors initialiser la sandbox avec le code qui suit. La structure
|
|
|
|
+\inltype{vlc_sandbox_cfg} est prévue à terme pour transmettre l'ensemble des
|
|
|
|
+politiques à appliquer aux différentes zones de privilèges, les paramètres
|
|
|
|
+de création des nouveaux objets dans la sandbox et tout paramètre de sécurité
|
|
|
|
+important.
|
|
|
|
+
|
|
|
|
+\begin{code}{c}{Démarrage de la sandbox}
|
|
|
|
+/* count et args contiennent les arguments modifiés pour le démarrage */
|
|
|
|
+vlc_sandbox_t *sandbox = vlc_sandbox_Init( &(struct vlc_sandbox_cfg) {
|
|
|
|
+ .argc = count,
|
|
|
|
+ .argv = args,
|
|
|
|
+ /* point d'entrée dans la sandbox */
|
|
|
|
+ .bootstrap = bootstrap_app,
|
|
|
|
+ .create_vlc = libvlc_new,
|
|
|
|
+ .delete_vlc = libvlc_release,
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+vlc_sandbox_Start( sandbox );
|
|
|
|
+/* À partir d'ici on fonctionne dans la sandbox et ce processus est devenu le
|
|
|
|
+ * broker / orchestrateur. Quand le broker termine, libérer les ressources */
|
|
|
|
+return vlc_sandbox_Close( sandbox );
|
|
|
|
+\end{code}
|
|
|
|
+
|
|
|
|
+Dans le cas de la création de worker par fork, la boucle événementielle des
|
|
|
|
+workers est directement appelée. Dans le cas de la création de nouveaux
|
|
|
|
+processus pour chaque worker, \inltype{vlc_sandbox_Init} sera rappelé mais
|
|
|
|
+détectera dans les arguments de la ligne de commande qu'il s'agit d'un worker et
|
|
|
|
+initialisera ses paramètres correctement, puis \inltype{vlc_sandbox_Start}
|
|
|
|
+démarrera la boucle événementielle du worker. On a donc bien une API qui peut
|
|
|
|
+utiliser les deux modes de démarrage des processus.
|