uml: fail xterm_open when we have no $DISPLAY
PATCH 7/15 uml: fail xterm_open when we have no $DISPLAY
From: Chris Wedgwood <[email protected]>
If UML wants to open an xterm channel and the xterm does not run properly (eg. terminates soon after starting) we will get a hang (a comment added in the patch explains why).
This avoids the most common cause for this and adds a comment (which long term will go away with a rewrite of that code); the complete fix would be to catch the xterm process dying, up(&data->sem), and -EIO all requests from that point onwards.
That applies for some of the other channels too, so part of the code should probably be abstracted a little and generalized.
---
linux-2.6.11-paolo/arch/um/drivers/xterm.c | 7 +++++++ linux-2.6.11-paolo/arch/um/drivers/xterm_kern.c | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-)
arch/um/drivers/xterm_kern.c renamed from arch/um/drivers/xterm_kern.c~uml-xterm-clarify +8 -1
@@ -46,6 +46,8 @@ int xterm_fd(int socket, int *pid_out)printk (KERN_ERR "xterm_fd : failed to allocate xterm_wait\n" );return (-ENOMEM ); } + +/* This is a locked semaphore... */ *data = ((struct xterm_wait) { .sem = __SEMAPHORE_INITIALIZER(data->sem, 0), .fd = socket,
@@ -55,12 +57,17 @@ int xterm_fd(int socket, int *pid_out) err =um_request_irq (XTERM_IRQ , socket,IRQ_READ , xterm_interrupt,SA_INTERRUPT |SA_SHIRQ |SA_SAMPLE_RANDOM ,"xterm" , data); -if (err){ +if (err){printk (KERN_ERR "xterm_fd : failed to get IRQ for xterm, " "err = %d\n" , err); ret = err; goto out; } + +/* ... so here we wait for an xterm interrupt. +* +* XXX Note, if the xterm doesn't work for some reason (eg. DISPLAY +* isn't set) this will hang... */ down (&data->sem);free_irq_by_irq_and_dev (XTERM_IRQ , data);
arch/um/drivers/xterm.c renamed from arch/um/drivers/xterm.c~uml-xterm-clarify +7 -0
@@ -97,6 +97,13 @@ int xterm_open(int input, int output, inif (os_access (argv[4 ],OS_ACC_X_OK ) <0 ) argv[4 ] ="port-helper" ; +/* Check that DISPLAY is set, this doesn't guarantee the xterm +* will work but w/o it we can be pretty sure it won't. */ +if (!getenv ("DISPLAY" )) { +printk ("xterm_open: $DISPLAY not set.\n" ); +return -ENODEV ; + } + fd =mkstemp (file);if (fd <0 ){printk ("xterm_open : mkstemp failed, errno = %d\n" , errno);
_
-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek. It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel