[pkg-opensc-commit] [opensc] 11/295: Fixed interaction with DNIe UI

Eric Dorland eric at moszumanska.debian.org
Sat Jun 24 21:11:11 UTC 2017


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository opensc.

commit eee4d74721878f7537231f8ca78c23369d5c7570
Author: Javier Serrano Polo <javier at jasp.net>
Date:   Mon Jun 6 01:56:51 2016 +0200

    Fixed interaction with DNIe UI
---
 src/libopensc/card-dnie.c | 42 +++++++++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/libopensc/card-dnie.c b/src/libopensc/card-dnie.c
index 93f91a4..20b66ba 100644
--- a/src/libopensc/card-dnie.c
+++ b/src/libopensc/card-dnie.c
@@ -165,6 +165,25 @@ const char *user_consent_message="Esta a punto de realizar una firma digital\nco
 char *user_consent_msgs[] = { "SETTITLE", "SETDESC", "CONFIRM", "BYE" };
 
 /**
+ * Do fgets() without interruptions.
+ *
+ * Retry the operation if it is interrupted, such as with receiving an alarm.
+ *
+ * @param s Buffer receiving the data
+ * @param size Size of the buffer
+ * @param stream Stream to read
+ * @return s on success, NULL on error
+ */
+static char *nointr_fgets(char *s, int size, FILE *stream)
+{
+	while (fgets(s, size, stream) == NULL) {
+		if (feof(stream) || errno != EINTR)
+			return NULL;
+	}
+	return s;
+}
+
+/**
  * Ask for user consent.
  *
  * Check for user consent configuration,
@@ -286,9 +305,8 @@ int dnie_ask_user_consent(struct sc_card * card, const char *title, const char *
 		/* call exec() with proper user_consent_app from configuration */
 		/* if ok should never return */
 		execlp(GET_DNIE_UI_CTX(card).user_consent_app, GET_DNIE_UI_CTX(card).user_consent_app, (char *)NULL);
-		res = SC_ERROR_INTERNAL;
-		msg = "execlp() error";	/* exec() failed */
-		goto do_error;
+		sc_log(card->ctx, "execlp() error");
+		abort();
 	default:		/* parent */
 		/* Close the pipe ends that the child uses to read from / write to
 		 * so when we close the others, an EOF will be transmitted properly.
@@ -307,22 +325,24 @@ int dnie_ask_user_consent(struct sc_card * card, const char *title, const char *
 			goto do_error;
 		}
 		/* read and ignore first line */
-		fflush(stdin);
+		if (nointr_fgets(buf, sizeof(buf), fin) == NULL) {
+			res = SC_ERROR_INTERNAL;
+			msg = "nointr_fgets() Unexpected IOError/EOF";
+			goto do_error;
+		}
 		for (n = 0; n<4; n++) {
 			char *pt;
-			memset(outbuf, 0, sizeof(outbuf));
-			if (n==0) snprintf(outbuf,1023,"%s %s\n",user_consent_msgs[0],title);
-			else if (n==1) snprintf(outbuf,1023,"%s %s\n",user_consent_msgs[1],message);
-			else snprintf(outbuf,1023,"%s\n",user_consent_msgs[n]);
+			if (n==0) snprintf(outbuf, sizeof outbuf,"%s %s\n",user_consent_msgs[0],title);
+			else if (n==1) snprintf(outbuf, sizeof outbuf,"%s %s\n",user_consent_msgs[1],message);
+			else snprintf(outbuf, sizeof outbuf,"%s\n",user_consent_msgs[n]);
 			/* send message */
 			fputs(outbuf, fout);
 			fflush(fout);
 			/* get response */
-			memset(buf, 0, sizeof(buf));
-			pt=fgets(buf, sizeof(buf) - 1, fin);
+			pt=nointr_fgets(buf, sizeof(buf), fin);
 			if (pt==NULL) {
 				res = SC_ERROR_INTERNAL;
-				msg = "fgets() Unexpected IOError/EOF";
+				msg = "nointr_fgets() Unexpected IOError/EOF";
 				goto do_error;
 			}
 			if (strstr(buf, "OK") == NULL) {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/opensc.git



More information about the pkg-opensc-commit mailing list