work around race condition in PK11_FindSlotByName()
Bug: https://bugzilla.mozilla.org/1297397
This commit is contained in:
		
							parent
							
								
									0f6a97db34
								
							
						
					
					
						commit
						165cb33f0a
					
				
							
								
								
									
										97
									
								
								0002-curl-7.51.0-find-slot-race.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								0002-curl-7.51.0-find-slot-race.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | ||||
| From 5812a71c283936b85a77bd2745d4c6bb673cb55f Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Wang <novalazy@gmail.com> | ||||
| Date: Fri, 26 Aug 2016 16:28:39 +1000 | ||||
| Subject: [PATCH] nss: work around race condition in PK11_FindSlotByName() | ||||
| 
 | ||||
| Serialise the call to PK11_FindSlotByName() to avoid spurious errors in | ||||
| a multi-threaded environment. The underlying cause is a race condition | ||||
| in nssSlot_IsTokenPresent(). | ||||
| 
 | ||||
| Bug: https://bugzilla.mozilla.org/1297397 | ||||
| 
 | ||||
| Closes #985 | ||||
| 
 | ||||
| Upstream-commit: 3a5d5de9ef52ebe8ca2bda2165edc1b34c242e54 | ||||
| Signed-off-by: Kamil Dudka <kdudka@redhat.com> | ||||
| ---
 | ||||
|  lib/vtls/nss.c | 22 +++++++++++++++++++--- | ||||
|  1 file changed, 19 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
 | ||||
| index e467360..1465c03 100644
 | ||||
| --- a/lib/vtls/nss.c
 | ||||
| +++ b/lib/vtls/nss.c
 | ||||
| @@ -81,6 +81,7 @@ PRFileDesc *PR_ImportTCPSocket(PRInt32 osfd);
 | ||||
|   | ||||
|  PRLock * nss_initlock = NULL; | ||||
|  PRLock * nss_crllock = NULL; | ||||
| +PRLock *nss_findslot_lock = NULL;
 | ||||
|  struct curl_llist *nss_crl_list = NULL; | ||||
|  NSSInitContext * nss_context = NULL; | ||||
|   | ||||
| @@ -340,6 +341,19 @@ static char* dup_nickname(struct Curl_easy *data, enum dupstring cert_kind)
 | ||||
|    return NULL; | ||||
|  } | ||||
|   | ||||
| +/* Lock/unlock wrapper for PK11_FindSlotByName() to work around race condition
 | ||||
| + * in nssSlot_IsTokenPresent() causing spurious SEC_ERROR_NO_TOKEN.  For more
 | ||||
| + * details, go to <https://bugzilla.mozilla.org/1297397>.
 | ||||
| + */
 | ||||
| +static PK11SlotInfo* nss_find_slot_by_name(const char *slot_name)
 | ||||
| +{
 | ||||
| +  PK11SlotInfo *slot;
 | ||||
| +  PR_Lock(nss_initlock);
 | ||||
| +  slot = PK11_FindSlotByName(slot_name);
 | ||||
| +  PR_Unlock(nss_initlock);
 | ||||
| +  return slot;
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* Call PK11_CreateGenericObject() with the given obj_class and filename.  If | ||||
|   * the call succeeds, append the object handle to the list of objects so that | ||||
|   * the object can be destroyed in Curl_nss_close(). */ | ||||
| @@ -362,7 +376,7 @@ static CURLcode nss_create_object(struct ssl_connect_data *ssl,
 | ||||
|    if(!slot_name) | ||||
|      return CURLE_OUT_OF_MEMORY; | ||||
|   | ||||
| -  slot = PK11_FindSlotByName(slot_name);
 | ||||
| +  slot = nss_find_slot_by_name(slot_name);
 | ||||
|    free(slot_name); | ||||
|    if(!slot) | ||||
|      return result; | ||||
| @@ -563,7 +577,7 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex,
 | ||||
|      return result; | ||||
|    } | ||||
|   | ||||
| -  slot = PK11_FindSlotByName("PEM Token #1");
 | ||||
| +  slot = nss_find_slot_by_name("PEM Token #1");
 | ||||
|    if(!slot) | ||||
|      return CURLE_SSL_CERTPROBLEM; | ||||
|   | ||||
| @@ -1013,7 +1027,7 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
 | ||||
|      struct CERTCertificateStr *cert; | ||||
|      struct SECKEYPrivateKeyStr *key; | ||||
|   | ||||
| -    PK11SlotInfo *slot = PK11_FindSlotByName(pem_slotname);
 | ||||
| +    PK11SlotInfo *slot = nss_find_slot_by_name(pem_slotname);
 | ||||
|      if(NULL == slot) { | ||||
|        failf(data, "NSS: PK11 slot not found: %s", pem_slotname); | ||||
|        return SECFailure; | ||||
| @@ -1249,6 +1263,7 @@ int Curl_nss_init(void)
 | ||||
|      PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 256); | ||||
|      nss_initlock = PR_NewLock(); | ||||
|      nss_crllock = PR_NewLock(); | ||||
| +    nss_findslot_lock = PR_NewLock();
 | ||||
|    } | ||||
|   | ||||
|    /* We will actually initialize NSS later */ | ||||
| @@ -1303,6 +1318,7 @@ void Curl_nss_cleanup(void)
 | ||||
|   | ||||
|    PR_DestroyLock(nss_initlock); | ||||
|    PR_DestroyLock(nss_crllock); | ||||
| +  PR_DestroyLock(nss_findslot_lock);
 | ||||
|    nss_initlock = NULL; | ||||
|   | ||||
|    initialized = 0; | ||||
| -- 
 | ||||
| 2.7.4 | ||||
| 
 | ||||
| @ -10,6 +10,9 @@ Source: http://curl.haxx.se/download/%{name}-%{version}.tar.lzma | ||||
| # (related to CVE-2016-5420) | ||||
| Patch1:   0001-curl-7.51.0-cert-reuse.patch | ||||
| 
 | ||||
| # work around race condition in PK11_FindSlotByName() | ||||
| Patch2:   0002-curl-7.51.0-find-slot-race.patch | ||||
| 
 | ||||
| # patch making libcurl multilib ready | ||||
| Patch101: 0101-curl-7.32.0-multilib.patch | ||||
| 
 | ||||
| @ -133,6 +136,7 @@ documentation of the library, too. | ||||
| 
 | ||||
| # upstream patches | ||||
| %patch1 -p1 | ||||
| %patch2 -p1 | ||||
| 
 | ||||
| # Fedora patches | ||||
| %patch101 -p1 | ||||
| @ -238,6 +242,7 @@ rm -rf $RPM_BUILD_ROOT | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Aug 26 2016 Kamil Dudka <kdudka@redhat.com> 7.50.1-2 | ||||
| - work around race condition in PK11_FindSlotByName() | ||||
| - fix incorrect use of a previously loaded certificate from file | ||||
|   (related to CVE-2016-5420) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user