Raise an error on syscall failure in tls_retry_write_records
[openssl.git] / engines / e_afalg.c
index d8d3ef610ca02217795c1878aa0cc16fb7be8f60..3ca5b0211e7b6c703bcd733aee08618a9dd808a3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved.
  *
  * Licensed under the Apache License 2.0 (the "License").  You may not use
  * this file except in compliance with the License.  You can obtain a copy
@@ -355,6 +355,18 @@ static int afalg_fin_cipher_aio(afalg_aio *aio, int sfd, unsigned char *buf,
                         }
                         continue;
                     } else {
+                        char strbuf[32];
+                        /*
+                         * sometimes __s64 is defined as long long int
+                         * but on some archs ( like mips64 or powerpc64 ) it's just long int
+                         *
+                         * to be able to use BIO_snprintf() with %lld without warnings
+                         * copy events[0].res to an long long int variable
+                         *
+                         * because long long int should always be at least 64 bit this should work
+                         */
+                        long long int op_ret = events[0].res;
+
                         /*
                          * Retries exceed for -EBUSY or unrecoverable error
                          * condition for this instance of operation.
@@ -362,6 +374,17 @@ static int afalg_fin_cipher_aio(afalg_aio *aio, int sfd, unsigned char *buf,
                         ALG_WARN
                             ("%s(%d): Crypto Operation failed with code %lld\n",
                              __FILE__, __LINE__, events[0].res);
+                        BIO_snprintf(strbuf, sizeof(strbuf), "%lld", op_ret);
+                        switch (events[0].res) {
+                        case -ENOMEM:
+                            AFALGerr(0, AFALG_R_KERNEL_OP_FAILED);
+                            ERR_add_error_data(3, "-ENOMEM ( code ", strbuf, " )");
+                            break;
+                        default:
+                            AFALGerr(0, AFALG_R_KERNEL_OP_FAILED);
+                            ERR_add_error_data(2, "code ", strbuf);
+                            break;
+                        }
                         return 0;
                     }
                 }
@@ -683,11 +706,8 @@ static int afalg_cipher_cleanup(EVP_CIPHER_CTX *ctx)
     }
 
     actx = (afalg_ctx *) EVP_CIPHER_CTX_get_cipher_data(ctx);
-    if (actx == NULL || actx->init_done != MAGIC_INIT_NUM) {
-        ALG_WARN("%s afalg ctx passed\n",
-                 ctx == NULL ? "NULL" : "Uninitialised");
-        return 0;
-    }
+    if (actx == NULL || actx->init_done != MAGIC_INIT_NUM)
+        return 1;
 
     close(actx->sfd);
     close(actx->bfd);
@@ -790,7 +810,7 @@ static int bind_afalg(ENGINE *e)
      * now, as bind_aflag can only be called by one thread at a
      * time.
      */
-    for(i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
+    for (i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
         if (afalg_aes_cbc(afalg_cipher_nids[i]) == NULL) {
             AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED);
             return 0;
@@ -814,8 +834,10 @@ static int bind_helper(ENGINE *e, const char *id)
     if (!afalg_chk_platform())
         return 0;
 
-    if (!bind_afalg(e))
+    if (!bind_afalg(e)) {
+        afalg_destroy(e);
         return 0;
+    }
     return 1;
 }
 
@@ -919,7 +941,7 @@ static int afalg_finish(ENGINE *e)
 static int free_cbc(void)
 {
     short unsigned int i;
-    for(i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
+    for (i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
         EVP_CIPHER_meth_free(cbc_handle[i]._hidden);
         cbc_handle[i]._hidden = NULL;
     }