diff --git a/bin/ed/main.c b/bin/ed/main.c index 8d7302341..fff62d6f9 100644 --- a/bin/ed/main.c +++ b/bin/ed/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.69 2024/07/16 05:01:10 deraadt Exp $ */ +/* $OpenBSD: main.c,v 1.70 2024/10/12 07:58:40 jsg Exp $ */ /* $NetBSD: main.c,v 1.3 1995/03/21 09:04:44 cgd Exp $ */ /* main.c: This file contains the main control and user-interface routines @@ -44,7 +44,6 @@ #include #include #include -#include #include #include diff --git a/etc/etc.amd64/login.conf b/etc/etc.amd64/login.conf index 843287b11..2026ac855 100644 --- a/etc/etc.amd64/login.conf +++ b/etc/etc.amd64/login.conf @@ -1,4 +1,4 @@ -# $OpenBSD: login.conf,v 1.24 2023/11/12 14:41:41 robert Exp $ +# $OpenBSD: login.conf,v 1.25 2024/10/12 07:36:52 robert Exp $ # # Sample login.conf file. See login.conf(5) for details. @@ -87,6 +87,13 @@ authpf:\ :tc=default: # +# Building LLVM in base requires higher limits +# +build:\ + :datasize-max=1843M:\ + :datasize-cur=1843M:\ + :tc=default: + # Building ports with DPB uses raised limits # pbuild:\ diff --git a/etc/etc.arm64/login.conf b/etc/etc.arm64/login.conf index d62b4f373..61bae1a3c 100644 --- a/etc/etc.arm64/login.conf +++ b/etc/etc.arm64/login.conf @@ -1,4 +1,4 @@ -# $OpenBSD: login.conf,v 1.16 2023/11/12 14:41:41 robert Exp $ +# $OpenBSD: login.conf,v 1.17 2024/10/12 07:36:52 robert Exp $ # # Sample login.conf file. See login.conf(5) for details. @@ -87,6 +87,14 @@ authpf:\ :shell=/usr/sbin/authpf:\ :tc=default: +# +# Building LLVM in base requires higher limits +# +build:\ + :datasize-max=1843M:\ + :datasize-cur=1843M:\ + :tc=default: + # # Building ports with DPB uses raised limits # diff --git a/etc/etc.armv7/login.conf b/etc/etc.armv7/login.conf index 879b625a9..176831880 100644 --- a/etc/etc.armv7/login.conf +++ b/etc/etc.armv7/login.conf @@ -1,4 +1,4 @@ -# $OpenBSD: login.conf,v 1.16 2024/08/04 20:06:04 phessler Exp $ +# $OpenBSD: login.conf,v 1.17 2024/10/12 07:36:52 robert Exp $ # # Sample login.conf file. See login.conf(5) for details. @@ -87,6 +87,14 @@ authpf:\ :shell=/usr/sbin/authpf:\ :tc=default: +# +# Building LLVM in base requires higher limits +# +build:\ + :datasize-max=1843M:\ + :datasize-cur=1843M:\ + :tc=default: + # # Building ports with DPB uses raised limits # diff --git a/etc/etc.i386/login.conf b/etc/etc.i386/login.conf index 8ae3d3bfe..b7d1528bb 100644 --- a/etc/etc.i386/login.conf +++ b/etc/etc.i386/login.conf @@ -1,4 +1,4 @@ -# $OpenBSD: login.conf,v 1.20 2023/12/31 16:05:50 bluhm Exp $ +# $OpenBSD: login.conf,v 1.21 2024/10/12 07:36:52 robert Exp $ # # Sample login.conf file. See login.conf(5) for details. @@ -86,6 +86,14 @@ authpf:\ :shell=/usr/sbin/authpf:\ :tc=default: +# +# Building LLVM in base requires higher limits +# +build:\ + :datasize-max=1843M:\ + :datasize-cur=1843M:\ + :tc=default: + # # Building ports with DPB uses raised limits # diff --git a/lib/libc/sys/sysctl.2 b/lib/libc/sys/sysctl.2 index 78c69ff58..61eb4826e 100644 --- a/lib/libc/sys/sysctl.2 +++ b/lib/libc/sys/sysctl.2 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sysctl.2,v 1.57 2023/10/14 19:02:16 kettenis Exp $ +.\" $OpenBSD: sysctl.2,v 1.58 2024/10/10 22:21:05 lucas Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -27,7 +27,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: October 14 2023 $ +.Dd $Mdocdate: October 10 2024 $ .Dt SYSCTL 2 .Os .Sh NAME @@ -1322,7 +1322,7 @@ priority value. .Pp An optional seventh level name can be provided to select the routing table on which to run the operation. -If not provided, the table with ID 0 is used. +If not provided, the current routing table is used. .It Dv PF_INET Get or set various global information about IPv4 .Pq Internet Protocol version 4 . diff --git a/lib/libcrypto/ec/ec_asn1.c b/lib/libcrypto/ec/ec_asn1.c index 825f4f389..865934ccf 100644 --- a/lib/libcrypto/ec/ec_asn1.c +++ b/lib/libcrypto/ec/ec_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_asn1.c,v 1.57 2024/10/03 05:07:49 tb Exp $ */ +/* $OpenBSD: ec_asn1.c,v 1.68 2024/10/11 18:58:04 tb Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -124,6 +124,10 @@ typedef struct ec_parameters_st { ASN1_INTEGER *cofactor; } ECPARAMETERS; +#define ECPK_PARAM_NAMED_CURVE 0 +#define ECPK_PARAM_EXPLICIT 1 +#define ECPK_PARAM_IMPLICITLY_CA 2 + typedef struct ecpk_parameters_st { int type; union { @@ -555,56 +559,52 @@ EC_PRIVATEKEY_free(EC_PRIVATEKEY *a) static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) { - int ok = 0, nid; - BIGNUM *tmp = NULL; + BIGNUM *p = NULL; + int nid; + int ret = 0; if (group == NULL || field == NULL) - return 0; - - /* clear the old values (if necessary) */ - if (field->fieldType != NULL) - ASN1_OBJECT_free(field->fieldType); - if (field->p.other != NULL) - ASN1_TYPE_free(field->p.other); + goto err; nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); - /* set OID for the field */ + if (nid == NID_X9_62_characteristic_two_field) { + ECerror(EC_R_GF2M_NOT_SUPPORTED); + goto err; + } + if (nid != NID_X9_62_prime_field) { + ECerror(EC_R_INVALID_FIELD); + goto err; + } + if ((field->fieldType = OBJ_nid2obj(nid)) == NULL) { ECerror(ERR_R_OBJ_LIB); goto err; } - if (nid == NID_X9_62_prime_field) { - if ((tmp = BN_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - /* the parameters are specified by the prime number p */ - if (!EC_GROUP_get_curve(group, tmp, NULL, NULL, NULL)) { - ECerror(ERR_R_EC_LIB); - goto err; - } - /* set the prime number */ - field->p.prime = BN_to_ASN1_INTEGER(tmp, NULL); - if (field->p.prime == NULL) { - ECerror(ERR_R_ASN1_LIB); - goto err; - } - } else { - ECerror(EC_R_GF2M_NOT_SUPPORTED); + if ((p = BN_new()) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; + } + if (!EC_GROUP_get_curve(group, p, NULL, NULL, NULL)) { + ECerror(ERR_R_EC_LIB); + goto err; + } + if ((field->p.prime = BN_to_ASN1_INTEGER(p, NULL)) == NULL) { + ECerror(ERR_R_ASN1_LIB); goto err; } - ok = 1; + ret = 1; err: - BN_free(tmp); - return (ok); + BN_free(p); + + return ret; } static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) { - BIGNUM *tmp_1 = NULL, *tmp_2 = NULL; + BIGNUM *a = NULL, *b = NULL; unsigned char *buffer_1 = NULL, *buffer_2 = NULL, *a_buf = NULL, *b_buf = NULL; size_t len_1, len_2; @@ -614,18 +614,18 @@ ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) if (!group || !curve || !curve->a || !curve->b) return 0; - if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL) { + if ((a = BN_new()) == NULL || (b = BN_new()) == NULL) { ECerror(ERR_R_MALLOC_FAILURE); goto err; } /* get a and b */ - if (!EC_GROUP_get_curve(group, NULL, tmp_1, tmp_2, NULL)) { + if (!EC_GROUP_get_curve(group, NULL, a, b, NULL)) { ECerror(ERR_R_EC_LIB); goto err; } - len_1 = (size_t) BN_num_bytes(tmp_1); - len_2 = (size_t) BN_num_bytes(tmp_2); + len_1 = (size_t) BN_num_bytes(a); + len_2 = (size_t) BN_num_bytes(b); if (len_1 == 0) { /* len_1 == 0 => a == 0 */ @@ -636,7 +636,7 @@ ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) ECerror(ERR_R_MALLOC_FAILURE); goto err; } - if ((len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) { + if ((len_1 = BN_bn2bin(a, buffer_1)) == 0) { ECerror(ERR_R_BN_LIB); goto err; } @@ -652,7 +652,7 @@ ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) ECerror(ERR_R_MALLOC_FAILURE); goto err; } - if ((len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) { + if ((len_2 = BN_bn2bin(b, buffer_2)) == 0) { ECerror(ERR_R_BN_LIB); goto err; } @@ -691,13 +691,14 @@ ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) err: free(buffer_1); free(buffer_2); - BN_free(tmp_1); - BN_free(tmp_2); + BN_free(a); + BN_free(b); + return (ok); } static ECPARAMETERS * -ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param) +ec_asn1_group2parameters(const EC_GROUP *group) { int ok = 0; size_t len = 0; @@ -711,13 +712,10 @@ ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param) ECerror(ERR_R_MALLOC_FAILURE); goto err; } - if (param == NULL) { - if ((ret = ECPARAMETERS_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - } else - ret = param; + if ((ret = ECPARAMETERS_new()) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; + } /* set the version (always one) */ ret->version = (long) 0x1; @@ -781,8 +779,7 @@ ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param) err: if (!ok) { - if (ret && !param) - ECPARAMETERS_free(ret); + ECPARAMETERS_free(ret); ret = NULL; } BN_free(tmp); @@ -791,49 +788,39 @@ ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param) } ECPKPARAMETERS * -ec_asn1_group2pkparameters(const EC_GROUP *group, ECPKPARAMETERS *params) +ec_asn1_group2pkparameters(const EC_GROUP *group) { - int ok = 1, tmp; - ECPKPARAMETERS *ret = params; + ECPKPARAMETERS *pkparameters; + ECPARAMETERS *parameters; + ASN1_OBJECT *aobj; + int nid; - if (ret == NULL) { - if ((ret = ECPKPARAMETERS_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return NULL; - } + if ((pkparameters = ECPKPARAMETERS_new()) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; + } + + if ((EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE) != 0) { + if ((nid = EC_GROUP_get_curve_name(group)) == NID_undef) + goto err; + if ((aobj = OBJ_nid2obj(nid)) == NULL) + goto err; + pkparameters->type = ECPK_PARAM_NAMED_CURVE; + pkparameters->value.named_curve = aobj; } else { - if (ret->type == 0 && ret->value.named_curve) - ASN1_OBJECT_free(ret->value.named_curve); - else if (ret->type == 1 && ret->value.parameters) - ECPARAMETERS_free(ret->value.parameters); + if ((parameters = ec_asn1_group2parameters(group)) == NULL) + goto err; + pkparameters->type = ECPK_PARAM_EXPLICIT; + pkparameters->value.parameters = parameters; + parameters = NULL; } - if (EC_GROUP_get_asn1_flag(group)) { - /* - * use the asn1 OID to describe the elliptic curve - * parameters - */ - tmp = EC_GROUP_get_curve_name(group); - if (tmp) { - ret->type = 0; - if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL) - ok = 0; - } else - /* we don't know the group => ERROR */ - ok = 0; - } else { - /* use the ECPARAMETERS structure */ - ret->type = 1; - if ((ret->value.parameters = ec_asn1_group2parameters(group, - NULL)) == NULL) - ok = 0; - } + return pkparameters; - if (!ok) { - ECPKPARAMETERS_free(ret); - return NULL; - } - return ret; + err: + ECPKPARAMETERS_free(pkparameters); + + return NULL; } static EC_GROUP * @@ -975,36 +962,34 @@ ec_asn1_parameters2group(const ECPARAMETERS *params) EC_GROUP * ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) { - EC_GROUP *ret = NULL; - int tmp = 0; + EC_GROUP *group; + int nid; - if (params == NULL) { - ECerror(EC_R_MISSING_PARAMETERS); - return NULL; - } - if (params->type == 0) {/* the curve is given by an OID */ - tmp = OBJ_obj2nid(params->value.named_curve); - if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) { + if (params->type == ECPK_PARAM_NAMED_CURVE) { + if ((nid = OBJ_obj2nid(params->value.named_curve)) == NID_undef) { + ECerror(EC_R_UNKNOWN_GROUP); + return NULL; + } + if ((group = EC_GROUP_new_by_curve_name(nid)) == NULL) { ECerror(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE); return NULL; } - EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE); - } else if (params->type == 1) { /* the parameters are given by a - * ECPARAMETERS structure */ - ret = ec_asn1_parameters2group(params->value.parameters); - if (!ret) { + EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); + } else if (params->type == ECPK_PARAM_EXPLICIT) { + group = ec_asn1_parameters2group(params->value.parameters); + if (group == NULL) { ECerror(ERR_R_EC_LIB); return NULL; } - EC_GROUP_set_asn1_flag(ret, 0x0); - } else if (params->type == 2) { /* implicitlyCA */ + EC_GROUP_set_asn1_flag(group, 0); + } else if (params->type == ECPK_PARAM_IMPLICITLY_CA) { return NULL; } else { ECerror(EC_R_ASN1_ERROR); return NULL; } - return ret; + return group; } EC_GROUP * @@ -1034,21 +1019,24 @@ d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) LCRYPTO_ALIAS(d2i_ECPKParameters); int -i2d_ECPKParameters(const EC_GROUP *a, unsigned char **out) +i2d_ECPKParameters(const EC_GROUP *group, unsigned char **out_der) { + ECPKPARAMETERS *parameters; int ret = 0; - ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL); - if (tmp == NULL) { + + if ((parameters = ec_asn1_group2pkparameters(group)) == NULL) { ECerror(EC_R_GROUP2PKPARAMETERS_FAILURE); - return 0; + goto err; } - if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0) { + if ((ret = i2d_ECPKPARAMETERS(parameters, out_der)) <= 0) { ECerror(EC_R_I2D_ECPKPARAMETERS_FAILURE); - ECPKPARAMETERS_free(tmp); - return 0; + goto err; } - ECPKPARAMETERS_free(tmp); - return (ret); + + err: + ECPKPARAMETERS_free(parameters); + + return ret; } LCRYPTO_ALIAS(i2d_ECPKParameters); @@ -1179,11 +1167,13 @@ i2d_ECPrivateKey(EC_KEY *a, unsigned char **out) goto err; } if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) { - if ((priv_key->parameters = ec_asn1_group2pkparameters( - a->group, priv_key->parameters)) == NULL) { + ECPKPARAMETERS *parameters; + + if ((parameters = ec_asn1_group2pkparameters(a->group)) == NULL) { ECerror(ERR_R_EC_LIB); goto err; } + priv_key->parameters = parameters; } if (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key != NULL) { priv_key->publicKey = ASN1_BIT_STRING_new(); diff --git a/lib/libcrypto/err/err.c b/lib/libcrypto/err/err.c index f0001cd88..ae20463cf 100644 --- a/lib/libcrypto/err/err.c +++ b/lib/libcrypto/err/err.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err.c,v 1.65 2024/10/02 15:21:39 jsing Exp $ */ +/* $OpenBSD: err.c,v 1.73 2024/10/11 13:32:22 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -127,8 +127,6 @@ DECLARE_LHASH_OF(ERR_STRING_DATA); DECLARE_LHASH_OF(ERR_STATE); -typedef struct st_ERR_FNS ERR_FNS; - typedef struct err_state_st { CRYPTO_THREADID tid; int err_flags[ERR_NUM_ERRORS]; @@ -141,54 +139,54 @@ typedef struct err_state_st { } ERR_STATE; #ifndef OPENSSL_NO_ERR -static ERR_STRING_DATA ERR_str_libraries[] = { - {ERR_PACK(ERR_LIB_NONE,0,0), "unknown library"}, - {ERR_PACK(ERR_LIB_SYS,0,0), "system library"}, - {ERR_PACK(ERR_LIB_BN,0,0), "bignum routines"}, - {ERR_PACK(ERR_LIB_RSA,0,0), "rsa routines"}, - {ERR_PACK(ERR_LIB_DH,0,0), "Diffie-Hellman routines"}, - {ERR_PACK(ERR_LIB_EVP,0,0), "digital envelope routines"}, - {ERR_PACK(ERR_LIB_BUF,0,0), "memory buffer routines"}, - {ERR_PACK(ERR_LIB_OBJ,0,0), "object identifier routines"}, - {ERR_PACK(ERR_LIB_PEM,0,0), "PEM routines"}, - {ERR_PACK(ERR_LIB_DSA,0,0), "dsa routines"}, - {ERR_PACK(ERR_LIB_X509,0,0), "x509 certificate routines"}, - {ERR_PACK(ERR_LIB_ASN1,0,0), "asn1 encoding routines"}, - {ERR_PACK(ERR_LIB_CONF,0,0), "configuration file routines"}, - {ERR_PACK(ERR_LIB_CRYPTO,0,0), "common libcrypto routines"}, - {ERR_PACK(ERR_LIB_EC,0,0), "elliptic curve routines"}, - {ERR_PACK(ERR_LIB_SSL,0,0), "SSL routines"}, - {ERR_PACK(ERR_LIB_BIO,0,0), "BIO routines"}, - {ERR_PACK(ERR_LIB_PKCS7,0,0), "PKCS7 routines"}, - {ERR_PACK(ERR_LIB_X509V3,0,0), "X509 V3 routines"}, - {ERR_PACK(ERR_LIB_PKCS12,0,0), "PKCS12 routines"}, - {ERR_PACK(ERR_LIB_RAND,0,0), "random number generator"}, - {ERR_PACK(ERR_LIB_DSO,0,0), "DSO support routines"}, - {ERR_PACK(ERR_LIB_TS,0,0), "time stamp routines"}, - {ERR_PACK(ERR_LIB_ENGINE,0,0), "engine routines"}, - {ERR_PACK(ERR_LIB_OCSP,0,0), "OCSP routines"}, - {ERR_PACK(ERR_LIB_FIPS,0,0), "FIPS routines"}, - {ERR_PACK(ERR_LIB_CMS,0,0), "CMS routines"}, - {ERR_PACK(ERR_LIB_HMAC,0,0), "HMAC routines"}, - {ERR_PACK(ERR_LIB_GOST,0,0), "GOST routines"}, +static const ERR_STRING_DATA ERR_str_libraries[] = { + {ERR_PACK(ERR_LIB_NONE, 0, 0), "unknown library"}, + {ERR_PACK(ERR_LIB_SYS, 0, 0), "system library"}, + {ERR_PACK(ERR_LIB_BN, 0, 0), "bignum routines"}, + {ERR_PACK(ERR_LIB_RSA, 0, 0), "rsa routines"}, + {ERR_PACK(ERR_LIB_DH, 0, 0), "Diffie-Hellman routines"}, + {ERR_PACK(ERR_LIB_EVP, 0, 0), "digital envelope routines"}, + {ERR_PACK(ERR_LIB_BUF, 0, 0), "memory buffer routines"}, + {ERR_PACK(ERR_LIB_OBJ, 0, 0), "object identifier routines"}, + {ERR_PACK(ERR_LIB_PEM, 0, 0), "PEM routines"}, + {ERR_PACK(ERR_LIB_DSA, 0, 0), "dsa routines"}, + {ERR_PACK(ERR_LIB_X509, 0, 0), "x509 certificate routines"}, + {ERR_PACK(ERR_LIB_ASN1, 0, 0), "asn1 encoding routines"}, + {ERR_PACK(ERR_LIB_CONF, 0, 0), "configuration file routines"}, + {ERR_PACK(ERR_LIB_CRYPTO, 0, 0), "common libcrypto routines"}, + {ERR_PACK(ERR_LIB_EC, 0, 0), "elliptic curve routines"}, + {ERR_PACK(ERR_LIB_SSL, 0, 0), "SSL routines"}, + {ERR_PACK(ERR_LIB_BIO, 0, 0), "BIO routines"}, + {ERR_PACK(ERR_LIB_PKCS7, 0, 0), "PKCS7 routines"}, + {ERR_PACK(ERR_LIB_X509V3, 0, 0), "X509 V3 routines"}, + {ERR_PACK(ERR_LIB_PKCS12, 0, 0), "PKCS12 routines"}, + {ERR_PACK(ERR_LIB_RAND, 0, 0), "random number generator"}, + {ERR_PACK(ERR_LIB_DSO, 0, 0), "DSO support routines"}, + {ERR_PACK(ERR_LIB_TS, 0, 0), "time stamp routines"}, + {ERR_PACK(ERR_LIB_ENGINE, 0, 0), "engine routines"}, + {ERR_PACK(ERR_LIB_OCSP, 0, 0), "OCSP routines"}, + {ERR_PACK(ERR_LIB_FIPS, 0, 0), "FIPS routines"}, + {ERR_PACK(ERR_LIB_CMS, 0, 0), "CMS routines"}, + {ERR_PACK(ERR_LIB_HMAC, 0, 0), "HMAC routines"}, + {ERR_PACK(ERR_LIB_GOST, 0, 0), "GOST routines"}, {0, NULL}, }; -static ERR_STRING_DATA ERR_str_functs[] = { - {ERR_PACK(0,SYS_F_FOPEN, 0), "fopen"}, - {ERR_PACK(0,SYS_F_CONNECT, 0), "connect"}, - {ERR_PACK(0,SYS_F_GETSERVBYNAME, 0), "getservbyname"}, - {ERR_PACK(0,SYS_F_SOCKET, 0), "socket"}, - {ERR_PACK(0,SYS_F_IOCTLSOCKET, 0), "ioctl"}, - {ERR_PACK(0,SYS_F_BIND, 0), "bind"}, - {ERR_PACK(0,SYS_F_LISTEN, 0), "listen"}, - {ERR_PACK(0,SYS_F_ACCEPT, 0), "accept"}, - {ERR_PACK(0,SYS_F_OPENDIR, 0), "opendir"}, - {ERR_PACK(0,SYS_F_FREAD, 0), "fread"}, +static const ERR_STRING_DATA ERR_str_functs[] = { + {ERR_PACK(ERR_LIB_SYS, SYS_F_FOPEN, 0), "fopen"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_CONNECT, 0), "connect"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_GETSERVBYNAME, 0), "getservbyname"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_SOCKET, 0), "socket"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_IOCTLSOCKET, 0), "ioctl"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_BIND, 0), "bind"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_LISTEN, 0), "listen"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_ACCEPT, 0), "accept"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_OPENDIR, 0), "opendir"}, + {ERR_PACK(ERR_LIB_SYS, SYS_F_FREAD, 0), "fread"}, {0, NULL}, }; -static ERR_STRING_DATA ERR_str_reasons[] = { +static const ERR_STRING_DATA ERR_str_reasons[] = { {ERR_R_SYS_LIB, "system lib"}, {ERR_R_BN_LIB, "BN lib"}, {ERR_R_RSA_LIB, "RSA lib"}, @@ -226,7 +224,7 @@ static ERR_STRING_DATA ERR_str_reasons[] = { {ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED, "called a function you should not call"}, {ERR_R_PASSED_NULL_PARAMETER, "passed a null parameter"}, {ERR_R_INTERNAL_ERROR, "internal error"}, - {ERR_R_DISABLED , "called a function that was disabled at compile-time"}, + {ERR_R_DISABLED, "called a function that was disabled at compile-time"}, {ERR_R_INIT_FAIL, "initialization failure"}, {0, NULL}, @@ -254,8 +252,6 @@ static pthread_t err_init_thread; * internal to the "err_defaults" implementation. */ -/* The internal functions used in the "err_defaults" implementation */ - static unsigned long err_string_data_hash(const ERR_STRING_DATA *a) { @@ -475,36 +471,23 @@ err_get_next_lib(void) #define LEN_SYS_STR_REASON 32 static ERR_STRING_DATA SYS_str_reasons[NUM_SYS_STR_REASONS + 1]; -/* SYS_str_reasons is filled with copies of strerror() results at - * initialization. - * 'errno' values up to 127 should cover all usual errors, - * others will be displayed numerically by ERR_error_string. - * It is crucial that we have something for each reason code - * that occurs in ERR_str_reasons, or bogus reason strings - * will be returned for SYSerror(which always gets an errno - * value and never one of those 'standard' reason codes. */ + +/* + * SYS_str_reasons is filled with copies of strerror() results at + * initialization. 'errno' values up to 127 should cover all usual errors, + * others will be displayed numerically by ERR_error_string. It is crucial that + * we have something for each reason code that occurs in ERR_str_reasons, or + * bogus reason strings will be returned for SYSerror(), which always gets an + * errno value and never one of those 'standard' reason codes. + */ static void -build_SYS_str_reasons(void) +err_build_SYS_str_reasons(void) { /* malloc cannot be used here, use static storage instead */ static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON]; - int i; - static int init = 1; int save_errno; - - CRYPTO_r_lock(CRYPTO_LOCK_ERR); - if (!init) { - CRYPTO_r_unlock(CRYPTO_LOCK_ERR); - return; - } - - CRYPTO_r_unlock(CRYPTO_LOCK_ERR); - CRYPTO_w_lock(CRYPTO_LOCK_ERR); - if (!init) { - CRYPTO_w_unlock(CRYPTO_LOCK_ERR); - return; - } + int i; /* strerror(3) will set errno to EINVAL when i is an unknown errno. */ save_errno = errno; @@ -526,33 +509,33 @@ build_SYS_str_reasons(void) } errno = save_errno; - /* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL}, - * as required by ERR_load_strings. */ - - init = 0; - - CRYPTO_w_unlock(CRYPTO_LOCK_ERR); + /* + * Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL}, + * as required by ERR_load_strings. + */ } #endif -#define err_clear_data(p,i) \ - do { \ - if (((p)->err_data[i] != NULL) && \ - (p)->err_data_flags[i] & ERR_TXT_MALLOCED) { \ - free((p)->err_data[i]); \ - (p)->err_data[i] = NULL; \ - } \ - (p)->err_data_flags[i] = 0; \ - } while(0) +static void +err_clear_data(ERR_STATE *s, int i) +{ + if ((s->err_data_flags[i] & ERR_TXT_MALLOCED) != 0) + free(s->err_data[i]); -#define err_clear(p,i) \ - do { \ - (p)->err_flags[i] = 0; \ - (p)->err_buffer[i] = 0; \ - err_clear_data(p, i); \ - (p)->err_file[i] = NULL; \ - (p)->err_line[i] = -1; \ - } while(0) + s->err_data[i] = NULL; + s->err_data_flags[i] = 0; +} + +static void +err_clear(ERR_STATE *s, int i) +{ + s->err_flags[i] = 0; + s->err_buffer[i] = 0; + s->err_file[i] = NULL; + s->err_line[i] = -1; + + err_clear_data(s, i); +} static void ERR_STATE_free(ERR_STATE *s) @@ -562,9 +545,9 @@ ERR_STATE_free(ERR_STATE *s) if (s == NULL) return; - for (i = 0; i < ERR_NUM_ERRORS; i++) { + for (i = 0; i < ERR_NUM_ERRORS; i++) err_clear_data(s, i); - } + free(s); } @@ -598,8 +581,10 @@ ERR_get_state(void) ERR_STATE_free(ret); /* could not insert it */ return (&fallback); } - /* If a race occurred in this function and we came second, tmpp - * is the first one that we just replaced. */ + /* + * If a race occurred in this function and we came second, + * tmpp is the first one that we just replaced. + */ if (tmpp) ERR_STATE_free(tmpp); } @@ -609,7 +594,7 @@ ERR_get_state(void) static void err_load_strings(int lib, ERR_STRING_DATA *str) { - while (str->error) { + while (str->error != 0) { if (lib) str->error |= ERR_PACK(lib, 0, 0); err_set_item(str); @@ -617,6 +602,15 @@ err_load_strings(int lib, ERR_STRING_DATA *str) } } +static void +err_load_const_strings(const ERR_STRING_DATA *str) +{ + while (str->error != 0) { + err_set_item(str); + str++; + } +} + static unsigned long get_error_values(int inc, int top, const char **file, int *line, const char **data, int *flags) @@ -688,10 +682,10 @@ ERR_load_ERR_strings_internal(void) { err_init_thread = pthread_self(); #ifndef OPENSSL_NO_ERR - err_load_strings(0, ERR_str_libraries); - err_load_strings(0, ERR_str_reasons); - err_load_strings(ERR_LIB_SYS, ERR_str_functs); - build_SYS_str_reasons(); + err_load_const_strings(ERR_str_libraries); + err_load_const_strings(ERR_str_reasons); + err_load_const_strings(ERR_str_functs); + err_build_SYS_str_reasons(); err_load_strings(ERR_LIB_SYS, SYS_str_reasons); #endif } @@ -723,10 +717,7 @@ void ERR_load_const_strings(const ERR_STRING_DATA *str) { ERR_load_ERR_strings(); - while (str->error) { - err_set_item(str); - str++; - } + err_load_const_strings(str); } void @@ -770,8 +761,11 @@ ERR_remove_thread_state(const CRYPTO_THREADID *id) CRYPTO_THREADID_cpy(&tmp.tid, id); else CRYPTO_THREADID_current(&tmp.tid); - /* err_thread_del_item automatically destroys the LHASH if the number of - * items reaches zero. */ + + /* + * err_thread_del_item automatically destroys the LHASH if the number of + * items reaches zero. + */ err_thread_del_item(&tmp); } LCRYPTO_ALIAS(ERR_remove_thread_state); @@ -827,9 +821,9 @@ ERR_clear_error(void) es = ERR_get_state(); - for (i = 0; i < ERR_NUM_ERRORS; i++) { + for (i = 0; i < ERR_NUM_ERRORS; i++) err_clear(es, i); - } + es->top = es->bottom = 0; } LCRYPTO_ALIAS(ERR_clear_error); @@ -1059,8 +1053,10 @@ ERR_error_string_n(unsigned long e, char *buf, size_t len) if (ret == -1) return; /* can't happen, and can't do better if it does */ if (ret >= len) { - /* output may be truncated; make sure we always have 5 - * colon-separated fields, i.e. 4 colons ... */ + /* + * output may be truncated; make sure we always have 5 + * colon-separated fields, i.e. 4 colons ... + */ #define NUM_COLONS 4 if (len > NUM_COLONS) /* ... if possible */ { @@ -1083,9 +1079,12 @@ ERR_error_string_n(unsigned long e, char *buf, size_t len) } LCRYPTO_ALIAS(ERR_error_string_n); -/* BAD for multi-threading: uses a local buffer if ret == NULL */ -/* ERR_error_string_n should be used instead for ret != NULL - * as ERR_error_string cannot know how large the buffer is */ +/* + * ERR_error_string_n should be used instead for ret != NULL + * as ERR_error_string cannot know how large the buffer is. + * + * BAD for multi-threading: uses a local buffer if ret == NULL. + */ char * ERR_error_string(unsigned long e, char *ret) { diff --git a/lib/libssl/ssl_stat.c b/lib/libssl/ssl_stat.c index 9f92abf21..b19944ca8 100644 --- a/lib/libssl/ssl_stat.c +++ b/lib/libssl/ssl_stat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_stat.c,v 1.22 2024/10/09 08:01:39 tb Exp $ */ +/* $OpenBSD: ssl_stat.c,v 1.23 2024/10/12 03:54:18 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -89,465 +89,323 @@ const char * SSL_state_string_long(const SSL *s) { - const char *str; - switch (s->s3->hs.state) { case SSL_ST_BEFORE: - str = "before SSL initialization"; - break; + return "before SSL initialization"; case SSL_ST_ACCEPT: - str = "before accept initialization"; - break; + return "before accept initialization"; case SSL_ST_CONNECT: - str = "before connect initialization"; - break; + return "before connect initialization"; case SSL_ST_OK: - str = "SSL negotiation finished successfully"; - break; + return "SSL negotiation finished successfully"; case SSL_ST_RENEGOTIATE: - str = "SSL renegotiate ciphers"; - break; + return "SSL renegotiate ciphers"; case SSL_ST_BEFORE|SSL_ST_CONNECT: - str = "before/connect initialization"; - break; + return "before/connect initialization"; case SSL_ST_OK|SSL_ST_CONNECT: - str = "ok/connect SSL initialization"; - break; + return "ok/connect SSL initialization"; case SSL_ST_BEFORE|SSL_ST_ACCEPT: - str = "before/accept initialization"; - break; + return "before/accept initialization"; case SSL_ST_OK|SSL_ST_ACCEPT: - str = "ok/accept SSL initialization"; - break; + return "ok/accept SSL initialization"; /* SSLv3 additions */ case SSL3_ST_CW_CLNT_HELLO_A: - str = "SSLv3 write client hello A"; - break; + return "SSLv3 write client hello A"; case SSL3_ST_CW_CLNT_HELLO_B: - str = "SSLv3 write client hello B"; - break; + return "SSLv3 write client hello B"; case SSL3_ST_CR_SRVR_HELLO_A: - str = "SSLv3 read server hello A"; - break; + return "SSLv3 read server hello A"; case SSL3_ST_CR_SRVR_HELLO_B: - str = "SSLv3 read server hello B"; - break; + return "SSLv3 read server hello B"; case SSL3_ST_CR_CERT_A: - str = "SSLv3 read server certificate A"; - break; + return "SSLv3 read server certificate A"; case SSL3_ST_CR_CERT_B: - str = "SSLv3 read server certificate B"; - break; + return "SSLv3 read server certificate B"; case SSL3_ST_CR_KEY_EXCH_A: - str = "SSLv3 read server key exchange A"; - break; + return "SSLv3 read server key exchange A"; case SSL3_ST_CR_KEY_EXCH_B: - str = "SSLv3 read server key exchange B"; - break; + return "SSLv3 read server key exchange B"; case SSL3_ST_CR_CERT_REQ_A: - str = "SSLv3 read server certificate request A"; - break; + return "SSLv3 read server certificate request A"; case SSL3_ST_CR_CERT_REQ_B: - str = "SSLv3 read server certificate request B"; - break; + return "SSLv3 read server certificate request B"; case SSL3_ST_CR_SESSION_TICKET_A: - str = "SSLv3 read server session ticket A"; - break; + return "SSLv3 read server session ticket A"; case SSL3_ST_CR_SESSION_TICKET_B: - str = "SSLv3 read server session ticket B"; - break; + return "SSLv3 read server session ticket B"; case SSL3_ST_CR_SRVR_DONE_A: - str = "SSLv3 read server done A"; - break; + return "SSLv3 read server done A"; case SSL3_ST_CR_SRVR_DONE_B: - str = "SSLv3 read server done B"; - break; + return "SSLv3 read server done B"; case SSL3_ST_CW_CERT_A: - str = "SSLv3 write client certificate A"; - break; + return "SSLv3 write client certificate A"; case SSL3_ST_CW_CERT_B: - str = "SSLv3 write client certificate B"; - break; + return "SSLv3 write client certificate B"; case SSL3_ST_CW_CERT_C: - str = "SSLv3 write client certificate C"; - break; + return "SSLv3 write client certificate C"; case SSL3_ST_CW_CERT_D: - str = "SSLv3 write client certificate D"; - break; + return "SSLv3 write client certificate D"; case SSL3_ST_CW_KEY_EXCH_A: - str = "SSLv3 write client key exchange A"; - break; + return "SSLv3 write client key exchange A"; case SSL3_ST_CW_KEY_EXCH_B: - str = "SSLv3 write client key exchange B"; - break; + return "SSLv3 write client key exchange B"; case SSL3_ST_CW_CERT_VRFY_A: - str = "SSLv3 write certificate verify A"; - break; + return "SSLv3 write certificate verify A"; case SSL3_ST_CW_CERT_VRFY_B: - str = "SSLv3 write certificate verify B"; - break; + return "SSLv3 write certificate verify B"; case SSL3_ST_CW_CHANGE_A: case SSL3_ST_SW_CHANGE_A: - str = "SSLv3 write change cipher spec A"; - break; + return "SSLv3 write change cipher spec A"; case SSL3_ST_CW_CHANGE_B: case SSL3_ST_SW_CHANGE_B: - str = "SSLv3 write change cipher spec B"; - break; + return "SSLv3 write change cipher spec B"; case SSL3_ST_CW_FINISHED_A: case SSL3_ST_SW_FINISHED_A: - str = "SSLv3 write finished A"; - break; + return "SSLv3 write finished A"; case SSL3_ST_CW_FINISHED_B: case SSL3_ST_SW_FINISHED_B: - str = "SSLv3 write finished B"; - break; + return "SSLv3 write finished B"; case SSL3_ST_CR_CHANGE_A: case SSL3_ST_SR_CHANGE_A: - str = "SSLv3 read change cipher spec A"; - break; + return "SSLv3 read change cipher spec A"; case SSL3_ST_CR_CHANGE_B: case SSL3_ST_SR_CHANGE_B: - str = "SSLv3 read change cipher spec B"; - break; + return "SSLv3 read change cipher spec B"; case SSL3_ST_CR_FINISHED_A: case SSL3_ST_SR_FINISHED_A: - str = "SSLv3 read finished A"; - break; + return "SSLv3 read finished A"; case SSL3_ST_CR_FINISHED_B: case SSL3_ST_SR_FINISHED_B: - str = "SSLv3 read finished B"; - break; + return "SSLv3 read finished B"; case SSL3_ST_CW_FLUSH: case SSL3_ST_SW_FLUSH: - str = "SSLv3 flush data"; - break; + return "SSLv3 flush data"; case SSL3_ST_SR_CLNT_HELLO_A: - str = "SSLv3 read client hello A"; - break; + return "SSLv3 read client hello A"; case SSL3_ST_SR_CLNT_HELLO_B: - str = "SSLv3 read client hello B"; - break; + return "SSLv3 read client hello B"; case SSL3_ST_SR_CLNT_HELLO_C: - str = "SSLv3 read client hello C"; - break; + return "SSLv3 read client hello C"; case SSL3_ST_SW_HELLO_REQ_A: - str = "SSLv3 write hello request A"; - break; + return "SSLv3 write hello request A"; case SSL3_ST_SW_HELLO_REQ_B: - str = "SSLv3 write hello request B"; - break; + return "SSLv3 write hello request B"; case SSL3_ST_SW_HELLO_REQ_C: - str = "SSLv3 write hello request C"; - break; + return "SSLv3 write hello request C"; case SSL3_ST_SW_SRVR_HELLO_A: - str = "SSLv3 write server hello A"; - break; + return "SSLv3 write server hello A"; case SSL3_ST_SW_SRVR_HELLO_B: - str = "SSLv3 write server hello B"; - break; + return "SSLv3 write server hello B"; case SSL3_ST_SW_CERT_A: - str = "SSLv3 write certificate A"; - break; + return "SSLv3 write certificate A"; case SSL3_ST_SW_CERT_B: - str = "SSLv3 write certificate B"; - break; + return "SSLv3 write certificate B"; case SSL3_ST_SW_KEY_EXCH_A: - str = "SSLv3 write key exchange A"; - break; + return "SSLv3 write key exchange A"; case SSL3_ST_SW_KEY_EXCH_B: - str = "SSLv3 write key exchange B"; - break; + return "SSLv3 write key exchange B"; case SSL3_ST_SW_CERT_REQ_A: - str = "SSLv3 write certificate request A"; - break; + return "SSLv3 write certificate request A"; case SSL3_ST_SW_CERT_REQ_B: - str = "SSLv3 write certificate request B"; - break; + return "SSLv3 write certificate request B"; case SSL3_ST_SW_SESSION_TICKET_A: - str = "SSLv3 write session ticket A"; - break; + return "SSLv3 write session ticket A"; case SSL3_ST_SW_SESSION_TICKET_B: - str = "SSLv3 write session ticket B"; - break; + return "SSLv3 write session ticket B"; case SSL3_ST_SW_SRVR_DONE_A: - str = "SSLv3 write server done A"; - break; + return "SSLv3 write server done A"; case SSL3_ST_SW_SRVR_DONE_B: - str = "SSLv3 write server done B"; - break; + return "SSLv3 write server done B"; case SSL3_ST_SR_CERT_A: - str = "SSLv3 read client certificate A"; - break; + return "SSLv3 read client certificate A"; case SSL3_ST_SR_CERT_B: - str = "SSLv3 read client certificate B"; - break; + return "SSLv3 read client certificate B"; case SSL3_ST_SR_KEY_EXCH_A: - str = "SSLv3 read client key exchange A"; - break; + return "SSLv3 read client key exchange A"; case SSL3_ST_SR_KEY_EXCH_B: - str = "SSLv3 read client key exchange B"; - break; + return "SSLv3 read client key exchange B"; case SSL3_ST_SR_CERT_VRFY_A: - str = "SSLv3 read certificate verify A"; - break; + return "SSLv3 read certificate verify A"; case SSL3_ST_SR_CERT_VRFY_B: - str = "SSLv3 read certificate verify B"; - break; + return "SSLv3 read certificate verify B"; /* DTLS */ case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A: - str = "DTLS1 read hello verify request A"; - break; + return "DTLS1 read hello verify request A"; case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B: - str = "DTLS1 read hello verify request B"; - break; + return "DTLS1 read hello verify request B"; case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: - str = "DTLS1 write hello verify request A"; - break; + return "DTLS1 write hello verify request A"; case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: - str = "DTLS1 write hello verify request B"; - break; + return "DTLS1 write hello verify request B"; default: - str = "unknown state"; - break; + return "unknown state"; } - return (str); } LSSL_ALIAS(SSL_state_string_long); const char * SSL_rstate_string_long(const SSL *s) { - const char *str; - switch (s->rstate) { case SSL_ST_READ_HEADER: - str = "read header"; - break; + return "read header"; case SSL_ST_READ_BODY: - str = "read body"; - break; + return "read body"; case SSL_ST_READ_DONE: - str = "read done"; - break; + return "read done"; default: - str = "unknown"; - break; + return "unknown"; } - return (str); } LSSL_ALIAS(SSL_rstate_string_long); const char * SSL_state_string(const SSL *s) { - const char *str; - switch (s->s3->hs.state) { case SSL_ST_BEFORE: - str = "PINIT "; - break; + return "PINIT "; case SSL_ST_ACCEPT: - str = "AINIT "; - break; + return "AINIT "; case SSL_ST_CONNECT: - str = "CINIT "; - break; + return "CINIT "; case SSL_ST_OK: - str = "SSLOK "; - break; + return "SSLOK "; /* SSLv3 additions */ case SSL3_ST_SW_FLUSH: case SSL3_ST_CW_FLUSH: - str = "3FLUSH"; - break; + return "3FLUSH"; case SSL3_ST_CW_CLNT_HELLO_A: - str = "3WCH_A"; - break; + return "3WCH_A"; case SSL3_ST_CW_CLNT_HELLO_B: - str = "3WCH_B"; - break; + return "3WCH_B"; case SSL3_ST_CR_SRVR_HELLO_A: - str = "3RSH_A"; - break; + return "3RSH_A"; case SSL3_ST_CR_SRVR_HELLO_B: - str = "3RSH_B"; - break; + return "3RSH_B"; case SSL3_ST_CR_CERT_A: - str = "3RSC_A"; - break; + return "3RSC_A"; case SSL3_ST_CR_CERT_B: - str = "3RSC_B"; - break; + return "3RSC_B"; case SSL3_ST_CR_KEY_EXCH_A: - str = "3RSKEA"; - break; + return "3RSKEA"; case SSL3_ST_CR_KEY_EXCH_B: - str = "3RSKEB"; - break; + return "3RSKEB"; case SSL3_ST_CR_CERT_REQ_A: - str = "3RCR_A"; - break; + return "3RCR_A"; case SSL3_ST_CR_CERT_REQ_B: - str = "3RCR_B"; - break; + return "3RCR_B"; case SSL3_ST_CR_SRVR_DONE_A: - str = "3RSD_A"; - break; + return "3RSD_A"; case SSL3_ST_CR_SRVR_DONE_B: - str = "3RSD_B"; - break; + return "3RSD_B"; case SSL3_ST_CW_CERT_A: - str = "3WCC_A"; - break; + return "3WCC_A"; case SSL3_ST_CW_CERT_B: - str = "3WCC_B"; - break; + return "3WCC_B"; case SSL3_ST_CW_CERT_C: - str = "3WCC_C"; - break; + return "3WCC_C"; case SSL3_ST_CW_CERT_D: - str = "3WCC_D"; - break; + return "3WCC_D"; case SSL3_ST_CW_KEY_EXCH_A: - str = "3WCKEA"; - break; + return "3WCKEA"; case SSL3_ST_CW_KEY_EXCH_B: - str = "3WCKEB"; - break; + return "3WCKEB"; case SSL3_ST_CW_CERT_VRFY_A: - str = "3WCV_A"; - break; + return "3WCV_A"; case SSL3_ST_CW_CERT_VRFY_B: - str = "3WCV_B"; - break; + return "3WCV_B"; case SSL3_ST_SW_CHANGE_A: case SSL3_ST_CW_CHANGE_A: - str = "3WCCSA"; - break; + return "3WCCSA"; case SSL3_ST_SW_CHANGE_B: case SSL3_ST_CW_CHANGE_B: - str = "3WCCSB"; - break; + return "3WCCSB"; case SSL3_ST_SW_FINISHED_A: case SSL3_ST_CW_FINISHED_A: - str = "3WFINA"; - break; + return "3WFINA"; case SSL3_ST_SW_FINISHED_B: case SSL3_ST_CW_FINISHED_B: - str = "3WFINB"; - break; + return "3WFINB"; case SSL3_ST_SR_CHANGE_A: case SSL3_ST_CR_CHANGE_A: - str = "3RCCSA"; - break; + return "3RCCSA"; case SSL3_ST_SR_CHANGE_B: case SSL3_ST_CR_CHANGE_B: - str = "3RCCSB"; - break; + return "3RCCSB"; case SSL3_ST_SR_FINISHED_A: case SSL3_ST_CR_FINISHED_A: - str = "3RFINA"; - break; + return "3RFINA"; case SSL3_ST_SR_FINISHED_B: case SSL3_ST_CR_FINISHED_B: - str = "3RFINB"; - break; + return "3RFINB"; case SSL3_ST_SW_HELLO_REQ_A: - str = "3WHR_A"; - break; + return "3WHR_A"; case SSL3_ST_SW_HELLO_REQ_B: - str = "3WHR_B"; - break; + return "3WHR_B"; case SSL3_ST_SW_HELLO_REQ_C: - str = "3WHR_C"; - break; + return "3WHR_C"; case SSL3_ST_SR_CLNT_HELLO_A: - str = "3RCH_A"; - break; + return "3RCH_A"; case SSL3_ST_SR_CLNT_HELLO_B: - str = "3RCH_B"; - break; + return "3RCH_B"; case SSL3_ST_SR_CLNT_HELLO_C: - str = "3RCH_C"; - break; + return "3RCH_C"; case SSL3_ST_SW_SRVR_HELLO_A: - str = "3WSH_A"; - break; + return "3WSH_A"; case SSL3_ST_SW_SRVR_HELLO_B: - str = "3WSH_B"; - break; + return "3WSH_B"; case SSL3_ST_SW_CERT_A: - str = "3WSC_A"; - break; + return "3WSC_A"; case SSL3_ST_SW_CERT_B: - str = "3WSC_B"; - break; + return "3WSC_B"; case SSL3_ST_SW_KEY_EXCH_A: - str = "3WSKEA"; - break; + return "3WSKEA"; case SSL3_ST_SW_KEY_EXCH_B: - str = "3WSKEB"; - break; + return "3WSKEB"; case SSL3_ST_SW_CERT_REQ_A: - str = "3WCR_A"; - break; + return "3WCR_A"; case SSL3_ST_SW_CERT_REQ_B: - str = "3WCR_B"; - break; + return "3WCR_B"; case SSL3_ST_SW_SRVR_DONE_A: - str = "3WSD_A"; - break; + return "3WSD_A"; case SSL3_ST_SW_SRVR_DONE_B: - str = "3WSD_B"; - break; + return "3WSD_B"; case SSL3_ST_SR_CERT_A: - str = "3RCC_A"; - break; + return "3RCC_A"; case SSL3_ST_SR_CERT_B: - str = "3RCC_B"; - break; + return "3RCC_B"; case SSL3_ST_SR_KEY_EXCH_A: - str = "3RCKEA"; - break; + return "3RCKEA"; case SSL3_ST_SR_KEY_EXCH_B: - str = "3RCKEB"; - break; + return "3RCKEB"; case SSL3_ST_SR_CERT_VRFY_A: - str = "3RCV_A"; - break; + return "3RCV_A"; case SSL3_ST_SR_CERT_VRFY_B: - str = "3RCV_B"; - break; + return "3RCV_B"; /* DTLS */ case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A: - str = "DRCHVA"; - break; + return "DRCHVA"; case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B: - str = "DRCHVB"; - break; + return "DRCHVB"; case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: - str = "DWCHVA"; - break; + return "DWCHVA"; case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: - str = "DWCHVB"; - break; + return "DWCHVB"; default: - str = "UNKWN "; - break; + return "UNKWN "; } - return (str); } LSSL_ALIAS(SSL_state_string); @@ -556,11 +414,11 @@ SSL_alert_type_string_long(int value) { value >>= 8; if (value == SSL3_AL_WARNING) - return ("warning"); + return "warning"; else if (value == SSL3_AL_FATAL) - return ("fatal"); + return "fatal"; else - return ("unknown"); + return "unknown"; } LSSL_ALIAS(SSL_alert_type_string_long); @@ -569,247 +427,170 @@ SSL_alert_type_string(int value) { value >>= 8; if (value == SSL3_AL_WARNING) - return ("W"); + return "W"; else if (value == SSL3_AL_FATAL) - return ("F"); + return "F"; else - return ("U"); + return "U"; } LSSL_ALIAS(SSL_alert_type_string); const char * SSL_alert_desc_string(int value) { - const char *str; - switch (value & 0xff) { case SSL_AD_CLOSE_NOTIFY: - str = "CN"; - break; + return "CN"; case SSL_AD_UNEXPECTED_MESSAGE: - str = "UM"; - break; + return "UM"; case SSL_AD_BAD_RECORD_MAC: - str = "BM"; - break; + return "BM"; case SSL_AD_RECORD_OVERFLOW: - str = "RO"; - break; + return "RO"; case SSL_AD_DECOMPRESSION_FAILURE: - str = "DF"; - break; + return "DF"; case SSL_AD_HANDSHAKE_FAILURE: - str = "HF"; - break; + return "HF"; case SSL_AD_BAD_CERTIFICATE: - str = "BC"; - break; + return "BC"; case SSL_AD_UNSUPPORTED_CERTIFICATE: - str = "UC"; - break; + return "UC"; case SSL_AD_CERTIFICATE_REVOKED: - str = "CR"; - break; + return "CR"; case SSL_AD_CERTIFICATE_EXPIRED: - str = "CE"; - break; + return "CE"; case SSL_AD_CERTIFICATE_UNKNOWN: - str = "CU"; - break; + return "CU"; case SSL_AD_ILLEGAL_PARAMETER: - str = "IP"; - break; + return "IP"; case SSL_AD_UNKNOWN_CA: - str = "CA"; - break; + return "CA"; case SSL_AD_ACCESS_DENIED: - str = "AD"; - break; + return "AD"; case SSL_AD_DECODE_ERROR: - str = "DE"; - break; + return "DE"; case SSL_AD_DECRYPT_ERROR: - str = "CY"; - break; + return "CY"; case SSL_AD_PROTOCOL_VERSION: - str = "PV"; - break; + return "PV"; case SSL_AD_INSUFFICIENT_SECURITY: - str = "IS"; - break; + return "IS"; case SSL_AD_INTERNAL_ERROR: - str = "IE"; - break; + return "IE"; case SSL_AD_INAPPROPRIATE_FALLBACK: - str = "IF"; - break; + return "IF"; case SSL_AD_USER_CANCELLED: - str = "US"; - break; + return "US"; case SSL_AD_NO_RENEGOTIATION: - str = "NR"; - break; + return "NR"; case SSL_AD_MISSING_EXTENSION: - str = "ME"; - break; + return "ME"; case SSL_AD_UNSUPPORTED_EXTENSION: - str = "UE"; - break; + return "UE"; case SSL_AD_CERTIFICATE_UNOBTAINABLE: - str = "CO"; - break; + return "CO"; case SSL_AD_UNRECOGNIZED_NAME: - str = "UN"; - break; + return "UN"; case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: - str = "BR"; - break; + return "BR"; case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: - str = "BH"; - break; + return "BH"; case SSL_AD_UNKNOWN_PSK_IDENTITY: - str = "UP"; - break; + return "UP"; case SSL_AD_CERTIFICATE_REQUIRED: - str = "CQ"; /* XXX */ - break; + return "CQ"; /* XXX */ case SSL_AD_NO_APPLICATION_PROTOCOL: - str = "AP"; - break; + return "AP"; default: - str = "UK"; - break; + return "UK"; } - return (str); } LSSL_ALIAS(SSL_alert_desc_string); const char * SSL_alert_desc_string_long(int value) { - const char *str; - switch (value & 0xff) { case SSL_AD_CLOSE_NOTIFY: - str = "close notify"; - break; + return "close notify"; case SSL_AD_UNEXPECTED_MESSAGE: - str = "unexpected_message"; - break; + return "unexpected_message"; case SSL_AD_BAD_RECORD_MAC: - str = "bad record mac"; - break; + return "bad record mac"; case SSL_AD_RECORD_OVERFLOW: - str = "record overflow"; - break; + return "record overflow"; case SSL_AD_DECOMPRESSION_FAILURE: - str = "decompression failure"; - break; + return "decompression failure"; case SSL_AD_HANDSHAKE_FAILURE: - str = "handshake failure"; - break; + return "handshake failure"; case SSL_AD_BAD_CERTIFICATE: - str = "bad certificate"; - break; + return "bad certificate"; case SSL_AD_UNSUPPORTED_CERTIFICATE: - str = "unsupported certificate"; - break; + return "unsupported certificate"; case SSL_AD_CERTIFICATE_REVOKED: - str = "certificate revoked"; - break; + return "certificate revoked"; case SSL_AD_CERTIFICATE_EXPIRED: - str = "certificate expired"; - break; + return "certificate expired"; case SSL_AD_CERTIFICATE_UNKNOWN: - str = "certificate unknown"; - break; + return "certificate unknown"; case SSL_AD_ILLEGAL_PARAMETER: - str = "illegal parameter"; - break; + return "illegal parameter"; case SSL_AD_UNKNOWN_CA: - str = "unknown CA"; - break; + return "unknown CA"; case SSL_AD_ACCESS_DENIED: - str = "access denied"; - break; + return "access denied"; case SSL_AD_DECODE_ERROR: - str = "decode error"; - break; + return "decode error"; case SSL_AD_DECRYPT_ERROR: - str = "decrypt error"; - break; + return "decrypt error"; case SSL_AD_PROTOCOL_VERSION: - str = "protocol version"; - break; + return "protocol version"; case SSL_AD_INSUFFICIENT_SECURITY: - str = "insufficient security"; - break; + return "insufficient security"; case SSL_AD_INTERNAL_ERROR: - str = "internal error"; - break; + return "internal error"; case SSL_AD_INAPPROPRIATE_FALLBACK: - str = "inappropriate fallback"; - break; + return "inappropriate fallback"; case SSL_AD_USER_CANCELLED: - str = "user canceled"; - break; + return "user canceled"; case SSL_AD_NO_RENEGOTIATION: - str = "no renegotiation"; - break; + return "no renegotiation"; case SSL_AD_MISSING_EXTENSION: - str = "missing extension"; - break; + return "missing extension"; case SSL_AD_UNSUPPORTED_EXTENSION: - str = "unsupported extension"; - break; + return "unsupported extension"; case SSL_AD_CERTIFICATE_UNOBTAINABLE: - str = "certificate unobtainable"; - break; + return "certificate unobtainable"; case SSL_AD_UNRECOGNIZED_NAME: - str = "unrecognized name"; - break; + return "unrecognized name"; case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: - str = "bad certificate status response"; - break; + return "bad certificate status response"; case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: - str = "bad certificate hash value"; - break; + return "bad certificate hash value"; case SSL_AD_UNKNOWN_PSK_IDENTITY: - str = "unknown PSK identity"; - break; + return "unknown PSK identity"; case SSL_AD_CERTIFICATE_REQUIRED: - str = "certificate required"; - break; + return "certificate required"; case SSL_AD_NO_APPLICATION_PROTOCOL: - str = "no application protocol"; - break; + return "no application protocol"; default: - str = "unknown"; - break; + return "unknown"; } - return (str); } LSSL_ALIAS(SSL_alert_desc_string_long); const char * SSL_rstate_string(const SSL *s) { - const char *str; - switch (s->rstate) { case SSL_ST_READ_HEADER: - str = "RH"; - break; + return "RH"; case SSL_ST_READ_BODY: - str = "RB"; - break; + return "RB"; case SSL_ST_READ_DONE: - str = "RD"; - break; + return "RD"; default: - str = "unknown"; - break; + return "unknown"; } - return (str); } LSSL_ALIAS(SSL_rstate_string); diff --git a/regress/lib/libcrypto/ec/ec_asn1_test.c b/regress/lib/libcrypto/ec/ec_asn1_test.c index 512f5c525..321ee5c65 100644 --- a/regress/lib/libcrypto/ec/ec_asn1_test.c +++ b/regress/lib/libcrypto/ec/ec_asn1_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_asn1_test.c,v 1.2 2021/12/04 17:03:43 tb Exp $ */ +/* $OpenBSD: ec_asn1_test.c,v 1.3 2024/10/12 16:15:28 tb Exp $ */ /* * Copyright (c) 2017, 2021 Joel Sing * @@ -194,6 +194,107 @@ ec_group_pkparameters_parameters_test(void) sizeof(ec_secp256r1_pkparameters_parameters)); } +static int +ec_group_roundtrip_curve(const EC_GROUP *group, const char *descr, int nid) +{ + EC_GROUP *new_group = NULL; + unsigned char *der = NULL; + int der_len; + const unsigned char *p; + int failed = 1; + + der = NULL; + if ((der_len = i2d_ECPKParameters(group, &der)) <= 0) + errx(1, "failed to serialize %s %d", descr, nid); + + p = der; + if ((new_group = d2i_ECPKParameters(NULL, &p, der_len)) == NULL) + errx(1, "failed to deserialize %s %d", descr, nid); + + if (EC_GROUP_cmp(group, new_group, NULL) != 0) { + fprintf(stderr, "FAIL: %s %d groups mismatch\n", descr, nid); + goto err; + } + if (EC_GROUP_get_asn1_flag(group) != EC_GROUP_get_asn1_flag(new_group)) { + fprintf(stderr, "FAIL: %s %d asn1_flag %x != %x\n", descr, nid, + EC_GROUP_get_asn1_flag(group), + EC_GROUP_get_asn1_flag(new_group)); + goto err; + } + if (EC_GROUP_get_point_conversion_form(group) != + EC_GROUP_get_point_conversion_form(new_group)) { + fprintf(stderr, "FAIL: %s %d form %02x != %02x\n", descr, nid, + EC_GROUP_get_point_conversion_form(group), + EC_GROUP_get_point_conversion_form(new_group)); + goto err; + } + + failed = 0; + + err: + EC_GROUP_free(new_group); + free(der); + + return failed; +} + +static int +ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve) +{ + EC_GROUP *group = NULL; + int failed = 0; + + if ((group = EC_GROUP_new_by_curve_name(curve->nid)) == NULL) + errx(1, "failed to instantiate curve %d", curve->nid); + + if (EC_GROUP_get_asn1_flag(group) != OPENSSL_EC_NAMED_CURVE) { + fprintf(stderr, "FAIL: ASN.1 flag not set for %d\n", curve->nid); + goto err; + } + if (EC_GROUP_get_point_conversion_form(group) != + POINT_CONVERSION_UNCOMPRESSED) { + fprintf(stderr, "FAIL: %d has point conversion form %02x\n", + curve->nid, EC_GROUP_get_point_conversion_form(group)); + goto err; + } + + failed |= ec_group_roundtrip_curve(group, "named", curve->nid); + + EC_GROUP_set_asn1_flag(group, 0); + failed |= ec_group_roundtrip_curve(group, "explicit", curve->nid); + + EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED); + failed |= ec_group_roundtrip_curve(group, "compressed", curve->nid); + + EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_HYBRID); + failed |= ec_group_roundtrip_curve(group, "hybrid", curve->nid); + + err: + EC_GROUP_free(group); + + return failed; +} + +static int +ec_group_roundtrip_builtin_curves(void) +{ + EC_builtin_curve *all_curves = NULL; + size_t curve_id, ncurves; + int failed = 0; + + ncurves = EC_get_builtin_curves(NULL, 0); + if ((all_curves = calloc(ncurves, sizeof(*all_curves))) == NULL) + err(1, "calloc builtin curves"); + EC_get_builtin_curves(all_curves, ncurves); + + for (curve_id = 0; curve_id < ncurves; curve_id++) + failed |= ec_group_roundtrip_builtin_curve(&all_curves[curve_id]); + + free(all_curves); + + return failed; +} + int main(int argc, char **argv) { @@ -201,6 +302,7 @@ main(int argc, char **argv) failed |= ec_group_pkparameters_named_curve_test(); failed |= ec_group_pkparameters_parameters_test(); + failed |= ec_group_roundtrip_builtin_curves(); return (failed); } diff --git a/regress/lib/libcrypto/err/err_test.c b/regress/lib/libcrypto/err/err_test.c index 16fd675e1..d31c61fa1 100644 --- a/regress/lib/libcrypto/err/err_test.c +++ b/regress/lib/libcrypto/err/err_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err_test.c,v 1.1 2024/10/02 14:41:46 jsing Exp $ */ +/* $OpenBSD: err_test.c,v 1.2 2024/10/11 07:54:22 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -130,6 +130,24 @@ err_test(void) ERR_clear_error(); + /* + * Check SYSerror() reasons, which are dynamically populated from + * strerror(). + */ + ERR_put_error(ERR_LIB_SYS, 0xfff, 1, "err.c", 300); + + if ((err = ERR_get_error()) != 0x2fff001UL) { + fprintf(stderr, "FAIL: ERR_get_error() = %lx, want " + "0x2fff001UL\n", err); + goto failure; + } + s = ERR_reason_error_string(err); + if (strcmp(s, strerror(ERR_GET_REASON(err))) != 0) { + fprintf(stderr, "FAIL: ERR_reason_error_string() = '%s', " + "want '%s'\n", s, strerror(ERR_GET_REASON(err))); + goto failure; + } + s = ERR_lib_error_string(0x3fff067UL); if (strcmp(s, "bignum routines") != 0) { fprintf(stderr, "FAIL: ERR_lib_error_string() = '%s', " diff --git a/share/man/man1/dpb-replay.1 b/share/man/man1/dpb-replay.1 index d90b58451..bb05f3eed 100644 --- a/share/man/man1/dpb-replay.1 +++ b/share/man/man1/dpb-replay.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dpb-replay.1,v 1.4 2023/07/06 10:57:03 espie Exp $ +.\" $OpenBSD: dpb-replay.1,v 1.5 2024/10/12 15:40:36 jmc Exp $ .\" .\" Copyright (c) 2013 Marc Espie .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: July 6 2023 $ +.Dd $Mdocdate: October 12 2024 $ .Dt DPB-REPLAY 1 .Os .Sh NAME @@ -55,7 +55,6 @@ Starts display when the time matches timestamp, as either seconds from the epoch, or a reasonable subset of ISO8601, like .Sq 2023-07-05T12:00 . - .El .Sh SEE ALSO .Xr dpb 1 diff --git a/sys/dev/fdt/qccpu.c b/sys/dev/fdt/qccpu.c index 8e953c4cf..b401fcdb1 100644 --- a/sys/dev/fdt/qccpu.c +++ b/sys/dev/fdt/qccpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qccpu.c,v 1.3 2024/05/13 01:15:50 jsg Exp $ */ +/* $OpenBSD: qccpu.c,v 1.4 2024/10/10 23:15:27 jsg Exp $ */ /* * Copyright (c) 2023 Dale Rahn * @@ -49,11 +49,6 @@ #define CPUF_PERF_STATE 0x320 #define LUT_ROW_SIZE 4 -struct cpu_freq_tbl { - uint32_t driver_data; - uint32_t frequency; -}; - #define NUM_GROUP 2 #define MAX_LUT 40 diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.c index fc48de24f..060438a60 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -340,15 +340,15 @@ allocate_mem_reserve_bo_failed: return r; } -void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj) +void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj) { - struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj; + struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj; - amdgpu_bo_reserve(bo, true); - amdgpu_bo_kunmap(bo); - amdgpu_bo_unpin(bo); - amdgpu_bo_unreserve(bo); - amdgpu_bo_unref(&(bo)); + amdgpu_bo_reserve(*bo, true); + amdgpu_bo_kunmap(*bo); + amdgpu_bo_unpin(*bo); + amdgpu_bo_unreserve(*bo); + amdgpu_bo_unref(bo); } int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size, diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.h b/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.h index 3e166f2bb..6ea519a2b 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -221,7 +221,7 @@ int amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni, int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size, void **mem_obj, uint64_t *gpu_addr, void **cpu_ptr, bool mqd_gfx9); -void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj); +void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj); int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size, void **mem_obj); void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj); diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c index dca5c07fa..784e66c1e 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c @@ -263,6 +263,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, if (size < sizeof(struct drm_amdgpu_bo_list_in)) goto free_partial_kdata; + /* Only a single BO list is allowed to simplify handling. */ + if (p->bo_list) + ret = -EINVAL; + ret = amdgpu_cs_p1_bo_handles(p, p->chunks[i].kdata); if (ret) goto free_partial_kdata; diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_gfx.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_gfx.c index c4b554486..96f83c10e 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_gfx.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_gfx.c @@ -795,8 +795,11 @@ int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *r int r; if (amdgpu_ras_is_supported(adev, ras_block->block)) { - if (!amdgpu_persistent_edc_harvesting_supported(adev)) - amdgpu_ras_reset_error_status(adev, AMDGPU_RAS_BLOCK__GFX); + if (!amdgpu_persistent_edc_harvesting_supported(adev)) { + r = amdgpu_ras_reset_error_status(adev, AMDGPU_RAS_BLOCK__GFX); + if (r) + return r; + } r = amdgpu_ras_block_late_init(adev, ras_block); if (r) @@ -941,7 +944,10 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) pr_err("critical bug! too many kiq readers\n"); goto failed_unlock; } - amdgpu_ring_alloc(ring, 32); + r = amdgpu_ring_alloc(ring, 32); + if (r) + goto failed_unlock; + amdgpu_ring_emit_rreg(ring, reg, reg_val_offs); r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); if (r) @@ -1007,7 +1013,10 @@ void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) } spin_lock_irqsave(&kiq->ring_lock, flags); - amdgpu_ring_alloc(ring, 32); + r = amdgpu_ring_alloc(ring, 32); + if (r) + goto failed_unlock; + amdgpu_ring_emit_wreg(ring, reg, v); r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); if (r) @@ -1043,6 +1052,7 @@ void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) failed_undo: amdgpu_ring_undo(ring); +failed_unlock: spin_unlock_irqrestore(&kiq->ring_lock, flags); failed_kiq_write: dev_err(adev->dev, "failed to write reg:%x\n", reg); diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_kms.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_kms.c index be9f213f1..63578f19d 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_kms.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_kms.c @@ -43,6 +43,7 @@ #include "amdgpu_gem.h" #include "amdgpu_display.h" #include "amdgpu_ras.h" +#include "amdgpu_reset.h" #include "amd_pcie.h" void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev) @@ -722,6 +723,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ? -EFAULT : 0; } case AMDGPU_INFO_READ_MMR_REG: { + int ret = 0; unsigned int n, alloc_size; uint32_t *regs; unsigned int se_num = (info->read_mmr_reg.instance >> @@ -731,24 +733,37 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) AMDGPU_INFO_MMR_SH_INDEX_SHIFT) & AMDGPU_INFO_MMR_SH_INDEX_MASK; + if (!down_read_trylock(&adev->reset_domain->sem)) + return -ENOENT; + /* set full masks if the userspace set all bits * in the bitfields */ - if (se_num == AMDGPU_INFO_MMR_SE_INDEX_MASK) + if (se_num == AMDGPU_INFO_MMR_SE_INDEX_MASK) { se_num = 0xffffffff; - else if (se_num >= AMDGPU_GFX_MAX_SE) - return -EINVAL; - if (sh_num == AMDGPU_INFO_MMR_SH_INDEX_MASK) - sh_num = 0xffffffff; - else if (sh_num >= AMDGPU_GFX_MAX_SH_PER_SE) - return -EINVAL; + } else if (se_num >= AMDGPU_GFX_MAX_SE) { + ret = -EINVAL; + goto out; + } - if (info->read_mmr_reg.count > 128) - return -EINVAL; + if (sh_num == AMDGPU_INFO_MMR_SH_INDEX_MASK) { + sh_num = 0xffffffff; + } else if (sh_num >= AMDGPU_GFX_MAX_SH_PER_SE) { + ret = -EINVAL; + goto out; + } + + if (info->read_mmr_reg.count > 128) { + ret = -EINVAL; + goto out; + } regs = kmalloc_array(info->read_mmr_reg.count, sizeof(*regs), GFP_KERNEL); - if (!regs) - return -ENOMEM; + if (!regs) { + ret = -ENOMEM; + goto out; + } + alloc_size = info->read_mmr_reg.count * sizeof(*regs); amdgpu_gfx_off_ctrl(adev, false); @@ -760,13 +775,17 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) info->read_mmr_reg.dword_offset + i); kfree(regs); amdgpu_gfx_off_ctrl(adev, true); - return -EFAULT; + ret = -EFAULT; + goto out; } } amdgpu_gfx_off_ctrl(adev, true); n = copy_to_user(out, regs, min(size, alloc_size)); kfree(regs); - return n ? -EFAULT : 0; + ret = (n ? -EFAULT : 0); +out: + up_read(&adev->reset_domain->sem); + return ret; } case AMDGPU_INFO_DEV_INFO: { struct drm_amdgpu_info_device *dev_info; diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_xcp.h b/sys/dev/pci/drm/amd/amdgpu/amdgpu_xcp.h index f466e2642..d8fd0a7d2 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_xcp.h +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_xcp.h @@ -179,6 +179,6 @@ amdgpu_get_next_xcp(struct amdgpu_xcp_mgr *xcp_mgr, int *from) #define for_each_xcp(xcp_mgr, xcp, i) \ for (i = 0, xcp = amdgpu_get_next_xcp(xcp_mgr, &i); xcp; \ - xcp = amdgpu_get_next_xcp(xcp_mgr, &i)) + ++i, xcp = amdgpu_get_next_xcp(xcp_mgr, &i)) #endif diff --git a/sys/dev/pci/drm/amd/amdgpu/gfx_v10_0.c b/sys/dev/pci/drm/amd/amdgpu/gfx_v10_0.c index 699e1829f..8772e73d2 100644 --- a/sys/dev/pci/drm/amd/amdgpu/gfx_v10_0.c +++ b/sys/dev/pci/drm/amd/amdgpu/gfx_v10_0.c @@ -8748,7 +8748,9 @@ static void gfx_v10_0_ring_soft_recovery(struct amdgpu_ring *ring, value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); + amdgpu_gfx_rlc_enter_safe_mode(adev, 0); WREG32_SOC15(GC, 0, mmSQ_CMD, value); + amdgpu_gfx_rlc_exit_safe_mode(adev, 0); } static void diff --git a/sys/dev/pci/drm/amd/amdgpu/gfx_v11_0.c b/sys/dev/pci/drm/amd/amdgpu/gfx_v11_0.c index beb2bdc88..fc8a0e69a 100644 --- a/sys/dev/pci/drm/amd/amdgpu/gfx_v11_0.c +++ b/sys/dev/pci/drm/amd/amdgpu/gfx_v11_0.c @@ -5701,7 +5701,9 @@ static void gfx_v11_0_ring_soft_recovery(struct amdgpu_ring *ring, value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); + amdgpu_gfx_rlc_enter_safe_mode(adev, 0); WREG32_SOC15(GC, 0, regSQ_CMD, value); + amdgpu_gfx_rlc_exit_safe_mode(adev, 0); } static void diff --git a/sys/dev/pci/drm/amd/amdgpu/gfx_v9_0.c b/sys/dev/pci/drm/amd/amdgpu/gfx_v9_0.c index 68b32849a..32ecdae89 100644 --- a/sys/dev/pci/drm/amd/amdgpu/gfx_v9_0.c +++ b/sys/dev/pci/drm/amd/amdgpu/gfx_v9_0.c @@ -1172,6 +1172,10 @@ static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = { { 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 }, /* Apple MacBook Pro (15-inch, 2019) Radeon Pro Vega 20 4 GB */ { 0x1002, 0x69af, 0x106b, 0x019a, 0xc0 }, + /* https://bbs.openkylin.top/t/topic/171497 */ + { 0x1002, 0x15d8, 0x19e5, 0x3e14, 0xc2 }, + /* HP 705G4 DM with R5 2400G */ + { 0x1002, 0x15dd, 0x103c, 0x8464, 0xd6 }, { 0, 0, 0, 0, 0 }, }; @@ -5705,7 +5709,9 @@ static void gfx_v9_0_ring_soft_recovery(struct amdgpu_ring *ring, unsigned vmid) value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); + amdgpu_gfx_rlc_enter_safe_mode(adev, 0); WREG32_SOC15(GC, 0, mmSQ_CMD, value); + amdgpu_gfx_rlc_exit_safe_mode(adev, 0); } static void gfx_v9_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c b/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c index bf9c3dead..0a1033521 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c @@ -417,7 +417,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, err_create_queue: if (wptr_bo) - amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo); + amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo); err_wptr_map_gart: err_bind_process: err_pdd: diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_device.c b/sys/dev/pci/drm/amd/amdkfd/kfd_device.c index 0c94bdfad..9d0b0bf70 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_device.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_device.c @@ -838,7 +838,7 @@ node_alloc_error: kfd_doorbell_error: kfd_gtt_sa_fini(kfd); kfd_gtt_sa_init_error: - amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem); + amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem); alloc_gtt_mem_failure: dev_err(kfd_device, "device %x:%x NOT added due to errors\n", @@ -856,7 +856,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd) kfd_doorbell_fini(kfd); ida_destroy(&kfd->doorbell_ida); kfd_gtt_sa_fini(kfd); - amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem); + amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem); } kfree(kfd); diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_device_queue_manager.c b/sys/dev/pci/drm/amd/amdkfd/kfd_device_queue_manager.c index 60d98301e..4d9a40692 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -2610,7 +2610,7 @@ static void deallocate_hiq_sdma_mqd(struct kfd_node *dev, { WARN(!mqd, "No hiq sdma mqd trunk to free"); - amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem); + amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem); } void device_queue_manager_uninit(struct device_queue_manager *dqm) diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_mqd_manager.c b/sys/dev/pci/drm/amd/amdkfd/kfd_mqd_manager.c index 447829c22..4c3f37980 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_mqd_manager.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_mqd_manager.c @@ -223,7 +223,7 @@ void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd, struct kfd_mem_obj *mqd_mem_obj) { if (mqd_mem_obj->gtt_mem) { - amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, mqd_mem_obj->gtt_mem); + amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, &mqd_mem_obj->gtt_mem); kfree(mqd_mem_obj); } else { kfd_gtt_sa_free(mm->dev, mqd_mem_obj); diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_process.c b/sys/dev/pci/drm/amd/amdkfd/kfd_process.c index d98e45aec..43f520b37 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_process.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_process.c @@ -1047,7 +1047,7 @@ static void kfd_process_destroy_pdds(struct kfd_process *p) if (pdd->dev->kfd->shared_resources.enable_mes) amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev, - pdd->proc_ctx_bo); + &pdd->proc_ctx_bo); /* * before destroying pdd, make sure to report availability * for auto suspend diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_process_queue_manager.c b/sys/dev/pci/drm/amd/amdkfd/kfd_process_queue_manager.c index 8aca92624..0583af4e8 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_process_queue_manager.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_process_queue_manager.c @@ -199,9 +199,9 @@ static void pqm_clean_queue_resource(struct process_queue_manager *pqm, } if (dev->kfd->shared_resources.enable_mes) { - amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->gang_ctx_bo); + amdgpu_amdkfd_free_gtt_mem(dev->adev, &pqn->q->gang_ctx_bo); if (pqn->q->wptr_bo) - amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->wptr_bo); + amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&pqn->q->wptr_bo); } } @@ -982,6 +982,7 @@ exit: pr_debug("Queue id %d was restored successfully\n", queue_id); kfree(q_data); + kfree(q_extra_data); return ret; } diff --git a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c index a74f6e948..4d80c46e3 100644 --- a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -714,6 +714,12 @@ static void dmub_hpd_callback(struct amdgpu_device *adev, return; } + /* Skip DMUB HPD IRQ in suspend/resume. We will probe them later. */ + if (notify->type == DMUB_NOTIFICATION_HPD && adev->in_suspend) { + DRM_INFO("Skip DMUB HPD IRQ callback in suspend/resume\n"); + return; + } + link_index = notify->link_index; link = adev->dm.dc->links[link_index]; dev = adev->dm.ddev; @@ -4062,7 +4068,7 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm, int spread = caps.max_input_signal - caps.min_input_signal; if (caps.max_input_signal > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || - caps.min_input_signal < AMDGPU_DM_DEFAULT_MIN_BACKLIGHT || + caps.min_input_signal < 0 || spread > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || spread < AMDGPU_DM_MIN_SPREAD) { DRM_DEBUG_KMS("DM: Invalid backlight caps: min=%d, max=%d\n", @@ -6157,12 +6163,21 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT || stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST || stream->signal == SIGNAL_TYPE_EDP) { + const struct dc_edid_caps *edid_caps; + unsigned int disable_colorimetry = 0; + + if (aconnector->dc_sink) { + edid_caps = &aconnector->dc_sink->edid_caps; + disable_colorimetry = edid_caps->panel_patch.disable_colorimetry; + } + // // should decide stream support vsc sdp colorimetry capability // before building vsc info packet // stream->use_vsc_sdp_for_colorimetry = stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 && - stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED; + stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED && + !disable_colorimetry; if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) tf = TRANSFER_FUNC_GAMMA_22; diff --git a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index 05bcc9287..23a0bc96a 100644 --- a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -71,6 +71,10 @@ static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps) DRM_DEBUG_DRIVER("Clearing DPCD 0x317 on monitor with panel id %X\n", panel_id); edid_caps->panel_patch.remove_sink_ext_caps = true; break; + case drm_edid_encode_panel_id('S', 'D', 'C', 0x4154): + DRM_DEBUG_DRIVER("Disabling VSC on monitor with panel id %X\n", panel_id); + edid_caps->panel_patch.disable_colorimetry = true; + break; default: return; } diff --git a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c index fa9f53b31..d1329f20b 100644 --- a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c +++ b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c @@ -1281,7 +1281,8 @@ void amdgpu_dm_plane_handle_cursor_update(struct drm_plane *plane, adev->dm.dc->caps.color.dpp.gamma_corr) attributes.attribute_flags.bits.ENABLE_CURSOR_DEGAMMA = 1; - attributes.pitch = afb->base.pitches[0] / afb->base.format->cpp[0]; + if (afb) + attributes.pitch = afb->base.pitches[0] / afb->base.format->cpp[0]; if (crtc_state->stream) { mutex_lock(&adev->dm.dc_lock); diff --git a/sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c b/sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c index 50e643bfd..a7a6f6c5c 100644 --- a/sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c +++ b/sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c @@ -3797,7 +3797,8 @@ static void commit_planes_for_stream(struct dc *dc, } if ((update_type != UPDATE_TYPE_FAST) && stream->update_flags.bits.dsc_changed) - if (top_pipe_to_program->stream_res.tg->funcs->lock_doublebuffer_enable) { + if (top_pipe_to_program && + top_pipe_to_program->stream_res.tg->funcs->lock_doublebuffer_enable) { top_pipe_to_program->stream_res.tg->funcs->wait_for_state( top_pipe_to_program->stream_res.tg, CRTC_STATE_VACTIVE); @@ -4715,7 +4716,8 @@ void dc_allow_idle_optimizations(struct dc *dc, bool allow) if (allow == dc->idle_optimizations_allowed) return; - if (dc->hwss.apply_idle_power_optimizations && dc->hwss.apply_idle_power_optimizations(dc, allow)) + if (dc->hwss.apply_idle_power_optimizations && dc->clk_mgr != NULL && + dc->hwss.apply_idle_power_optimizations(dc, allow)) dc->idle_optimizations_allowed = allow; } diff --git a/sys/dev/pci/drm/amd/display/dc/core/dc_resource.c b/sys/dev/pci/drm/amd/display/dc/core/dc_resource.c index a2f302d04..01e56d1e9 100644 --- a/sys/dev/pci/drm/amd/display/dc/core/dc_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/core/dc_resource.c @@ -2154,6 +2154,8 @@ static bool are_stream_backends_same( bool dc_is_stream_unchanged( struct dc_stream_state *old_stream, struct dc_stream_state *stream) { + if (!old_stream || !stream) + return false; if (!are_stream_backends_same(old_stream, stream)) return false; @@ -2877,8 +2879,10 @@ static bool planes_changed_for_existing_stream(struct dc_state *context, } } - if (!stream_status) + if (!stream_status) { ASSERT(0); + return false; + } for (i = 0; i < set_count; i++) if (set[i].stream == stream) diff --git a/sys/dev/pci/drm/amd/display/dc/dc_types.h b/sys/dev/pci/drm/amd/display/dc/dc_types.h index cc173ecf7..6eaa02a80 100644 --- a/sys/dev/pci/drm/amd/display/dc/dc_types.h +++ b/sys/dev/pci/drm/amd/display/dc/dc_types.h @@ -190,6 +190,7 @@ struct dc_panel_patch { unsigned int skip_avmute; unsigned int mst_start_top_delay; unsigned int remove_sink_ext_caps; + unsigned int disable_colorimetry; }; struct dc_edid_caps { diff --git a/sys/dev/pci/drm/amd/display/dc/dcn10/dcn10_cm_common.c b/sys/dev/pci/drm/amd/display/dc/dcn10/dcn10_cm_common.c index c0372aa4e..684e30f9c 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn10/dcn10_cm_common.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn10/dcn10_cm_common.c @@ -571,6 +571,8 @@ bool cm_helper_translate_curve_to_degamma_hw_format( i += increment) { if (j == hw_points - 1) break; + if (i >= TRANSFER_FUNC_POINTS) + return false; rgb_resulted[j].red = output_tf->tf_pts.red[i]; rgb_resulted[j].green = output_tf->tf_pts.green[i]; rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; diff --git a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_cm_common.c b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_cm_common.c index e0df9b006..62c02adae 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_cm_common.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_cm_common.c @@ -178,6 +178,8 @@ bool cm3_helper_translate_curve_to_hw_format( i += increment) { if (j == hw_points - 1) break; + if (i >= TRANSFER_FUNC_POINTS) + return false; rgb_resulted[j].red = output_tf->tf_pts.red[i]; rgb_resulted[j].green = output_tf->tf_pts.green[i]; rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; @@ -355,6 +357,8 @@ bool cm3_helper_translate_curve_to_degamma_hw_format( i += increment) { if (j == hw_points - 1) break; + if (i >= TRANSFER_FUNC_POINTS) + return false; rgb_resulted[j].red = output_tf->tf_pts.red[i]; rgb_resulted[j].green = output_tf->tf_pts.green[i]; rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; diff --git a/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c b/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c index 0fc9f3e3f..f603486af 100644 --- a/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c +++ b/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c @@ -78,7 +78,7 @@ static void calculate_ttu_cursor(struct display_mode_lib *mode_lib, static unsigned int get_bytes_per_element(enum source_format_class source_format, bool is_chroma) { - unsigned int ret_val = 0; + unsigned int ret_val = 1; if (source_format == dm_444_16) { if (!is_chroma) diff --git a/sys/dev/pci/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c b/sys/dev/pci/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c index 618f4b682..9f28e4d3c 100644 --- a/sys/dev/pci/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c +++ b/sys/dev/pci/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c @@ -53,7 +53,7 @@ static void calculate_ttu_cursor( static unsigned int get_bytes_per_element(enum source_format_class source_format, bool is_chroma) { - unsigned int ret_val = 0; + unsigned int ret_val = 1; if (source_format == dm_444_16) { if (!is_chroma) diff --git a/sys/dev/pci/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c b/sys/dev/pci/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c index 5dd5bd609..9a349de0f 100644 --- a/sys/dev/pci/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c +++ b/sys/dev/pci/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c @@ -28,6 +28,8 @@ #include "dccg.h" #include "clk_mgr.h" +#define DC_LOGGER link->ctx->logger + void set_hpo_dp_throttled_vcp_size(struct pipe_ctx *pipe_ctx, struct fixed31_32 throttled_vcp_size) { @@ -108,6 +110,11 @@ void enable_hpo_dp_link_output(struct dc_link *link, enum clock_source_id clock_source, const struct dc_link_settings *link_settings) { + if (!link_res->hpo_dp_link_enc) { + DC_LOG_ERROR("%s: invalid hpo_dp_link_enc\n", __func__); + return; + } + if (link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating) link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating( link->dc->res_pool->dccg, @@ -124,6 +131,11 @@ void disable_hpo_dp_link_output(struct dc_link *link, const struct link_resource *link_res, enum amd_signal_type signal) { + if (!link_res->hpo_dp_link_enc) { + DC_LOG_ERROR("%s: invalid hpo_dp_link_enc\n", __func__); + return; + } + link_res->hpo_dp_link_enc->funcs->link_disable(link_res->hpo_dp_link_enc); link_res->hpo_dp_link_enc->funcs->disable_link_phy( link_res->hpo_dp_link_enc, signal); diff --git a/sys/dev/pci/drm/amd/display/dc/link/link_factory.c b/sys/dev/pci/drm/amd/display/dc/link/link_factory.c index 33bb96f77..eb7c9f226 100644 --- a/sys/dev/pci/drm/amd/display/dc/link/link_factory.c +++ b/sys/dev/pci/drm/amd/display/dc/link/link_factory.c @@ -403,7 +403,7 @@ static void link_destruct(struct dc_link *link) if (link->panel_cntl) link->panel_cntl->funcs->destroy(&link->panel_cntl); - if (link->link_enc) { + if (link->link_enc && !link->is_dig_mapping_flexible) { /* Update link encoder resource tracking variables. These are used for * the dynamic assignment of link encoders to streams. Virtual links * are not assigned encoder resources on creation. diff --git a/sys/dev/pci/drm/amd/pm/powerplay/hwmgr/processpptables.c b/sys/dev/pci/drm/amd/pm/powerplay/hwmgr/processpptables.c index 5794b6450..56a225752 100644 --- a/sys/dev/pci/drm/amd/pm/powerplay/hwmgr/processpptables.c +++ b/sys/dev/pci/drm/amd/pm/powerplay/hwmgr/processpptables.c @@ -1185,6 +1185,8 @@ static int init_overdrive_limits(struct pp_hwmgr *hwmgr, fw_info = smu_atom_get_data_table(hwmgr->adev, GetIndexIntoMasterTable(DATA, FirmwareInfo), &size, &frev, &crev); + PP_ASSERT_WITH_CODE(fw_info != NULL, + "Missing firmware info!", return -EINVAL); if ((fw_info->ucTableFormatRevision == 1) && (le16_to_cpu(fw_info->usStructureSize) >= sizeof(ATOM_FIRMWARE_INFO_V1_4))) diff --git a/sys/dev/pci/drm/drm_atomic_uapi.c b/sys/dev/pci/drm/drm_atomic_uapi.c index bd28864e9..8e558a50c 100644 --- a/sys/dev/pci/drm/drm_atomic_uapi.c +++ b/sys/dev/pci/drm/drm_atomic_uapi.c @@ -586,7 +586,7 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane, &state->fb_damage_clips, val, -1, - sizeof(struct drm_rect), + sizeof(struct drm_mode_rect), &replaced); return ret; } else if (property == plane->scaling_filter_property) { diff --git a/sys/dev/pci/drm/drm_print.c b/sys/dev/pci/drm/drm_print.c index 68c810e2d..da63a054a 100644 --- a/sys/dev/pci/drm/drm_print.c +++ b/sys/dev/pci/drm/drm_print.c @@ -104,8 +104,9 @@ void __drm_puts_coredump(struct drm_printer *p, const char *str) copy = iterator->remain; /* Copy out the bit of the string that we need */ - memcpy(iterator->data, - str + (iterator->start - iterator->offset), copy); + if (iterator->data) + memcpy(iterator->data, + str + (iterator->start - iterator->offset), copy); iterator->offset = iterator->start + copy; iterator->remain -= copy; @@ -114,7 +115,8 @@ void __drm_puts_coredump(struct drm_printer *p, const char *str) len = min_t(ssize_t, strlen(str), iterator->remain); - memcpy(iterator->data + pos, str, len); + if (iterator->data) + memcpy(iterator->data + pos, str, len); iterator->offset += len; iterator->remain -= len; @@ -144,8 +146,9 @@ void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf) if ((iterator->offset >= iterator->start) && (len < iterator->remain)) { ssize_t pos = iterator->offset - iterator->start; - snprintf(((char *) iterator->data) + pos, - iterator->remain, "%pV", vaf); + if (iterator->data) + snprintf(((char *) iterator->data) + pos, + iterator->remain, "%pV", vaf); iterator->offset += len; iterator->remain -= len; diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c index 289e834e6..cbca8f523 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c @@ -1167,7 +1167,7 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf) GEM_WARN_ON(!i915_ttm_cpu_maps_iomem(bo->resource)); } - if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND) + if (wakeref && CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND != 0) intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref, msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)); diff --git a/sys/dev/pci/drm/radeon/r100.c b/sys/dev/pci/drm/radeon/r100.c index 4efe63d84..8d3124092 100644 --- a/sys/dev/pci/drm/radeon/r100.c +++ b/sys/dev/pci/drm/radeon/r100.c @@ -1015,45 +1015,65 @@ static int r100_cp_init_microcode(struct radeon_device *rdev) DRM_DEBUG_KMS("\n"); - if ((rdev->family == CHIP_R100) || (rdev->family == CHIP_RV100) || - (rdev->family == CHIP_RV200) || (rdev->family == CHIP_RS100) || - (rdev->family == CHIP_RS200)) { + switch (rdev->family) { + case CHIP_R100: + case CHIP_RV100: + case CHIP_RV200: + case CHIP_RS100: + case CHIP_RS200: DRM_INFO("Loading R100 Microcode\n"); fw_name = FIRMWARE_R100; - } else if ((rdev->family == CHIP_R200) || - (rdev->family == CHIP_RV250) || - (rdev->family == CHIP_RV280) || - (rdev->family == CHIP_RS300)) { + break; + + case CHIP_R200: + case CHIP_RV250: + case CHIP_RV280: + case CHIP_RS300: DRM_INFO("Loading R200 Microcode\n"); fw_name = FIRMWARE_R200; - } else if ((rdev->family == CHIP_R300) || - (rdev->family == CHIP_R350) || - (rdev->family == CHIP_RV350) || - (rdev->family == CHIP_RV380) || - (rdev->family == CHIP_RS400) || - (rdev->family == CHIP_RS480)) { + break; + + case CHIP_R300: + case CHIP_R350: + case CHIP_RV350: + case CHIP_RV380: + case CHIP_RS400: + case CHIP_RS480: DRM_INFO("Loading R300 Microcode\n"); fw_name = FIRMWARE_R300; - } else if ((rdev->family == CHIP_R420) || - (rdev->family == CHIP_R423) || - (rdev->family == CHIP_RV410)) { + break; + + case CHIP_R420: + case CHIP_R423: + case CHIP_RV410: DRM_INFO("Loading R400 Microcode\n"); fw_name = FIRMWARE_R420; - } else if ((rdev->family == CHIP_RS690) || - (rdev->family == CHIP_RS740)) { + break; + + case CHIP_RS690: + case CHIP_RS740: DRM_INFO("Loading RS690/RS740 Microcode\n"); fw_name = FIRMWARE_RS690; - } else if (rdev->family == CHIP_RS600) { + break; + + case CHIP_RS600: DRM_INFO("Loading RS600 Microcode\n"); fw_name = FIRMWARE_RS600; - } else if ((rdev->family == CHIP_RV515) || - (rdev->family == CHIP_R520) || - (rdev->family == CHIP_RV530) || - (rdev->family == CHIP_R580) || - (rdev->family == CHIP_RV560) || - (rdev->family == CHIP_RV570)) { + break; + + case CHIP_RV515: + case CHIP_R520: + case CHIP_RV530: + case CHIP_R580: + case CHIP_RV560: + case CHIP_RV570: DRM_INFO("Loading R500 Microcode\n"); fw_name = FIRMWARE_R520; + break; + + default: + DRM_ERROR("Unsupported Radeon family %u\n", rdev->family); + return -EINVAL; } err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); diff --git a/sys/dev/pci/drm/scheduler/sched_entity.c b/sys/dev/pci/drm/scheduler/sched_entity.c index 1d6409f54..4322a6221 100644 --- a/sys/dev/pci/drm/scheduler/sched_entity.c +++ b/sys/dev/pci/drm/scheduler/sched_entity.c @@ -111,8 +111,10 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity *entity, { WARN_ON(!num_sched_list || !sched_list); + spin_lock(&entity->rq_lock); entity->sched_list = sched_list; entity->num_sched_list = num_sched_list; + spin_unlock(&entity->rq_lock); } EXPORT_SYMBOL(drm_sched_entity_modify_sched); diff --git a/sys/dev/usb/ehci.c b/sys/dev/usb/ehci.c index 66249afb5..16c1b3028 100644 --- a/sys/dev/usb/ehci.c +++ b/sys/dev/usb/ehci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ehci.c,v 1.221 2024/10/08 19:42:31 kettenis Exp $ */ +/* $OpenBSD: ehci.c,v 1.222 2024/10/11 09:55:24 kettenis Exp $ */ /* $NetBSD: ehci.c,v 1.66 2004/06/30 03:11:56 mycroft Exp $ */ /* @@ -317,7 +317,6 @@ ehci_init(struct ehci_softc *sc) sc->sc_noport = EHCI_HCS_N_PORTS(sparams); cparams = EREAD4(sc, EHCI_HCCPARAMS); DPRINTF(("ehci_init: cparams=0x%x\n", cparams)); - sc->sc_bus.dmaflags = EHCI_HCC_64BIT(cparams) ? BUS_DMA_64BIT : 0; /* MUST clear segment register if 64 bit capable. */ if (EHCI_HCC_64BIT(cparams)) diff --git a/sys/sys/hibernate.h b/sys/sys/hibernate.h index d6c37b277..8ddf696e8 100644 --- a/sys/sys/hibernate.h +++ b/sys/sys/hibernate.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hibernate.h,v 1.46 2024/06/04 20:31:35 krw Exp $ */ +/* $OpenBSD: hibernate.h,v 1.47 2024/10/12 07:30:20 jsg Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -22,7 +22,6 @@ #include #include #include -#include #include #define HIB_PHYSSEG_MAX 22 diff --git a/usr.bin/ssh/mux.c b/usr.bin/ssh/mux.c index 80aa151f3..75f57cd51 100644 --- a/usr.bin/ssh/mux.c +++ b/usr.bin/ssh/mux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mux.c,v 1.102 2024/07/25 22:40:08 djm Exp $ */ +/* $OpenBSD: mux.c,v 1.103 2024/10/12 10:50:37 jsg Exp $ */ /* * Copyright (c) 2002-2008 Damien Miller * @@ -55,7 +55,6 @@ #include "readconf.h" #include "clientloop.h" #include "ssherr.h" -#include "misc.h" /* from ssh.c */ extern int tty_flag; diff --git a/usr.bin/tmux/cmd-source-file.c b/usr.bin/tmux/cmd-source-file.c index 83c29bf65..01e4a8a8a 100644 --- a/usr.bin/tmux/cmd-source-file.c +++ b/usr.bin/tmux/cmd-source-file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-source-file.c,v 1.54 2023/09/15 06:31:49 nicm Exp $ */ +/* $OpenBSD: cmd-source-file.c,v 1.55 2024/10/12 08:20:32 nicm Exp $ */ /* * Copyright (c) 2008 Tiago Cunha @@ -122,6 +122,14 @@ cmd_source_file_done(struct client *c, const char *path, int error, static void cmd_source_file_add(struct cmd_source_file_data *cdata, const char *path) { + char resolved[PATH_MAX]; + + if (realpath(path, resolved) == NULL) { + log_debug("%s: realpath(\"%s\") failed: %s", __func__, + path, strerror(errno)); + } else + path = resolved; + log_debug("%s: %s", __func__, path); cdata->files = xreallocarray(cdata->files, cdata->nfiles + 1, sizeof *cdata->files); diff --git a/usr.bin/tmux/paste.c b/usr.bin/tmux/paste.c index 27f61a1b2..f7993ff8a 100644 --- a/usr.bin/tmux/paste.c +++ b/usr.bin/tmux/paste.c @@ -1,4 +1,4 @@ -/* $OpenBSD: paste.c,v 1.46 2023/02/07 10:56:04 nicm Exp $ */ +/* $OpenBSD: paste.c,v 1.47 2024/10/12 08:13:52 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -241,6 +241,8 @@ paste_rename(const char *oldname, const char *newname, char **cause) } pb_new = paste_get_name(newname); + if (pb_new == pb) + return (0); if (pb_new != NULL) paste_free(pb_new); diff --git a/usr.sbin/sysupgrade/sysupgrade.8 b/usr.sbin/sysupgrade/sysupgrade.8 index b933e74a6..805432800 100644 --- a/usr.sbin/sysupgrade/sysupgrade.8 +++ b/usr.sbin/sysupgrade/sysupgrade.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sysupgrade.8,v 1.20 2024/10/07 15:57:15 jmc Exp $ +.\" $OpenBSD: sysupgrade.8,v 1.21 2024/10/11 14:12:05 deraadt Exp $ .\" .\" Copyright (c) 2019 Florian Obser .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 7 2024 $ +.Dd $Mdocdate: October 11 2024 $ .Dt SYSUPGRADE 8 .Os .Sh NAME @@ -76,10 +76,10 @@ The default is to upgrade to the next release. .El .Pp When updating to a release or snapshot which lacks the required signify -key in +keys in .Pa /etc/signify , -the missing key will be downloaded in a secure way. -In the usual case, the key will already be present because +the missing keys will be downloaded in a secure way. +In the usual case, the keys will already be present because .Ox releases ship with the current key, the next key, and a collection of older keys. diff --git a/usr.sbin/sysupgrade/sysupgrade.sh b/usr.sbin/sysupgrade/sysupgrade.sh index 10f95a015..5c4670295 100644 --- a/usr.sbin/sysupgrade/sysupgrade.sh +++ b/usr.sbin/sysupgrade/sysupgrade.sh @@ -1,6 +1,6 @@ #!/bin/ksh # -# $OpenBSD: sysupgrade.sh,v 1.55 2024/10/07 13:21:53 deraadt Exp $ +# $OpenBSD: sysupgrade.sh,v 1.56 2024/10/11 14:12:05 deraadt Exp $ # # Copyright (c) 1997-2015 Todd Miller, Theo de Raadt, Ken Westerback # Copyright (c) 2015 Robert Peichaer @@ -153,9 +153,10 @@ if ! [[ -r /etc/signify/$KEY ]]; then HAVEKEY=$(cd /etc/signify && ls -1 secbsd-*-base.pub | \ tail -2 | head -1 | cut -d- -f2) BUNDLE=sigbundle-${HAVEKEY}.tgz - echo "Adding additional key $KEY from bundle $BUNDLE" + FWKEY=$(echo $KEY | sed -e 's/base/fw/') + echo "Adding missing keys from bundle $BUNDLE" unpriv -f ${BUNDLE} ftp -N sysupgrade -Vmo $BUNDLE https://ftp.secbsd.org/pub/SecBSD/signify/$BUNDLE - signify -Vzq -m - -x $BUNDLE | (cd /etc/signify && tar xfz - $KEY) + signify -Vzq -m - -x $BUNDLE | (cd /etc/signify && tar xfz - $KEY $FWKEY) rm $BUNDLE fi