]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0' into PHP-7.1
authorAnatol Belski <ab@php.net>
Thu, 2 Feb 2017 12:06:31 +0000 (13:06 +0100)
committerAnatol Belski <ab@php.net>
Thu, 2 Feb 2017 12:06:31 +0000 (13:06 +0100)
* PHP-7.0:
  Fixed #74022 PHP Fast CGI crashes when reading from a pfx file.

1  2 
ext/openssl/openssl.c

index 47a28a111174485d2205e2b351bd6e718b1898a2,da60bb9486074756a160ebfdeeb18142a142fad4..8de329aec7b84d623b705164bb5b7e9c9b8e6c2a
@@@ -2924,70 -2628,76 +2924,71 @@@ PHP_FUNCTION(openssl_pkcs12_read
  
        bio_in = BIO_new(BIO_s_mem());
  
 -      if(0 >= BIO_write(bio_in, zp12, (int)zp12_len))
 +      if (0 >= BIO_write(bio_in, zp12, (int)zp12_len)) {
 +              php_openssl_store_errors();
                goto cleanup;
 +      }
  
 -      if(d2i_PKCS12_bio(bio_in, &p12)) {
 -              if(PKCS12_parse(p12, pass, &pkey, &cert, &ca)) {
 -                      BIO * bio_out;
 +      if (d2i_PKCS12_bio(bio_in, &p12) && PKCS12_parse(p12, pass, &pkey, &cert, &ca)) {
 +              BIO * bio_out;
  
 -                      zval_dtor(zout);
 -                      array_init(zout);
 +              zval_dtor(zout);
 +              array_init(zout);
  
-               bio_out = BIO_new(BIO_s_mem());
-               if (PEM_write_bio_X509(bio_out, cert)) {
-                       BUF_MEM *bio_buf;
-                       BIO_get_mem_ptr(bio_out, &bio_buf);
-                       ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
-                       add_assoc_zval(zout, "cert", &zcert);
-               } else {
-                       php_openssl_store_errors();
 -                      if (cert) {
 -                              bio_out = BIO_new(BIO_s_mem());
 -                              if (PEM_write_bio_X509(bio_out, cert)) {
 -                                      BUF_MEM *bio_buf;
 -                                      BIO_get_mem_ptr(bio_out, &bio_buf);
 -                                      ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
 -                                      add_assoc_zval(zout, "cert", &zcert);
 -                              }
 -                              BIO_free(bio_out);
++              if (cert) {
++                      bio_out = BIO_new(BIO_s_mem());
++                      if (PEM_write_bio_X509(bio_out, cert)) {
++                              BUF_MEM *bio_buf;
++                              BIO_get_mem_ptr(bio_out, &bio_buf);
++                              ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
++                              add_assoc_zval(zout, "cert", &zcert);
++                      } else {
++                              php_openssl_store_errors();
+                       }
++                      BIO_free(bio_out);
 +              }
-               BIO_free(bio_out);
  
-               bio_out = BIO_new(BIO_s_mem());
-               if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) {
-                       BUF_MEM *bio_buf;
-                       BIO_get_mem_ptr(bio_out, &bio_buf);
-                       ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length);
-                       add_assoc_zval(zout, "pkey", &zpkey);
-               } else {
-                       php_openssl_store_errors();
 -                      if (pkey) {
 -                              bio_out = BIO_new(BIO_s_mem());
 -                              if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) {
 -                                      BUF_MEM *bio_buf;
 -                                      BIO_get_mem_ptr(bio_out, &bio_buf);
 -                                      ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length);
 -                                      add_assoc_zval(zout, "pkey", &zpkey);
 -                              }
 -                              BIO_free(bio_out);
++              if (pkey) {
++                      bio_out = BIO_new(BIO_s_mem());
++                      if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) {
++                              BUF_MEM *bio_buf;
++                              BIO_get_mem_ptr(bio_out, &bio_buf);
++                              ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length);
++                              add_assoc_zval(zout, "pkey", &zpkey);
++                      } else {
++                              php_openssl_store_errors();
+                       }
++                      BIO_free(bio_out);
 +              }
-               BIO_free(bio_out);
  
-               array_init(&zextracerts);
 -                      if (ca && sk_X509_num(ca)) {
 -
 -                              array_init(&zextracerts);
 -
 -                              for (i=0; i < sk_X509_num(ca); i++) {
 -                                      zval zextracert;
 -                                      X509* aCA = sk_X509_pop(ca);
 -                                      if (!aCA) break;
 -
 -                                      /* fix for bug 69882 */
 -                                      {
 -                                              int err = ERR_peek_error();
 -                                              if (err == OPENSSL_ERROR_X509_PRIVATE_KEY_VALUES_MISMATCH) {
 -                                                      ERR_get_error();
 -                                              }
 -                                      }
 -
 -                                      bio_out = BIO_new(BIO_s_mem());
 -                                      if (PEM_write_bio_X509(bio_out, aCA)) {
 -                                              BUF_MEM *bio_buf;
 -                                              BIO_get_mem_ptr(bio_out, &bio_buf);
 -                                              ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length);
 -                                              add_index_zval(&zextracerts, i, &zextracert);
++              if (ca && sk_X509_num(ca)) {
++                      array_init(&zextracerts);
  
-               for (i=0;;i++) {
-                       zval zextracert;
-                       X509* aCA = sk_X509_pop(ca);
-                       if (!aCA) break;
 -                                      }
 -                                      BIO_free(bio_out);
++                      for (i = 0; i < sk_X509_num(ca); i++) {
++                              zval zextracert;
++                              X509* aCA = sk_X509_pop(ca);
++                              if (!aCA) break;
  
-                       bio_out = BIO_new(BIO_s_mem());
-                       if (PEM_write_bio_X509(bio_out, aCA)) {
-                               BUF_MEM *bio_buf;
-                               BIO_get_mem_ptr(bio_out, &bio_buf);
-                               ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length);
-                               add_index_zval(&zextracerts, i, &zextracert);
 -                                      X509_free(aCA);
++                              bio_out = BIO_new(BIO_s_mem());
++                              if (PEM_write_bio_X509(bio_out, aCA)) {
++                                      BUF_MEM *bio_buf;
++                                      BIO_get_mem_ptr(bio_out, &bio_buf);
++                                      ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length);
++                                      add_index_zval(&zextracerts, i, &zextracert);
+                               }
  
 -                              sk_X509_free(ca);
 -                              add_assoc_zval(zout, "extracerts", &zextracerts);
++                              X509_free(aCA);
                        }
-                       BIO_free(bio_out);
  
-                       X509_free(aCA);
-               }
-               if(ca) {
 -                      RETVAL_TRUE;
 -
 -                      PKCS12_free(p12);
 +                      sk_X509_free(ca);
 +                      add_assoc_zval(zout, "extracerts", &zextracerts);
-               } else {
-                       zval_dtor(&zextracerts);
                }
 +
 +              RETVAL_TRUE;
 +
 +              PKCS12_free(p12);
 +      } else {
 +              php_openssl_store_errors();
        }
  
        cleanup: