forked from puppetlabs/puppet-runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request puppetlabs#822 from skyamgarp/PA-6378
(PA-6378) Address a low-severity vulnerability, CVE-2024-2511
- Loading branch information
Showing
2 changed files
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c | ||
index 81a9f0728d..92bfaa3b02 100644 | ||
--- a/ssl/ssl_lib.c | ||
+++ b/ssl/ssl_lib.c | ||
@@ -3717,9 +3717,10 @@ void ssl_update_cache(SSL *s, int mode) | ||
|
||
/* | ||
* If the session_id_length is 0, we are not supposed to cache it, and it | ||
- * would be rather hard to do anyway :-) | ||
+ * would be rather hard to do anyway :-). Also if the session has already | ||
+ * been marked as not_resumable we should not cache it for later reuse. | ||
*/ | ||
- if (s->session->session_id_length == 0) | ||
+ if (s->session->session_id_length == 0 || s->session->not_resumable) | ||
return; | ||
|
||
/* | ||
diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c | ||
index d836b33ed0..75adbd9e52 100644 | ||
--- a/ssl/ssl_sess.c | ||
+++ b/ssl/ssl_sess.c | ||
@@ -152,16 +152,11 @@ SSL_SESSION *SSL_SESSION_new(void) | ||
return ss; | ||
} | ||
|
||
-SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) | ||
-{ | ||
- return ssl_session_dup(src, 1); | ||
-} | ||
- | ||
/* | ||
* Create a new SSL_SESSION and duplicate the contents of |src| into it. If | ||
* ticket == 0 then no ticket information is duplicated, otherwise it is. | ||
*/ | ||
-SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
+static SSL_SESSION *ssl_session_dup_intern(const SSL_SESSION *src, int ticket) | ||
{ | ||
SSL_SESSION *dest; | ||
|
||
@@ -285,6 +280,27 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
return NULL; | ||
} | ||
|
||
+SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) | ||
+{ | ||
+ return ssl_session_dup_intern(src, 1); | ||
+} | ||
+ | ||
+/* | ||
+ * Used internally when duplicating a session which might be already shared. | ||
+ * We will have resumed the original session. Subsequently we might have marked | ||
+ * it as non-resumable (e.g. in another thread) - but this copy should be ok to | ||
+ * resume from. | ||
+ */ | ||
+SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
+{ | ||
+ SSL_SESSION *sess = ssl_session_dup_intern(src, ticket); | ||
+ | ||
+ if (sess != NULL) | ||
+ sess->not_resumable = 0; | ||
+ | ||
+ return sess; | ||
+} | ||
+ | ||
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) | ||
{ | ||
if (len) | ||
diff --git a/ssl/statem/statem_srvr.c b/ssl/statem/statem_srvr.c | ||
index a9e67f9d32..6c942e6bce 100644 | ||
--- a/ssl/statem/statem_srvr.c | ||
+++ b/ssl/statem/statem_srvr.c | ||
@@ -2338,9 +2338,8 @@ int tls_construct_server_hello(SSL *s, WPACKET *pkt) | ||
* so the following won't overwrite an ID that we're supposed | ||
* to send back. | ||
*/ | ||
- if (s->session->not_resumable || | ||
- (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) | ||
- && !s->hit)) | ||
+ if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) | ||
+ && !s->hit) | ||
s->session->session_id_length = 0; | ||
|
||
if (usetls13) { |