fix memory leak
authorBodo Möller <bodo@openssl.org>
Mon, 25 Mar 2002 23:18:11 +0000 (23:18 +0000)
committerBodo Möller <bodo@openssl.org>
Mon, 25 Mar 2002 23:18:11 +0000 (23:18 +0000)
Submitted by: Nils Larsch

crypto/engine/enginetest.c

index 598cb31a6f60683cf6ca69a2c58d810696aaf285..87fa8c57b72ce2b4bfc056ad41ba27799d815be7 100644 (file)
@@ -79,6 +79,9 @@ static void display_engine_list()
                h = ENGINE_get_next(h);
                }
        printf("end of list\n");
+       /* ENGINE_get_first() increases the struct_ref counter, so we 
+           must call ENGINE_free() to decrease it again */
+       ENGINE_free(h);
        }
 
 int main(int argc, char *argv[])
@@ -94,6 +97,18 @@ int main(int argc, char *argv[])
        ENGINE *new_h3 = NULL;
        ENGINE *new_h4 = NULL;
 
+       /* enable memory leak checking unless explicitly disabled */
+       if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
+               {
+               CRYPTO_malloc_debug_init();
+               CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
+               }
+       else
+               {
+               /* OPENSSL_DEBUG_MEMORY=off */
+               CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
+               }
+       CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
        ERR_load_crypto_strings();
 
        memset(block, 0, 512 * sizeof(ENGINE *));
@@ -127,6 +142,8 @@ int main(int argc, char *argv[])
                printf("Remove failed!\n");
                goto end;
                }
+       if (ptr)
+               ENGINE_free(ptr);
        display_engine_list();
        if(!ENGINE_add(new_h3) || !ENGINE_add(new_h2))
                {
@@ -181,6 +198,8 @@ int main(int argc, char *argv[])
                if(!ENGINE_remove(ptr))
                        printf("Remove failed!i - probably no hardware "
                                "support present.\n");
+       if (ptr)
+               ENGINE_free(ptr);
        display_engine_list();
        if(!ENGINE_add(new_h1) || !ENGINE_remove(new_h1))
                {
@@ -226,6 +245,7 @@ cleanup_loop:
                        printf("\nRemove failed!\n");
                        goto end;
                        }
+               ENGINE_free(ptr);
                printf("."); fflush(stdout);
                }
        for(loop = 0; loop < 512; loop++)
@@ -245,5 +265,10 @@ end:
        for(loop = 0; loop < 512; loop++)
                if(block[loop])
                        ENGINE_free(block[loop]);
+       ENGINE_cleanup();
+       CRYPTO_cleanup_all_ex_data();
+       ERR_free_strings();
+       ERR_remove_state(0);
+       CRYPTO_mem_leaks_fp(stderr);
        return to_return;
        }