On 2017-12-17 18:35:17 [+0100], Hilko Bengen wrote: > Control: tag -1 patch -fixed-upstream > > I don't see where the direct struct access issues have been fixed > upstream, the source code snapshot available from > http://www.kermitproject.org/ckdaily.html still has lots of those. > > I have prepared a patch that fixes building with OpenSSL 1.1 and would > appreciate a review.
>Index: ckermit-302/ck_ssl.c >=================================================================== >--- ckermit-302.orig/ck_ssl.c >+++ ckermit-302/ck_ssl.c >@@ -975,13 +981,15 @@ static DH * > get_dh1536() > { > DH *dh=NULL; >+ BIGNUM *p, *g; > > if ((dh=DH_new()) == NULL) > return(NULL); >- dh->p=BN_bin2bn(dh1536_p,sizeof(dh1536_p),NULL); >- dh->g=BN_bin2bn(dh1536_g,sizeof(dh1536_g),NULL); >- if ((dh->p == NULL) || (dh->g == NULL)) >+ p=BN_bin2bn(dh1536_p,sizeof(dh1536_p),NULL); >+ g=BN_bin2bn(dh1536_g,sizeof(dh1536_g),NULL); >+ if ((p == NULL) || (g == NULL)) > return(NULL); >+ DH_set0_pqg(dh, p, NULL, g); > return(dh); Those DH values should not be static / compiled in (e.g. the same on every server) but not the scope of the patch… > } > >@@ -1457,13 +1468,15 @@ the build.\r\n\r\n"); > > #ifdef ZLIB > cm = COMP_zlib(); >- if (cm != NULL && cm->type != NID_undef) { >+ if (cm != NULL && SSL_COMP_get_id(cm) != NID_undef) { > SSL_COMP_add_compression_method(0xe0, cm); /* EAY's ZLIB ID */ > } > #endif /* ZLIB */ >+#if 0 /* COMP_rle has apparently been removed in OpenSSL 1.1 */ > cm = COMP_rle(); > if (cm != NULL && cm->type != NID_undef) > SSL_COMP_add_compression_method(0xe1, cm); /* EAY's RLE ID */ >+#endif yes, but that ZLIB in the above shouldn't work since it should not be compiled in :) Anyway, a check for OpenSSL version instead that if0 would be better. >@@ -2583,7 +2598,7 @@ ssl_anonymous_cipher(ssl) SSL * ssl; > int > ssl_verify_crl(int ok, X509_STORE_CTX *ctx) > { >- X509_OBJECT obj; >+ X509_OBJECT *obj = X509_OBJECT_new(); this may be NULL > X509_NAME *subject = NULL; > X509_NAME *issuer = NULL; > X509 *xs = NULL; >@@ -2649,11 +2664,10 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > * Try to retrieve a CRL corresponding to the _subject_ of > * the current certificate in order to verify it's integrity. > */ and before that where were two return statemens where you would leak `obj'. >- memset((char *)&obj, 0, sizeof(obj)); > X509_STORE_CTX_init(store_ctx, crl_store, NULL, NULL); >- rc = X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, &obj); >+ rc = X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, subject, obj); > X509_STORE_CTX_cleanup(store_ctx); >- crl = obj.data.crl; >+ crl = X509_OBJECT_get0_X509_CRL(obj); > if (rc > 0 && crl != NULL) { > /* > * Verify the signature on this CRL >@@ -2661,7 +2675,7 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > if (X509_CRL_verify(crl, X509_get_pubkey(xs)) <= 0) { > fprintf(stderr, "Invalid signature on CRL!\n"); > X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_SIGNATURE_FAILURE); >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(obj); > X509_STORE_CTX_free(store_ctx); > return 0; > } >@@ -2674,7 +2688,7 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > fprintf(stderr, "Found CRL has invalid nextUpdate field.\n"); > X509_STORE_CTX_set_error(ctx, > > X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD); >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(&obj); > X509_STORE_CTX_free(store_ctx); > return 0; > } >@@ -2683,11 +2697,11 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > "Found CRL is expired - revoking all certificates until you get updated > CRL.\n" > ); > X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_HAS_EXPIRED); >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(&obj); > X509_STORE_CTX_free(store_ctx); > return 0; > } >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(&obj); I *think* that this won't work. You free `obj' here and in the next hunk you use it again. > } > > /* >@@ -2698,7 +2712,7 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > X509_STORE_CTX_init(store_ctx, crl_store, NULL, NULL); > rc = X509_STORE_get_by_subject(store_ctx, X509_LU_CRL, issuer, &obj); > X509_STORE_CTX_free(store_ctx); /* calls > X509_STORE_CTX_cleanup() */ >- crl = obj.data.crl; >+ crl = X509_OBJECT_get0_X509_CRL(obj); > if (rc > 0 && crl != NULL) { > /* > * Check if the current certificate is revoked by this CRL >@@ -2706,19 +2720,19 @@ ssl_verify_crl(int ok, X509_STORE_CTX *c > n = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl)); > for (i = 0; i < n; i++) { > revoked = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i); >- if (ASN1_INTEGER_cmp(revoked->serialNumber, >+ if (ASN1_INTEGER_cmp(X509_REVOKED_get0_serialNumber(revoked), > X509_get_serialNumber(xs)) == 0) { > >- serial = ASN1_INTEGER_get(revoked->serialNumber); >+ serial = >ASN1_INTEGER_get(X509_REVOKED_get0_serialNumber(revoked)); > cp = X509_NAME_oneline(issuer, NULL, 0); > free(cp); > > X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REVOKED); >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(&obj); > return 0; > } > } >- X509_OBJECT_free_contents(&obj); >+ X509_OBJECT_free(&obj); > } I would move that out of that loop/condition since you want to free that in every case. > return ok; > } I am impressed by the amount of SSL usage for a terminal program. > Cheers, > -Hilko Sebastian