diff options
author | Christian Brauner <christian.brauner@ubuntu.com> | 2017-10-08 14:09:47 +0200 |
---|---|---|
committer | Christian Brauner <christian.brauner@ubuntu.com> | 2017-10-08 17:46:19 +0200 |
commit | 98e0742024d4c13c08a6076b3d119c250e7d0118 (patch) | |
tree | fd5901696086595b8b036376c13c8ee1317f0307 /login | |
parent | e7a574594931a8221b39432dc0637ec7423b14f6 (diff) | |
download | glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.zip glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.tar.gz glibc-98e0742024d4c13c08a6076b3d119c250e7d0118.tar.bz2 |
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.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/login/openpty.c b/login/openpty.c index 41ab048..9e556c2 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) |