aboutsummaryrefslogtreecommitdiff
path: root/login
diff options
context:
space:
mode:
authorChristian Brauner <christian.brauner@ubuntu.com>2017-10-08 14:09:47 +0200
committerChristian Brauner <christian.brauner@ubuntu.com>2017-10-08 17:46:19 +0200
commit98e0742024d4c13c08a6076b3d119c250e7d0118 (patch)
treefd5901696086595b8b036376c13c8ee1317f0307 /login
parente7a574594931a8221b39432dc0637ec7423b14f6 (diff)
downloadglibc-98e0742024d4c13c08a6076b3d119c250e7d0118.tar
glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.tar.gz
glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.tar.bz2
glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.zip
openpty: close slave pty fd on error
When openpty() failed only the master fd was closed so far. Let's close the slave fd as well. Also, let's unify the error handling. Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Diffstat (limited to 'login')
-rw-r--r--login/openpty.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/login/openpty.c b/login/openpty.c
index 41ab0483e2..9e556c27a5 100644
--- a/login/openpty.c
+++ b/login/openpty.c
@@ -92,29 +92,24 @@ openpty (int *amaster, int *aslave, char *name,
char _buf[512];
#endif
char *buf = _buf;
- int master, slave;
+ int master, ret = -1, slave = -1;
master = getpt ();
if (master == -1)
return -1;
if (grantpt (master))
- goto fail;
+ goto on_error;
if (unlockpt (master))
- goto fail;
+ goto on_error;
if (pts_name (master, &buf, sizeof (_buf)))
- goto fail;
+ goto on_error;
slave = open (buf, O_RDWR | O_NOCTTY);
if (slave == -1)
- {
- if (buf != _buf)
- free (buf);
-
- goto fail;
- }
+ goto on_error;
/* XXX Should we ignore errors here? */
if (termp)
@@ -129,12 +124,19 @@ openpty (int *amaster, int *aslave, char *name,
if (name != NULL)
strcpy (name, buf);
+ ret = 0;
+
+ on_error:
+ if (ret == -1) {
+ close (master);
+
+ if (slave != -1)
+ close (slave);
+ }
+
if (buf != _buf)
free (buf);
- return 0;
- fail:
- close (master);
- return -1;
+ return ret;
}
libutil_hidden_def (openpty)