summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_ciph.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_ciph.c')
-rw-r--r--src/lib/libssl/ssl_ciph.c70
1 files changed, 44 insertions, 26 deletions
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c
index 3df5e2fa80..a7ccefa30c 100644
--- a/src/lib/libssl/ssl_ciph.c
+++ b/src/lib/libssl/ssl_ciph.c
@@ -74,7 +74,7 @@
74#define SSL_ENC_NUM_IDX 9 74#define SSL_ENC_NUM_IDX 9
75 75
76static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={ 76static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={
77 NULL,NULL,NULL,NULL,NULL,NULL, 77 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
78 }; 78 };
79 79
80static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL; 80static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
@@ -253,7 +253,7 @@ int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
253 break; 253 break;
254 } 254 }
255 255
256 if ((i < 0) || (i > SSL_ENC_NUM_IDX)) 256 if ((i < 0) || (i >= SSL_ENC_NUM_IDX))
257 *enc=NULL; 257 *enc=NULL;
258 else 258 else
259 { 259 {
@@ -275,7 +275,7 @@ int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
275 i= -1; 275 i= -1;
276 break; 276 break;
277 } 277 }
278 if ((i < 0) || (i > SSL_MD_NUM_IDX)) 278 if ((i < 0) || (i >= SSL_MD_NUM_IDX))
279 *md=NULL; 279 *md=NULL;
280 else 280 else
281 *md=ssl_digest_methods[i]; 281 *md=ssl_digest_methods[i];
@@ -700,18 +700,9 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
700 if (!found) 700 if (!found)
701 break; /* ignore this entry */ 701 break; /* ignore this entry */
702 702
703 /* New algorithms: 703 algorithms |= ca_list[j]->algorithms;
704 * 1 - any old restrictions apply outside new mask
705 * 2 - any new restrictions apply outside old mask
706 * 3 - enforce old & new where masks intersect
707 */
708 algorithms = (algorithms & ~ca_list[j]->mask) | /* 1 */
709 (ca_list[j]->algorithms & ~mask) | /* 2 */
710 (algorithms & ca_list[j]->algorithms); /* 3 */
711 mask |= ca_list[j]->mask; 704 mask |= ca_list[j]->mask;
712 algo_strength = (algo_strength & ~ca_list[j]->mask_strength) | 705 algo_strength |= ca_list[j]->algo_strength;
713 (ca_list[j]->algo_strength & ~mask_strength) |
714 (algo_strength & ca_list[j]->algo_strength);
715 mask_strength |= ca_list[j]->mask_strength; 706 mask_strength |= ca_list[j]->mask_strength;
716 707
717 if (!multi) break; 708 if (!multi) break;
@@ -765,7 +756,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
765 { 756 {
766 int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases; 757 int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
767 unsigned long disabled_mask; 758 unsigned long disabled_mask;
768 STACK_OF(SSL_CIPHER) *cipherstack, *tmp_cipher_list; 759 STACK_OF(SSL_CIPHER) *cipherstack;
769 const char *rule_p; 760 const char *rule_p;
770 CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr; 761 CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr;
771 SSL_CIPHER **ca_list = NULL; 762 SSL_CIPHER **ca_list = NULL;
@@ -773,8 +764,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
773 /* 764 /*
774 * Return with error if nothing to do. 765 * Return with error if nothing to do.
775 */ 766 */
776 if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL) 767 if (rule_str == NULL) return(NULL);
777 return NULL;
778 768
779 if (init_ciphers) 769 if (init_ciphers)
780 { 770 {
@@ -885,18 +875,46 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
885 } 875 }
886 OPENSSL_free(co_list); /* Not needed any longer */ 876 OPENSSL_free(co_list); /* Not needed any longer */
887 877
888 tmp_cipher_list = sk_SSL_CIPHER_dup(cipherstack); 878 /*
889 if (tmp_cipher_list == NULL) 879 * The following passage is a little bit odd. If pointer variables
880 * were supplied to hold STACK_OF(SSL_CIPHER) return information,
881 * the old memory pointed to is free()ed. Then, however, the
882 * cipher_list entry will be assigned just a copy of the returned
883 * cipher stack. For cipher_list_by_id a copy of the cipher stack
884 * will be created. See next comment...
885 */
886 if (cipher_list != NULL)
887 {
888 if (*cipher_list != NULL)
889 sk_SSL_CIPHER_free(*cipher_list);
890 *cipher_list = cipherstack;
891 }
892
893 if (cipher_list_by_id != NULL)
894 {
895 if (*cipher_list_by_id != NULL)
896 sk_SSL_CIPHER_free(*cipher_list_by_id);
897 *cipher_list_by_id = sk_SSL_CIPHER_dup(cipherstack);
898 }
899
900 /*
901 * Now it is getting really strange. If something failed during
902 * the previous pointer assignment or if one of the pointers was
903 * not requested, the error condition is met. That might be
904 * discussable. The strange thing is however that in this case
905 * the memory "ret" pointed to is "free()ed" and hence the pointer
906 * cipher_list becomes wild. The memory reserved for
907 * cipher_list_by_id however is not "free()ed" and stays intact.
908 */
909 if ( (cipher_list_by_id == NULL) ||
910 (*cipher_list_by_id == NULL) ||
911 (cipher_list == NULL) ||
912 (*cipher_list == NULL))
890 { 913 {
891 sk_SSL_CIPHER_free(cipherstack); 914 sk_SSL_CIPHER_free(cipherstack);
892 return NULL; 915 return(NULL);
893 } 916 }
894 if (*cipher_list != NULL) 917
895 sk_SSL_CIPHER_free(*cipher_list);
896 *cipher_list = cipherstack;
897 if (*cipher_list_by_id != NULL)
898 sk_SSL_CIPHER_free(*cipher_list_by_id);
899 *cipher_list_by_id = tmp_cipher_list;
900 sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp); 918 sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
901 919
902 return(cipherstack); 920 return(cipherstack);