9d7d3f
From 93c0d8e98f3859c91fbfa2a6998235ee899e878e Mon Sep 17 00:00:00 2001
9d7d3f
From: Kamil Dudka <kdudka@redhat.com>
9d7d3f
Date: Thu, 20 Jul 2017 08:05:59 +0200
9d7d3f
Subject: [PATCH 1/2] nss: unify the coding style of nss_send() and nss_recv()
9d7d3f
9d7d3f
No changes in behavior intended by this commit.
9d7d3f
9d7d3f
Upstream-commit: c89eb6d0f87a3620074bc04a6af255e5dc3a523e
9d7d3f
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
9d7d3f
---
9d7d3f
 lib/nss.c | 12 +++++++-----
9d7d3f
 1 file changed, 7 insertions(+), 5 deletions(-)
9d7d3f
9d7d3f
diff --git a/lib/nss.c b/lib/nss.c
9d7d3f
index 9e0e373..ce1e25a 100644
9d7d3f
--- a/lib/nss.c
9d7d3f
+++ b/lib/nss.c
9d7d3f
@@ -1689,9 +1689,10 @@ static ssize_t nss_send(struct connectdata *conn,  /* connection data */
9d7d3f
                         size_t len,                /* amount to write */
9d7d3f
                         CURLcode *curlcode)
9d7d3f
 {
9d7d3f
-  int rc;
9d7d3f
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
9d7d3f
+  ssize_t rc;
9d7d3f
 
9d7d3f
-  rc = PR_Send(conn->ssl[sockindex].handle, mem, (int)len, 0, -1);
9d7d3f
+  rc = PR_Send(connssl->handle, mem, (int)len, 0, -1);
9d7d3f
 
9d7d3f
   if(rc < 0) {
9d7d3f
     PRInt32 err = PR_GetError();
9d7d3f
@@ -1714,15 +1715,16 @@ static ssize_t nss_send(struct connectdata *conn,  /* connection data */
9d7d3f
   return rc; /* number of bytes */
9d7d3f
 }
9d7d3f
 
9d7d3f
-static ssize_t nss_recv(struct connectdata * conn, /* connection data */
9d7d3f
-                        int num,                   /* socketindex */
9d7d3f
+static ssize_t nss_recv(struct connectdata *conn,  /* connection data */
9d7d3f
+                        int sockindex,             /* socketindex */
9d7d3f
                         char *buf,                 /* store read data here */
9d7d3f
                         size_t buffersize,         /* max amount to read */
9d7d3f
                         CURLcode *curlcode)
9d7d3f
 {
9d7d3f
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
9d7d3f
   ssize_t nread;
9d7d3f
 
9d7d3f
-  nread = PR_Recv(conn->ssl[num].handle, buf, (int)buffersize, 0, -1);
9d7d3f
+  nread = PR_Recv(connssl->handle, buf, (int)buffersize, 0, -1);
9d7d3f
   if(nread < 0) {
9d7d3f
     /* failed SSL read */
9d7d3f
     PRInt32 err = PR_GetError();
9d7d3f
-- 
9d7d3f
2.13.5
9d7d3f
9d7d3f
9d7d3f
From 032731492497a1cde17752f8c178719bd32a7722 Mon Sep 17 00:00:00 2001
9d7d3f
From: Kamil Dudka <kdudka@redhat.com>
9d7d3f
Date: Wed, 19 Jul 2017 18:02:26 +0200
9d7d3f
Subject: [PATCH 2/2] nss: fix a possible use-after-free in SelectClientCert()
9d7d3f
9d7d3f
... causing a SIGSEGV in showit() in case the handle used to initiate
9d7d3f
the connection has already been freed.
9d7d3f
9d7d3f
This commit fixes a bug introduced in curl-7_19_5-204-g5f0cae803.
9d7d3f
9d7d3f
Reported-by: Rob Sanders
9d7d3f
Bug: https://bugzilla.redhat.com/1436158
9d7d3f
9d7d3f
Upstream-commit: 42a4cd4c78b3feb5ca07286479129116e125a730
9d7d3f
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
9d7d3f
---
9d7d3f
 lib/nss.c | 8 ++++++++
9d7d3f
 1 file changed, 8 insertions(+)
9d7d3f
9d7d3f
diff --git a/lib/nss.c b/lib/nss.c
9d7d3f
index ce1e25a..b73a1e8 100644
9d7d3f
--- a/lib/nss.c
9d7d3f
+++ b/lib/nss.c
9d7d3f
@@ -1692,6 +1692,10 @@ static ssize_t nss_send(struct connectdata *conn,  /* connection data */
9d7d3f
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
9d7d3f
   ssize_t rc;
9d7d3f
 
9d7d3f
+  /* The SelectClientCert() hook uses this for infof() and failf() but the
9d7d3f
+     handle stored in nss_setup_connect() could have already been freed. */
9d7d3f
+  connssl->data = conn->data;
9d7d3f
+
9d7d3f
   rc = PR_Send(connssl->handle, mem, (int)len, 0, -1);
9d7d3f
 
9d7d3f
   if(rc < 0) {
9d7d3f
@@ -1724,6 +1728,10 @@ static ssize_t nss_recv(struct connectdata *conn,  /* connection data */
9d7d3f
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
9d7d3f
   ssize_t nread;
9d7d3f
 
9d7d3f
+  /* The SelectClientCert() hook uses this for infof() and failf() but the
9d7d3f
+     handle stored in nss_setup_connect() could have already been freed. */
9d7d3f
+  connssl->data = conn->data;
9d7d3f
+
9d7d3f
   nread = PR_Recv(connssl->handle, buf, (int)buffersize, 0, -1);
9d7d3f
   if(nread < 0) {
9d7d3f
     /* failed SSL read */
9d7d3f
-- 
9d7d3f
2.13.5
9d7d3f