summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2015-10-23 21:17:25 +0200
committerJulian Andres Klode <jak@debian.org>2015-10-30 14:20:43 +0100
commit2a0cae347a058f0cc5d81477f75ed0c12b1e54e3 (patch)
tree0c58c076732d51d781cd0e54de4f7ad2ca1307b1
parent2609e7cea39fb32a999acef014ea9ce6e9b3d141 (diff)
dpkgpm: Use ptsname_r() instead of ptsname() to be thread-safe
This function only exists on a limited number of platforms, so we add a configure check to make sure it exists. Gbp-Dch: ignore
-rw-r--r--apt-pkg/deb/dpkgpm.cc5
-rw-r--r--buildlib/config.h.in3
-rw-r--r--configure.ac3
3 files changed, 11 insertions, 0 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 0f195b921..5c7710036 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -1082,8 +1082,13 @@ void pkgDPkgPM::StartPtyMagic()
_error->Errno("unlockpt", "Unlocking the slave of master fd %d failed!", d->master);
else
{
+#ifdef HAVE_PTS_NAME_R
+ char slave_name[64]; // 64 is used by bionic
+ if (ptsname_r(d->master, slave_name, sizeof(slave_name)) != 0)
+#else
char const * const slave_name = ptsname(d->master);
if (slave_name == NULL)
+#endif
_error->Errno("ptsname", "Getting name for slave of master fd %d failed!", d->master);
else
{
diff --git a/buildlib/config.h.in b/buildlib/config.h.in
index c6b1ee669..a887ebf88 100644
--- a/buildlib/config.h.in
+++ b/buildlib/config.h.in
@@ -34,6 +34,9 @@
#undef HAVE_SETRESUID
#undef HAVE_SETRESGID
+/* Check for ptsname_r() */
+#undef HAVE_PTSNAME_R
+
/* Define to the size of the filesize containing structures */
#undef _FILE_OFFSET_BITS
diff --git a/configure.ac b/configure.ac
index 5c880845c..8bf87754b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -180,6 +180,9 @@ AC_SUBST(HAVE_GETRESGID)
AC_SUBST(HAVE_SETRESUID)
AC_SUBST(HAVE_SETRESGID)
+AC_CHECK_FUNC(ptsname_r)
+AC_SUBST(HAVE_PTSNAME_R)
+
dnl Check for doxygen
AC_PATH_PROG(DOXYGEN, doxygen)