summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-26 22:49:09 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-26 22:49:09 +0000
commit39e25abf34c05c0ff711aef5603aeebabeda8153 (patch)
tree579ffc84d6b1e5922f1e4c14528b66ef4213cee4
parent84208ce0135c0376208346d20a76add90d52aae4 (diff)
merge latest (4.3.99.16) from XFree86 (vendor) branchXEVIE-BASE
-rw-r--r--luit.c6
-rw-r--r--luit.man6
-rw-r--r--sys.c59
-rw-r--r--sys.h2
4 files changed, 61 insertions, 12 deletions
diff --git a/luit.c b/luit.c
index 41db6ff..a8258e5 100644
--- a/luit.c
+++ b/luit.c
@@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
-/* $XFree86: xc/programs/luit/luit.c,v 1.10 2003/02/24 01:10:25 dawes Exp $ */
+/* $XFree86: xc/programs/luit/luit.c,v 1.11 2003/09/08 14:25:30 eich Exp $ */
#include <stdio.h>
#include <stdlib.h>
@@ -545,6 +545,10 @@ parent(int pid, int pty)
#endif
installHandler(SIGCHLD, sigchldHandler);
+ rc = copyTermios(0, pty);
+ if(rc < 0)
+ FatalError("Couldn't copy terminal settings\n");
+
rc = setRawTermios();
if(rc < 0)
FatalError("Couldn't set terminal to raw\n");
diff --git a/luit.man b/luit.man
index a97da6d..0d84b93 100644
--- a/luit.man
+++ b/luit.man
@@ -1,4 +1,4 @@
-.\" $XFree86: xc/programs/luit/luit.man,v 1.7 2003/02/24 01:10:25 dawes Exp $
+.\" $XFree86: xc/programs/luit/luit.man,v 1.8 2003/04/03 16:44:36 dawes Exp $
.TH LUIT 1 __vendorversion__
.SH NAME
luit \- Locale and ISO\ 2022 support for Unicode terminals
@@ -202,8 +202,8 @@ the startup code has not been exhaustively audited, and the author
takes no responsibility for any resulting security issues.
.B Luit
-will refuse to run if it is installed setuid and the underlying system
-does not have POSIX saved ids.
+will refuse to run if it is installed setuid and cannot safely drop
+privileges.
.SH BUGS
None of this complexity should be necessary. Stateless UTF-8
throughout the system is the way to go.
diff --git a/sys.c b/sys.c
index 051deb7..d05fd8a 100644
--- a/sys.c
+++ b/sys.c
@@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
-/* $XFree86: xc/programs/luit/sys.c,v 1.7 2002/01/07 20:38:30 dawes Exp $ */
+/* $XFree86: xc/programs/luit/sys.c,v 1.10 2003/09/08 14:25:30 eich Exp $ */
#include <stdlib.h>
#include <string.h>
@@ -68,6 +68,10 @@ THE SOFTWARE.
#include <stropts.h>
#endif
+#if (defined(__unix__) || defined(unix)) && !defined(USG)
+#include <sys/param.h>
+#endif
+
#include "sys.h"
static int saved_tio_valid = 0;
@@ -211,6 +215,23 @@ installHandler(int signum, void (*handler)(int))
}
int
+copyTermios(int sfd, int dfd)
+{
+ struct termios tio;
+ int rc;
+
+ rc = tcgetattr(sfd, &tio);
+ if(rc < 0)
+ return -1;
+
+ rc = tcsetattr(dfd, TCSAFLUSH, &tio);
+ if(rc < 0)
+ return -1;
+
+ return 0;
+}
+
+int
saveTermios(void)
{
int rc;
@@ -311,7 +332,8 @@ allocatePty(int *pty_return, char **line_return)
{
char name[12], *line = NULL;
int pty = -1;
- char *name1 = "pqrstuvwxyzPQRST", *name2 = "0123456789abcdef";
+ char *name1 = "pqrstuvwxyzPQRST",
+ *name2 = "0123456789abcdefghijklmnopqrstuv";
char *p1, *p2;
#ifdef HAVE_GRANTPT
@@ -363,17 +385,16 @@ allocatePty(int *pty_return, char **line_return)
pty = open(name, O_RDWR);
if(pty >= 0)
goto found;
- if(errno == ENOENT)
- goto bail;
- else
- continue;
+ /* Systems derived from 4.4BSD differ in their pty names,
+ so ENOENT doesn't necessarily imply we're done. */
+ continue;
}
}
goto bail;
found:
- line = malloc(strlen(name));
+ line = malloc(strlen(name) + 1);
strcpy(line, name);
line[5] = 't';
fix_pty_perms(line);
@@ -429,7 +450,10 @@ openTty(char *line)
return -1;
}
-#ifdef _POSIX_SAVED_IDS
+/* Post-4.4 BSD systems have POSIX semantics (_POSIX_SAVED_IDS
+ or not, depending on the version). 4.3BSD and Minix do not have
+ saved IDs at all, so there's no issue. */
+#if (defined(BSD) && !defined(_POSIX_SAVED_IDS)) || defined(_MINIX)
int
droppriv()
{
@@ -439,6 +463,25 @@ droppriv()
return rc;
return setgid(getgid());
}
+#elif defined(_POSIX_SAVED_IDS)
+int
+droppriv()
+{
+ int uid = getuid();
+ int euid = geteuid();
+ int gid = getgid();
+ int egid = getegid();
+ int rc;
+
+ if((uid != euid || gid != egid) && euid != 0) {
+ errno = ENOSYS;
+ return -1;
+ }
+ rc = setuid(uid);
+ if(rc < 0)
+ return rc;
+ return setgid(gid);
+}
#else
int
droppriv()
diff --git a/sys.h b/sys.h
index f9cb086..b8d1407 100644
--- a/sys.h
+++ b/sys.h
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/luit/sys.h,v 1.3 2003/10/24 20:38:12 tsi Exp $ */
/*
Copyright (c) 2001 by Juliusz Chroboczek
@@ -24,6 +25,7 @@ int waitForOutput(int fd);
int waitForInput(int fd1, int fd2);
int setWindowSize(int sfd, int dfd);
int installHandler(int signum, void (*handler)(int));
+int copyTermios(int sfd, int dfd);
int saveTermios(void);
int restoreTermios(void);
int setRawTermios(void);