[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnupg-devel
Subject:    [PATCH gpgme] Relax ttyname_r error checks
From:       Daiki Ueno <ueno () gnu ! org>
Date:       2015-07-27 7:19:52
Message-ID: m3y4i2m5if.fsf-ueno () gnu ! org
[Download RAW message or body]

Hello,

This patch was originally attached to:
https://lists.gnupg.org/pipermail/gnupg-devel/2015-July/030090.html

I am re-sending it with a slight modification.  "make check" passed on
both chrooted and non-chrooted environments on Fedora 22.

Regards,
-- 
Daiki Ueno

[Attachment #3 (text/x-patch)]

From 94965ea7d6617d80c9da7ade71e233aa13285986 Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@gnu.org>
Date: Mon, 27 Jul 2015 15:54:48 +0900
Subject: [PATCH] Relax ttyname_r error checks

* src/engine-assuan.c (llass_new): Don't treat ttyname_r error as
fatal.
* src/engine-g13.c (g13_new): Likewise.
* src/engine-gpg.c (gpg_new): Likewise.
* src/engine-gpgsm.c (gpgsm_new): Likewise.
* src/engine-uiserver.c (uiserver_new): Likewise.

--
Even though isatty() returns 1, ttyname_r() may fail in many ways, e.g.,
when /dev/pts is not accessible under chroot.  Since all our uses of
ttyname_r() require that the function works, we can treat the failure as
if isatty() fails.

Signed-off-by: Daiki Ueno <ueno@gnu.org>
---
 src/engine-assuan.c   | 10 ++++------
 src/engine-g13.c      | 10 ++++------
 src/engine-gpg.c      | 13 ++++++++-----
 src/engine-gpgsm.c    | 10 ++++------
 src/engine-uiserver.c | 10 ++++------
 5 files changed, 24 insertions(+), 29 deletions(-)

diff --git a/src/engine-assuan.c b/src/engine-assuan.c
index 663b2ea..9902467 100644
--- a/src/engine-assuan.c
+++ b/src/engine-assuan.c
@@ -282,12 +282,10 @@ llass_new (void **engine, const char *file_name, const char *home_dir)
       char *dft_ttytype = NULL;
 
       rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-	{
-	  err = gpg_error_from_errno (rc);
-	  goto leave;
-	}
-      else
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+	 ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!rc)
 	{
 	  if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
 	    {
diff --git a/src/engine-g13.c b/src/engine-g13.c
index a9717ee..4a7b75c 100644
--- a/src/engine-g13.c
+++ b/src/engine-g13.c
@@ -286,12 +286,10 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
       int rc;
 
       rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-	{
-	  err = gpg_error_from_errno (rc);
-	  goto leave;
-	}
-      else
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+	 ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!rc)
 	{
 	  if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
 	    {
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index e14fd8d..0da374c 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -513,6 +513,8 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
 	rc = add_arg (gpg, dft_display);
 
       free (dft_display);
+      if (rc)
+	goto leave;
     }
 
   if (isatty (1))
@@ -520,9 +522,10 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
       int err;
 
       err = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (err)
-	rc = gpg_error_from_errno (err);
-      else
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+	 ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!err)
 	{
           if (*dft_ttyname)
             {
@@ -547,9 +550,9 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
 
 	      free (dft_ttytype);
 	    }
+	  if (rc)
+	    goto leave;
 	}
-      if (rc)
-	goto leave;
     }
 
  leave:
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index ac6c5fc..6615552 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -408,12 +408,10 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)
       int rc;
 
       rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-	{
-	  err = gpg_error_from_errno (rc);
-	  goto leave;
-	}
-      else
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+	 ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!rc)
 	{
 	  if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
 	    {
diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c
index a7184b7..e4fd47c 100644
--- a/src/engine-uiserver.c
+++ b/src/engine-uiserver.c
@@ -326,12 +326,10 @@ uiserver_new (void **engine, const char *file_name, const char *home_dir)
       int rc;
 
       rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-	{
-	  err = gpg_error_from_errno (rc);
-	  goto leave;
-	}
-      else
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+	 ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!rc)
 	{
 	  if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
 	    {
-- 
2.4.3



_______________________________________________
Gnupg-devel mailing list
Gnupg-devel@gnupg.org
http://lists.gnupg.org/mailman/listinfo/gnupg-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic