OpenCoverage

sshpty.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/sshpty.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: sshpty.c,v 1.31 2016/11/29 03:54:50 dtucker Exp $ */-
2/*-
3 * Author: Tatu Ylonen <ylo@cs.hut.fi>-
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland-
5 * All rights reserved-
6 * Allocating a pseudo-terminal, and making it the controlling tty.-
7 *-
8 * As far as I am concerned, the code I have written for this software-
9 * can be used freely for any purpose. Any derived versions of this-
10 * software must be clearly marked as such, and if the derived work is-
11 * incompatible with the protocol description in the RFC file, it must be-
12 * called by a name other than "ssh" or "Secure Shell".-
13 */-
14-
15#include "includes.h"-
16-
17#include <sys/types.h>-
18#include <sys/ioctl.h>-
19#include <sys/stat.h>-
20#include <signal.h>-
21-
22#include <errno.h>-
23#include <fcntl.h>-
24#include <grp.h>-
25#ifdef HAVE_PATHS_H-
26# include <paths.h>-
27#endif-
28#include <pwd.h>-
29#include <stdarg.h>-
30#include <string.h>-
31#include <termios.h>-
32#ifdef HAVE_UTIL_H-
33# include <util.h>-
34#endif-
35#include <unistd.h>-
36-
37#include "sshpty.h"-
38#include "log.h"-
39#include "misc.h"-
40-
41#ifdef HAVE_PTY_H-
42# include <pty.h>-
43#endif-
44-
45#ifndef O_NOCTTY-
46#define O_NOCTTY 0-
47#endif-
48-
49#ifdef __APPLE__-
50# include <AvailabilityMacros.h>-
51# if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)-
52# define __APPLE_PRIVPTY__-
53# endif-
54#endif-
55-
56/*-
57 * Allocates and opens a pty. Returns 0 if no pty could be allocated, or-
58 * nonzero if a pty was successfully allocated. On success, open file-
59 * descriptors for the pty and tty sides and the name of the tty side are-
60 * returned (the buffer must be able to hold at least 64 characters).-
61 */-
62-
63int-
64pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, size_t namebuflen)-
65{-
66 /* openpty(3) exists in OSF/1 and some other os'es */-
67 char *name;-
68 int i;-
69-
70 i = openpty(ptyfd, ttyfd, NULL, NULL, NULL);-
71 if (i < 0) {
i < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
72 error("openpty: %.100s", strerror(errno));-
73 return 0;
never executed: return 0;
0
74 }-
75 name = ttyname(*ttyfd);-
76 if (!name)
!nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
77 fatal("openpty returns device for which ttyname fails.");
never executed: fatal("openpty returns device for which ttyname fails.");
0
78-
79 strlcpy(namebuf, name, namebuflen); /* possible truncation */-
80 return 1;
never executed: return 1;
0
81}-
82-
83/* Releases the tty. Its ownership is returned to root, and permissions to 0666. */-
84-
85void-
86pty_release(const char *tty)-
87{-
88#if !defined(__APPLE_PRIVPTY__) && !defined(HAVE_OPENPTY)-
89 if (chown(tty, (uid_t) 0, (gid_t) 0) < 0)-
90 error("chown %.100s 0 0 failed: %.100s", tty, strerror(errno));-
91 if (chmod(tty, (mode_t) 0666) < 0)-
92 error("chmod %.100s 0666 failed: %.100s", tty, strerror(errno));-
93#endif /* !__APPLE_PRIVPTY__ && !HAVE_OPENPTY */-
94}-
95-
96/* Makes the tty the process's controlling tty and sets it to sane modes. */-
97-
98void-
99pty_make_controlling_tty(int *ttyfd, const char *tty)-
100{-
101 int fd;-
102-
103 /* First disconnect from the old controlling tty. */-
104#ifdef TIOCNOTTY-
105 fd = open(_PATH_TTY, O_RDWR | O_NOCTTY);-
106 if (fd >= 0) {
fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
107 (void) ioctl(fd, TIOCNOTTY, NULL);-
108 close(fd);-
109 }
never executed: end of block
0
110#endif /* TIOCNOTTY */-
111 if (setsid() < 0)
setsid() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
112 error("setsid: %.100s", strerror(errno));
never executed: error("setsid: %.100s", strerror( (*__errno_location ()) ));
0
113-
114 /*-
115 * Verify that we are successfully disconnected from the controlling-
116 * tty.-
117 */-
118 fd = open(_PATH_TTY, O_RDWR | O_NOCTTY);-
119 if (fd >= 0) {
fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
120 error("Failed to disconnect from controlling tty.");-
121 close(fd);-
122 }
never executed: end of block
0
123 /* Make it our controlling tty. */-
124#ifdef TIOCSCTTY-
125 debug("Setting controlling tty using TIOCSCTTY.");-
126 if (ioctl(*ttyfd, TIOCSCTTY, NULL) < 0)
ioctl(*ttyfd, ...oid *)0) ) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
127 error("ioctl(TIOCSCTTY): %.100s", strerror(errno));
never executed: error("ioctl(TIOCSCTTY): %.100s", strerror( (*__errno_location ()) ));
0
128#endif /* TIOCSCTTY */-
129#ifdef NEED_SETPGRP-
130 if (setpgrp(0,0) < 0)-
131 error("SETPGRP %s",strerror(errno));-
132#endif /* NEED_SETPGRP */-
133 fd = open(tty, O_RDWR);-
134 if (fd < 0)
fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
135 error("%.100s: %.100s", tty, strerror(errno));
never executed: error("%.100s: %.100s", tty, strerror( (*__errno_location ()) ));
0
136 else-
137 close(fd);
never executed: close(fd);
0
138-
139 /* Verify that we now have a controlling tty. */-
140 fd = open(_PATH_TTY, O_WRONLY);-
141 if (fd < 0)
fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
142 error("open /dev/tty failed - could not set controlling tty: %.100s",
never executed: error("open /dev/tty failed - could not set controlling tty: %.100s", strerror( (*__errno_location ()) ));
0
143 strerror(errno));
never executed: error("open /dev/tty failed - could not set controlling tty: %.100s", strerror( (*__errno_location ()) ));
0
144 else-
145 close(fd);
never executed: close(fd);
0
146}-
147-
148/* Changes the window size associated with the pty. */-
149-
150void-
151pty_change_window_size(int ptyfd, u_int row, u_int col,-
152 u_int xpixel, u_int ypixel)-
153{-
154 struct winsize w;-
155-
156 /* may truncate u_int -> u_short */-
157 w.ws_row = row;-
158 w.ws_col = col;-
159 w.ws_xpixel = xpixel;-
160 w.ws_ypixel = ypixel;-
161 (void) ioctl(ptyfd, TIOCSWINSZ, &w);-
162}
never executed: end of block
0
163-
164void-
165pty_setowner(struct passwd *pw, const char *tty)-
166{-
167 struct group *grp;-
168 gid_t gid;-
169 mode_t mode;-
170 struct stat st;-
171-
172 /* Determine the group to make the owner of the tty. */-
173 grp = getgrnam("tty");-
174 gid = (grp != NULL) ? grp->gr_gid : pw->pw_gid;
(grp != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
175 mode = (grp != NULL) ? 0620 : 0600;
(grp != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
176-
177 /*-
178 * Change owner and mode of the tty as required.-
179 * Warn but continue if filesystem is read-only and the uids match/-
180 * tty is owned by root.-
181 */-
182 if (stat(tty, &st))
stat(tty, &st)Description
TRUEnever evaluated
FALSEnever evaluated
0
183 fatal("stat(%.100s) failed: %.100s", tty,
never executed: fatal("stat(%.100s) failed: %.100s", tty, strerror( (*__errno_location ()) ));
0
184 strerror(errno));
never executed: fatal("stat(%.100s) failed: %.100s", tty, strerror( (*__errno_location ()) ));
0
185-
186#ifdef WITH_SELINUX-
187 ssh_selinux_setup_pty(pw->pw_name, tty);-
188#endif-
189-
190 if (st.st_uid != pw->pw_uid || st.st_gid != gid) {
st.st_uid != pw->pw_uidDescription
TRUEnever evaluated
FALSEnever evaluated
st.st_gid != gidDescription
TRUEnever evaluated
FALSEnever evaluated
0
191 if (chown(tty, pw->pw_uid, gid) < 0) {
chown(tty, pw-..._uid, gid) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
192 if (errno == EROFS &&
(*__errno_location ()) == 30Description
TRUEnever evaluated
FALSEnever evaluated
0
193 (st.st_uid == pw->pw_uid || st.st_uid == 0))
st.st_uid == pw->pw_uidDescription
TRUEnever evaluated
FALSEnever evaluated
st.st_uid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
194 debug("chown(%.100s, %u, %u) failed: %.100s",
never executed: debug("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
195 tty, (u_int)pw->pw_uid, (u_int)gid,
never executed: debug("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
196 strerror(errno));
never executed: debug("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
197 else-
198 fatal("chown(%.100s, %u, %u) failed: %.100s",
never executed: fatal("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
199 tty, (u_int)pw->pw_uid, (u_int)gid,
never executed: fatal("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
200 strerror(errno));
never executed: fatal("chown(%.100s, %u, %u) failed: %.100s", tty, (u_int)pw->pw_uid, (u_int)gid, strerror( (*__errno_location ()) ));
0
201 }-
202 }
never executed: end of block
0
203-
204 if ((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != mode) {
(st.st_mode & ... 3) )) != modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
205 if (chmod(tty, mode) < 0) {
chmod(tty, mode) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
206 if (errno == EROFS &&
(*__errno_location ()) == 30Description
TRUEnever evaluated
FALSEnever evaluated
0
207 (st.st_mode & (S_IRGRP | S_IROTH)) == 0)
(st.st_mode & ... >> 3) )) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
208 debug("chmod(%.100s, 0%o) failed: %.100s",
never executed: debug("chmod(%.100s, 0%o) failed: %.100s", tty, (u_int)mode, strerror( (*__errno_location ()) ));
0
209 tty, (u_int)mode, strerror(errno));
never executed: debug("chmod(%.100s, 0%o) failed: %.100s", tty, (u_int)mode, strerror( (*__errno_location ()) ));
0
210 else-
211 fatal("chmod(%.100s, 0%o) failed: %.100s",
never executed: fatal("chmod(%.100s, 0%o) failed: %.100s", tty, (u_int)mode, strerror( (*__errno_location ()) ));
0
212 tty, (u_int)mode, strerror(errno));
never executed: fatal("chmod(%.100s, 0%o) failed: %.100s", tty, (u_int)mode, strerror( (*__errno_location ()) ));
0
213 }-
214 }
never executed: end of block
0
215}
never executed: end of block
0
216-
217/* Disconnect from the controlling tty. */-
218void-
219disconnect_controlling_tty(void)-
220{-
221#ifdef TIOCNOTTY-
222 int fd;-
223-
224 if ((fd = open(_PATH_TTY, O_RDWR | O_NOCTTY)) >= 0) {
(fd = open( "/...| 0400 )) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
225 (void) ioctl(fd, TIOCNOTTY, NULL);-
226 close(fd);-
227 }
never executed: end of block
0
228#endif /* TIOCNOTTY */-
229}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2