Skip to content

Commit 70e26f4

Browse files
committed
Fix negative-size-param crash when OBJ_obj2txt() fails
When the function returns -1, the length passed to the string constructor is negative: ``` ==188567==ERROR: AddressSanitizer: negative-size-param: (size=-1) #0 0x7f36ea0305bd in memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc:115 #1 0x559c568a05b3 in zend_string_init /work/php-src/Zend/zend_string.h:191 #2 0x559c568b3cb7 in add_assoc_stringl_ex /work/php-src/Zend/zend_API.c:1986 #3 0x559c559234a2 in add_assoc_stringl /work/php-src/Zend/zend_API.h:579 #4 0x559c55928b3e in php_openssl_pkey_get_details /work/php-src/ext/openssl/openssl_backend_v3.c:671 #5 0x559c559006d4 in zif_openssl_pkey_get_details /work/php-src/ext/openssl/openssl.c:2319 #6 0x559c566b7ed2 in zend_test_execute_internal /work/php-src/ext/zend_test/observer.c:306 #7 0x559c569e024a in ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER /work/php-src/Zend/zend_vm_execute.h:2154 #8 0x559c56b40995 in execute_ex /work/php-src/Zend/zend_vm_execute.h:116519 #9 0x559c56b558b0 in zend_execute /work/php-src/Zend/zend_vm_execute.h:121962 #10 0x559c56cba0ab in zend_execute_script /work/php-src/Zend/zend.c:1980 #11 0x559c566ec8bb in php_execute_script_ex /work/php-src/main/main.c:2645 #12 0x559c566ecccb in php_execute_script /work/php-src/main/main.c:2685 #13 0x559c56cbfc16 in do_cli /work/php-src/sapi/cli/php_cli.c:951 #14 0x559c56cc21e3 in main /work/php-src/sapi/cli/php_cli.c:1362 #15 0x7f36e932d1c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e) #16 0x7f36e932d28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e) #17 0x559c55809b34 in _start (/work/php-src/build-dbg-asan/sapi/cli/php+0x609b34) (BuildId: aa149f943514fff0c491e1f199e30fed0e977f7c) ```
1 parent 65b4073 commit 70e26f4

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

ext/openssl/openssl.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,8 +2317,13 @@ PHP_FUNCTION(openssl_pkey_get_details)
23172317
add_assoc_stringl(return_value, "key", pbio, pbio_len);
23182318

23192319
zend_long ktype = php_openssl_pkey_get_details(return_value, pkey);
2320-
2321-
add_assoc_long(return_value, "type", ktype);
2320+
if (ktype != -2) {
2321+
add_assoc_long(return_value, "type", ktype);
2322+
} else {
2323+
php_openssl_store_errors();
2324+
zval_ptr_dtor(return_value);
2325+
RETVAL_FALSE;
2326+
}
23222327

23232328
BIO_free(out);
23242329
}

ext/openssl/openssl_backend_v1.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,14 @@ zend_long php_openssl_pkey_get_details(zval *return_value, EVP_PKEY *pkey)
531531
obj = OBJ_nid2obj(nid);
532532
if (obj != NULL) {
533533
int oir_len = OBJ_obj2txt(oir_buf, sizeof(oir_buf), obj, 1);
534-
add_assoc_stringl(&ec, "curve_oid", (char*) oir_buf, oir_len);
535-
ASN1_OBJECT_free(obj);
534+
if (oir_len < 0) {
535+
ktype = -2;
536+
ASN1_OBJECT_free(obj);
537+
break;
538+
} else {
539+
add_assoc_stringl(&ec, "curve_oid", (char*) oir_buf, oir_len);
540+
ASN1_OBJECT_free(obj);
541+
}
536542
}
537543
}
538544

ext/openssl/openssl_backend_v3.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,8 +668,14 @@ zend_long php_openssl_pkey_get_details(zval *return_value, EVP_PKEY *pkey)
668668
// OpenSSL recommends a buffer length of 80.
669669
char oir_buf[80];
670670
int oir_len = OBJ_obj2txt(oir_buf, sizeof(oir_buf), obj, 1);
671-
add_assoc_stringl(&ary, "curve_oid", oir_buf, oir_len);
672-
ASN1_OBJECT_free(obj);
671+
if (oir_len < 0) {
672+
ktype = -2;
673+
ASN1_OBJECT_free(obj);
674+
break;
675+
} else {
676+
add_assoc_stringl(&ary, "curve_oid", oir_buf, oir_len);
677+
ASN1_OBJECT_free(obj);
678+
}
673679
}
674680
}
675681
}

0 commit comments

Comments
 (0)