basebuilder_pel7x64builder0
6 years ago
2 changed files with 254 additions and 1 deletions
@ -0,0 +1,246 @@ |
|||||||
|
From 31eddc5b70ff2158102af6c72849c3a500c4d002 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Aug 2018 15:05:22 +0200 |
||||||
|
Subject: [PATCH 1/5] pem_CreateObject: rewrite the conditions in the cert |
||||||
|
search loop |
||||||
|
|
||||||
|
... to make the code more readable. No changes in behavior are intended |
||||||
|
by this commit. |
||||||
|
|
||||||
|
Upstream-commit: 1d51c2337bc7156e3dfd7a8087ac4328f71174e3 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/pobject.c | 27 +++++++++++++++------------ |
||||||
|
1 file changed, 15 insertions(+), 12 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/pobject.c b/src/pobject.c |
||||||
|
index e8891d0..c8539f2 100644 |
||||||
|
--- a/src/pobject.c |
||||||
|
+++ b/src/pobject.c |
||||||
|
@@ -1209,7 +1209,6 @@ pem_CreateObject |
||||||
|
goto loser; |
||||||
|
} |
||||||
|
} else if (objClass == CKO_PRIVATE_KEY) { |
||||||
|
- /* Brute force: find the id of the certificate, if any, in this slot */ |
||||||
|
int i; |
||||||
|
SECItem certDER; |
||||||
|
CK_SESSION_HANDLE hSession; |
||||||
|
@@ -1222,24 +1221,28 @@ pem_CreateObject |
||||||
|
certDER.len = 0; /* in case there is no equivalent cert */ |
||||||
|
certDER.data = NULL; |
||||||
|
|
||||||
|
+ /* Brute force: find the id of the certificate, if any, in this slot */ |
||||||
|
objid = -1; |
||||||
|
for (i = 0; i < pem_nobjs; i++) { |
||||||
|
if (NULL == pem_objs[i]) |
||||||
|
continue; |
||||||
|
|
||||||
|
- if ((slotID == pem_objs[i]->slotID) && (pem_objs[i]->type == pemCert)) { |
||||||
|
- objid = atoi(pem_objs[i]->id.data); |
||||||
|
- certDER.data = |
||||||
|
- (void *) NSS_ZAlloc(NULL, pem_objs[i]->derCert->len); |
||||||
|
+ if (slotID != pem_objs[i]->slotID) |
||||||
|
+ continue; |
||||||
|
|
||||||
|
- if (certDER.data == NULL) |
||||||
|
- goto loser; |
||||||
|
+ if (pem_objs[i]->type != pemCert) |
||||||
|
+ continue; |
||||||
|
|
||||||
|
- certDER.len = pem_objs[i]->derCert->len; |
||||||
|
- memcpy(certDER.data, |
||||||
|
- pem_objs[i]->derCert->data, |
||||||
|
- pem_objs[i]->derCert->len); |
||||||
|
- } |
||||||
|
+ objid = atoi(pem_objs[i]->id.data); |
||||||
|
+ certDER.data = NSS_ZAlloc(NULL, pem_objs[i]->derCert->len); |
||||||
|
+ |
||||||
|
+ if (certDER.data == NULL) |
||||||
|
+ goto loser; |
||||||
|
+ |
||||||
|
+ certDER.len = pem_objs[i]->derCert->len; |
||||||
|
+ memcpy(certDER.data, |
||||||
|
+ pem_objs[i]->derCert->data, |
||||||
|
+ pem_objs[i]->derCert->len); |
||||||
|
} |
||||||
|
|
||||||
|
/* We're just adding a key, we'll assume the cert is next */ |
||||||
|
-- |
||||||
|
2.17.1 |
||||||
|
|
||||||
|
|
||||||
|
From 476e1a7db2b35146db6c1fb5c0cd230f84778583 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Aug 2018 15:09:01 +0200 |
||||||
|
Subject: [PATCH 2/5] pem_CreateObject: fix memory leak in the cert search loop |
||||||
|
|
||||||
|
If we search the array in reverse direction and stop on the first match, |
||||||
|
we end up with the same results but without leaking certDER.data in each |
||||||
|
iteration after the first match. |
||||||
|
|
||||||
|
Upstream-commit: e85b6f903fa38a34672428be114741d397f17fe2 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/pobject.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/pobject.c b/src/pobject.c |
||||||
|
index c8539f2..34d0b5a 100644 |
||||||
|
--- a/src/pobject.c |
||||||
|
+++ b/src/pobject.c |
||||||
|
@@ -1223,7 +1223,7 @@ pem_CreateObject |
||||||
|
|
||||||
|
/* Brute force: find the id of the certificate, if any, in this slot */ |
||||||
|
objid = -1; |
||||||
|
- for (i = 0; i < pem_nobjs; i++) { |
||||||
|
+ for (i = pem_nobjs - 1; 0 <= i; i--) { |
||||||
|
if (NULL == pem_objs[i]) |
||||||
|
continue; |
||||||
|
|
||||||
|
@@ -1243,6 +1243,7 @@ pem_CreateObject |
||||||
|
memcpy(certDER.data, |
||||||
|
pem_objs[i]->derCert->data, |
||||||
|
pem_objs[i]->derCert->len); |
||||||
|
+ break; |
||||||
|
} |
||||||
|
|
||||||
|
/* We're just adding a key, we'll assume the cert is next */ |
||||||
|
-- |
||||||
|
2.17.1 |
||||||
|
|
||||||
|
|
||||||
|
From dddc9331e35520b772b499475f5f2a67eeac8fef Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Aug 2018 15:12:46 +0200 |
||||||
|
Subject: [PATCH 3/5] pem_CreateObject: check object ID in the cert search loop |
||||||
|
|
||||||
|
We need to find a certificate that refers to the key being added, |
||||||
|
which is not necessarily the last certificate added to the slot. |
||||||
|
|
||||||
|
Bug: https://bugzilla.redhat.com/1610998 |
||||||
|
|
||||||
|
Upstream-commit: 5e6d9ce0d638eb6c9f25f31366960db2f8031716 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/pobject.c | 6 +++++- |
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/pobject.c b/src/pobject.c |
||||||
|
index 34d0b5a..918b327 100644 |
||||||
|
--- a/src/pobject.c |
||||||
|
+++ b/src/pobject.c |
||||||
|
@@ -1233,7 +1233,11 @@ pem_CreateObject |
||||||
|
if (pem_objs[i]->type != pemCert) |
||||||
|
continue; |
||||||
|
|
||||||
|
- objid = atoi(pem_objs[i]->id.data); |
||||||
|
+ if (atoi(pem_objs[i]->id.data) != pem_nobjs) |
||||||
|
+ /* not a certificate that refers to the key being added */ |
||||||
|
+ continue; |
||||||
|
+ |
||||||
|
+ objid = pem_nobjs; |
||||||
|
certDER.data = NSS_ZAlloc(NULL, pem_objs[i]->derCert->len); |
||||||
|
|
||||||
|
if (certDER.data == NULL) |
||||||
|
-- |
||||||
|
2.17.1 |
||||||
|
|
||||||
|
|
||||||
|
From ed88392c385d7a8733891fb736e9b7456331b617 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Aug 2018 15:22:23 +0200 |
||||||
|
Subject: [PATCH 4/5] AddObjectIfNeeded: use a pointer to avoid code |
||||||
|
duplication |
||||||
|
|
||||||
|
No changes in behavior intended by this commit. |
||||||
|
|
||||||
|
Upstream-commit: 0eafa24fdf0b54e5a63a76a7c63dc4000253c971 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/pinst.c | 15 ++++++++------- |
||||||
|
1 file changed, 8 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/pinst.c b/src/pinst.c |
||||||
|
index 5ac0ff3..c54cbe2 100644 |
||||||
|
--- a/src/pinst.c |
||||||
|
+++ b/src/pinst.c |
||||||
|
@@ -401,16 +401,17 @@ AddObjectIfNeeded(CK_OBJECT_CLASS objClass, |
||||||
|
|
||||||
|
/* first look for the object in pem_objs, it might be already there */ |
||||||
|
for (i = 0; i < pem_nobjs; i++) { |
||||||
|
- if (NULL == pem_objs[i]) |
||||||
|
+ pemInternalObject *const curObj = pem_objs[i]; |
||||||
|
+ if (NULL == curObj) |
||||||
|
continue; |
||||||
|
|
||||||
|
/* Comparing DER encodings is dependable and frees the PEM module |
||||||
|
* from having to require clients to provide unique nicknames. |
||||||
|
*/ |
||||||
|
- if ((pem_objs[i]->objClass == objClass) |
||||||
|
- && (pem_objs[i]->type == type) |
||||||
|
- && (pem_objs[i]->slotID == slotID) |
||||||
|
- && derEncodingsMatch(objClass, pem_objs[i], certDER, keyDER)) { |
||||||
|
+ if ((curObj->objClass == objClass) |
||||||
|
+ && (curObj->type == type) |
||||||
|
+ && (curObj->slotID == slotID) |
||||||
|
+ && derEncodingsMatch(objClass, curObj, certDER, keyDER)) { |
||||||
|
|
||||||
|
/* While adding a client certificate we (wrongly?) assumed that the |
||||||
|
* key object will follow right after the cert object. However, if |
||||||
|
@@ -420,8 +421,8 @@ AddObjectIfNeeded(CK_OBJECT_CLASS objClass, |
||||||
|
LinkSharedKeyObject(pem_nobjs, i); |
||||||
|
|
||||||
|
plog("AddObjectIfNeeded: re-using internal object #%i\n", i); |
||||||
|
- pem_objs[i]->refCount ++; |
||||||
|
- return pem_objs[i]; |
||||||
|
+ curObj->refCount ++; |
||||||
|
+ return curObj; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
2.17.1 |
||||||
|
|
||||||
|
|
||||||
|
From 9f0b5facee73afe5578e98010128a72236e6c370 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Aug 2018 16:00:50 +0200 |
||||||
|
Subject: [PATCH 5/5] AddObjectIfNeeded: update object ID while reusing a |
||||||
|
certificate |
||||||
|
|
||||||
|
... in case it refers to an object that has already been removed |
||||||
|
|
||||||
|
Bug: https://bugzilla.redhat.com/1610998 |
||||||
|
|
||||||
|
Upstream-commit: e14465a1238dcf7364dc07a1438d24111ccad3b1 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/pinst.c | 12 ++++++++++++ |
||||||
|
1 file changed, 12 insertions(+) |
||||||
|
|
||||||
|
diff --git a/src/pinst.c b/src/pinst.c |
||||||
|
index c54cbe2..25485b1 100644 |
||||||
|
--- a/src/pinst.c |
||||||
|
+++ b/src/pinst.c |
||||||
|
@@ -420,6 +420,18 @@ AddObjectIfNeeded(CK_OBJECT_CLASS objClass, |
||||||
|
*/ |
||||||
|
LinkSharedKeyObject(pem_nobjs, i); |
||||||
|
|
||||||
|
+ if (CKO_CERTIFICATE == objClass) { |
||||||
|
+ const int ref = atoi(curObj->id.data); |
||||||
|
+ if (0 < ref && ref < pem_nobjs && !pem_objs[ref]) { |
||||||
|
+ /* The certificate we are going to reuse refers to an |
||||||
|
+ * object that has already been removed. Make it refer |
||||||
|
+ * to the object that will be added next (private key). |
||||||
|
+ */ |
||||||
|
+ NSS_ZFreeIf(curObj->id.data); |
||||||
|
+ assignObjectID(curObj, pem_nobjs); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
plog("AddObjectIfNeeded: re-using internal object #%i\n", i); |
||||||
|
curObj->refCount ++; |
||||||
|
return curObj; |
||||||
|
-- |
||||||
|
2.17.1 |
||||||
|
|
Loading…
Reference in new issue