mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
pluginloader: Move stdin and stdout out of harm's way
In the plugin loader subprocess, move stdin and stdout to new fd's so that plugins printing things during plugin init or (*gasp*) possibly reading from stdin don't interfere with the data sent to and from the parent.
This commit is contained in:
parent
aeb3f1f1ff
commit
63934021ab
1 changed files with 29 additions and 2 deletions
|
@ -426,15 +426,42 @@ gboolean
|
||||||
_gst_plugin_loader_client_run ()
|
_gst_plugin_loader_client_run ()
|
||||||
{
|
{
|
||||||
GstPluginLoader *l;
|
GstPluginLoader *l;
|
||||||
|
int dup_fd;
|
||||||
|
|
||||||
l = plugin_loader_new (NULL);
|
l = plugin_loader_new (NULL);
|
||||||
if (l == NULL)
|
if (l == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
l->fd_w.fd = 1; /* STDOUT */
|
/* On entry, the inward pipe is STDIN, and outward is STDOUT.
|
||||||
gst_poll_add_fd (l->fdset, &l->fd_w);
|
* Dup those somewhere better so that plugins printing things
|
||||||
|
* won't interfere with anything */
|
||||||
|
#ifndef G_OS_WIN32
|
||||||
|
dup_fd = dup (0); /* STDIN */
|
||||||
|
if (dup_fd == -1) {
|
||||||
|
GST_ERROR ("Failed to start. Could no dup STDIN, errno %d", errno);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
l->fd_r.fd = dup_fd;
|
||||||
|
close (0);
|
||||||
|
|
||||||
|
dup_fd = dup (1); /* STDOUT */
|
||||||
|
if (dup_fd == -1) {
|
||||||
|
GST_ERROR ("Failed to start. Could no dup STDOUT, errno %d", errno);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
l->fd_w.fd = dup_fd;
|
||||||
|
close (1);
|
||||||
|
|
||||||
|
/* Dup stderr down to stdout so things that plugins print are visible,
|
||||||
|
* but don't care if it fails */
|
||||||
|
dup2 (2, 1);
|
||||||
|
#else
|
||||||
|
/* FIXME: Use DuplicateHandle and friends on win32 */
|
||||||
|
l->fd_w.fd = 1; /* STDOUT */
|
||||||
l->fd_r.fd = 0; /* STDIN */
|
l->fd_r.fd = 0; /* STDIN */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gst_poll_add_fd (l->fdset, &l->fd_w);
|
||||||
gst_poll_add_fd (l->fdset, &l->fd_r);
|
gst_poll_add_fd (l->fdset, &l->fd_r);
|
||||||
gst_poll_fd_ctl_read (l->fdset, &l->fd_r, TRUE);
|
gst_poll_fd_ctl_read (l->fdset, &l->fd_r, TRUE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue