1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/mem_dbg.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* ====================================================================
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Redistribution and use in source and binary forms, with or without
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * modification, are permitted provided that the following conditions
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * are met:
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 1. Redistributions of source code must retain the above copyright
66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    notice, this list of conditions and the following disclaimer.
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    notice, this list of conditions and the following disclaimer in
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    the documentation and/or other materials provided with the
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    distribution.
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 3. All advertising materials mentioning features or use of this
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    software must display the following acknowledgment:
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    endorse or promote products derived from this software without
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    prior written permission. For written permission, please contact
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    openssl-core@openssl.org.
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL"
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    nor may "OpenSSL" appear in their names without prior written
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    permission of the OpenSSL Project.
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    acknowledgment:
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE.
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ====================================================================
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This product includes cryptographic software written by Eric Young
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * (eay@cryptsoft.com).  This product includes software written by Tim
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Hudson (tjh@cryptsoft.com).
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <time.h>
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h>
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/buffer.h>
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h>
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h>
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mh_mode=CRYPTO_MEM_CHECK_OFF;
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The state changes to CRYPTO_MEM_CHECK_ON | CRYPTO_MEM_CHECK_ENABLE
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * when the application asks for it (usually after library initialisation
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for which no book-keeping is desired).
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * State CRYPTO_MEM_CHECK_ON exists only temporarily when the library
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * thinks that certain allocations should not be checked (e.g. the data
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * structures used for memory checking).  It is not suitable as an initial
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * state: the library will unexpectedly enable memory checking when it
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * executes one of those sections that want to disable checking
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * temporarily.
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * State CRYPTO_MEM_CHECK_ENABLE without ..._ON makes no sense whatsoever.
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long order = 0; /* number of memory requests */
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_LHASH_OF(MEM);
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic LHASH_OF(MEM) *mh=NULL; /* hash-table of memory requests
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				* (address as key); access requires
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				* MALLOC2 lock */
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct app_mem_info_st
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* For application-defined information (static C-string `info')
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to be displayed in memory leak list.
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Each thread has its own stack.  For applications, there is
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   CRYPTO_push_info("...")     to push an entry,
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   CRYPTO_pop_info()           to pop an entry,
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   CRYPTO_remove_all_info()    to pop all entries.
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	CRYPTO_THREADID threadid;
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *file;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int line;
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *info;
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct app_mem_info_st *next; /* tail of thread's stack */
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int references;
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} APP_INFO;
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void app_info_free(APP_INFO *);
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_LHASH_OF(APP_INFO);
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic LHASH_OF(APP_INFO) *amih=NULL; /* hash-table with those
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       * app_mem_info_st's that are at
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       * the top of their thread's
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       * stack (with `thread' as key);
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       * access requires MALLOC2
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       * lock */
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct mem_st
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* memory-block description */
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *addr;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int num;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *file;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int line;
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	CRYPTO_THREADID threadid;
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long order;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	time_t time;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO *app_info;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} MEM;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long options =             /* extra information to be recorded */
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(CRYPTO_MDEBUG_TIME) || defined(CRYPTO_MDEBUG_ALL)
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	V_CRYPTO_MDEBUG_TIME |
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(CRYPTO_MDEBUG_THREAD) || defined(CRYPTO_MDEBUG_ALL)
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	V_CRYPTO_MDEBUG_THREAD |
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned int num_disable = 0; /* num_disable > 0
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      *     iff
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      * mh_mode == CRYPTO_MEM_CHECK_ON (w/o ..._ENABLE)
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      */
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* Valid iff num_disable > 0.  CRYPTO_LOCK_MALLOC2 is locked exactly in this
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * case (by the thread named in disabling_thread).
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic CRYPTO_THREADID disabling_threadid;
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void app_info_free(APP_INFO *inf)
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (--(inf->references) <= 0)
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (inf->next != NULL)
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			app_info_free(inf->next);
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(inf);
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint CRYPTO_mem_ctrl(int mode)
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=mh_mode;
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (mode)
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for applications (not to be called while multiple threads
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * use the library): */
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case CRYPTO_MEM_CHECK_ON: /* aka MemCheck_start() */
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mh_mode = CRYPTO_MEM_CHECK_ON|CRYPTO_MEM_CHECK_ENABLE;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num_disable = 0;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case CRYPTO_MEM_CHECK_OFF: /* aka MemCheck_stop() */
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mh_mode = 0;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num_disable = 0; /* should be true *before* MemCheck_stop is used,
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		                    or there'll be a lot of confusion */
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* switch off temporarily (for library-internal use): */
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case CRYPTO_MEM_CHECK_DISABLE: /* aka MemCheck_off() */
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (mh_mode & CRYPTO_MEM_CHECK_ON)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			CRYPTO_THREADID cur;
240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			CRYPTO_THREADID_current(&cur);
241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!num_disable || CRYPTO_THREADID_cmp(&disabling_threadid, &cur)) /* otherwise we already have the MALLOC2 lock */
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* Long-time lock CRYPTO_LOCK_MALLOC2 must not be claimed while
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * we're holding CRYPTO_LOCK_MALLOC, or we'll deadlock if
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * somebody else holds CRYPTO_LOCK_MALLOC2 (and cannot release
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * it because we block entry to this function).
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * Give them a chance, first, and then claim the locks in
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * appropriate order (long-time lock first).
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 */
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* Note that after we have waited for CRYPTO_LOCK_MALLOC2
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * and CRYPTO_LOCK_MALLOC, we'll still be in the right
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * "case" and "if" branch because MemCheck_start and
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * MemCheck_stop may never be used while there are multiple
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 * OpenSSL threads. */
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				mh_mode &= ~CRYPTO_MEM_CHECK_ENABLE;
259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				CRYPTO_THREADID_cpy(&disabling_threadid, &cur);
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num_disable++;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case CRYPTO_MEM_CHECK_ENABLE: /* aka MemCheck_on() */
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (mh_mode & CRYPTO_MEM_CHECK_ON)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (num_disable) /* always true, or something is going wrong */
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				num_disable--;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (num_disable == 0)
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint CRYPTO_is_mem_check_on(void)
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret = 0;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mh_mode & CRYPTO_MEM_CHECK_ON)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		CRYPTO_THREADID cur;
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		CRYPTO_THREADID_current(&cur);
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CRYPTO_r_lock(CRYPTO_LOCK_MALLOC);
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret = (mh_mode & CRYPTO_MEM_CHECK_ENABLE)
297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		        || CRYPTO_THREADID_cmp(&disabling_threadid, &cur);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CRYPTO_r_unlock(CRYPTO_LOCK_MALLOC);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_dbg_set_options(long bits)
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	options = bits;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong CRYPTO_dbg_get_options(void)
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return options;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int mem_cmp(const MEM *a, const MEM *b)
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef _WIN64
318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const char *ap=(const char *)a->addr,
319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		   *bp=(const char *)b->addr;
320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ap==bp)	return 0;
321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if (ap>bp)	return 1;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else		return -1;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return (const char *)a->addr - (const char *)b->addr;
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_COMP_FN(mem, MEM)
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic unsigned long mem_hash(const MEM *a)
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long ret;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret=(unsigned long)a->addr;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_HASH_FN(mem, MEM)
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int app_info_cmp(const void *a_void, const void *b_void)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return CRYPTO_THREADID_cmp(&((const APP_INFO *)a_void)->threadid,
344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				&((const APP_INFO *)b_void)->threadid);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO)
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic unsigned long app_info_hash(const APP_INFO *a)
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long ret;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = CRYPTO_THREADID_hash(&a->threadid);
353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* This is left in as a "who am I to question legacy?" measure */
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=ret*17851+(ret>>14)*7+(ret>>4)*251;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO)
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic APP_INFO *pop_info(void)
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO tmp;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO *ret = NULL;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (amih != NULL)
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		CRYPTO_THREADID_current(&tmp.threadid);
367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if ((ret=lh_APP_INFO_delete(amih,&tmp)) != NULL)
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			APP_INFO *next=ret->next;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (next != NULL)
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				next->references++;
374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(void)lh_APP_INFO_insert(amih,next);
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (CRYPTO_THREADID_cmp(&ret->threadid, &tmp.threadid))
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fprintf(stderr, "pop_info(): deleted info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					CRYPTO_THREADID_hash(&ret->threadid),
381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					CRYPTO_THREADID_hash(&tmp.threadid));
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				abort();
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--(ret->references) <= 0)
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ret->next = NULL;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (next != NULL)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					next->references--;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(ret);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint CRYPTO_push_info_(const char *info, const char *file, int line)
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO *ami, *amim;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (is_MemCheck_on())
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_off(); /* obtain MALLOC2 lock */
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((ami = (APP_INFO *)OPENSSL_malloc(sizeof(APP_INFO))) == NULL)
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret=0;
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (amih == NULL)
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if ((amih=lh_APP_INFO_new()) == NULL)
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(ami);
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ret=0;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		CRYPTO_THREADID_current(&ami->threadid);
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami->file=file;
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami->line=line;
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami->info=info;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami->references=1;
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami->next=NULL;
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if ((amim=lh_APP_INFO_insert(amih,ami)) != NULL)
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (CRYPTO_THREADID_cmp(&ami->threadid, &amim->threadid))
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fprintf(stderr, "CRYPTO_push_info(): previous info has other thread ID (%lu) than the current thread (%lu)!!!!\n",
434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					CRYPTO_THREADID_hash(&amim->threadid),
435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					CRYPTO_THREADID_hash(&ami->threadid));
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				abort();
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ami->next=amim;
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err:
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_on(); /* release MALLOC2 lock */
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint CRYPTO_pop_info(void)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (is_MemCheck_on()) /* _must_ be true, or something went severely wrong */
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_off(); /* obtain MALLOC2 lock */
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=(pop_info() != NULL);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_on(); /* release MALLOC2 lock */
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint CRYPTO_remove_all_info(void)
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (is_MemCheck_on()) /* _must_ be true */
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_off(); /* obtain MALLOC2 lock */
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while(pop_info() != NULL)
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret++;
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		MemCheck_on(); /* release MALLOC2 lock */
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long break_order_num=0;
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int before_p)
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MEM *m,*mm;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO tmp,*amim;
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch(before_p & 127)
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 0:
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 1:
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (addr == NULL)
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (is_MemCheck_on())
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_off(); /* make sure we hold MALLOC2 lock */
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((m=(MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL)
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(addr);
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				MemCheck_on(); /* release MALLOC2 lock
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				                * if num_disabled drops to 0 */
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return;
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (mh == NULL)
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				if ((mh=lh_MEM_new()) == NULL)
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					OPENSSL_free(addr);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					OPENSSL_free(m);
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					addr=NULL;
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->addr=addr;
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->file=file;
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->line=line;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->num=num;
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (options & V_CRYPTO_MDEBUG_THREAD)
521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				CRYPTO_THREADID_current(&m->threadid);
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				memset(&m->threadid, 0, sizeof(m->threadid));
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (order == break_order_num)
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* BREAK HERE */
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->order=order;
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->order=order++;
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] %c 0x%p (%d)\n",
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->order,
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(before_p & 128) ? '*' : '+',
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->addr, m->num);
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (options & V_CRYPTO_MDEBUG_TIME)
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->time=time(NULL);
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->time=0;
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			CRYPTO_THREADID_current(&tmp.threadid);
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m->app_info=NULL;
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (amih != NULL
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    && (amim=lh_APP_INFO_retrieve(amih,&tmp)) != NULL)
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				m->app_info = amim;
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				amim->references++;
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if ((mm=lh_MEM_insert(mh, m)) != NULL)
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* Not good, but don't sweat it */
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (mm->app_info != NULL)
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					mm->app_info->references--;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(mm);
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		err:
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_on(); /* release MALLOC2 lock
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			                * if num_disabled drops to 0 */
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_dbg_free(void *addr, int before_p)
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MEM m,*mp;
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch(before_p)
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 0:
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (addr == NULL)
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (is_MemCheck_on() && (mh != NULL))
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_off(); /* make sure we hold MALLOC2 lock */
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m.addr=addr;
584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			mp=lh_MEM_delete(mh,&m);
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (mp != NULL)
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] - 0x%p (%d)\n",
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				mp->order, mp->addr, mp->num);
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (mp->app_info != NULL)
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					app_info_free(mp->app_info);
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(mp);
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_on(); /* release MALLOC2 lock
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			                * if num_disabled drops to 0 */
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 1:
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_dbg_realloc(void *addr1, void *addr2, int num,
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *file, int line, int before_p)
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MEM m,*mp;
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fprintf(stderr, "LEVITTE_DEBUG_MEM: --> CRYPTO_dbg_malloc(addr1 = %p, addr2 = %p, num = %d, file = \"%s\", line = %d, before_p = %d)\n",
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		addr1, addr2, num, file, line, before_p);
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch(before_p)
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 0:
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case 1:
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (addr2 == NULL)
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (addr1 == NULL)
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CRYPTO_dbg_malloc(addr2, num, file, line, 128 | before_p);
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (is_MemCheck_on())
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_off(); /* make sure we hold MALLOC2 lock */
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			m.addr=addr1;
634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			mp=lh_MEM_delete(mh,&m);
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (mp != NULL)
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] * 0x%p (%d) -> 0x%p (%d)\n",
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					mp->order,
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					mp->addr, mp->num,
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					addr2, num);
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				mp->addr=addr2;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				mp->num=num;
645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(void)lh_MEM_insert(mh,mp);
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			MemCheck_on(); /* release MALLOC2 lock
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			                * if num_disabled drops to 0 */
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return;
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct mem_leak_st
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *bio;
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int chunks;
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long bytes;
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} MEM_LEAK;
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buf[1024];
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *bufp = buf;
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	APP_INFO *amip;
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ami_cnt;
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct tm *lcl = NULL;
671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	CRYPTO_THREADID ti;
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUF_REMAIN (sizeof buf - (size_t)(bufp - buf))
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(m->addr == (char *)l->bio)
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return;
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (options & V_CRYPTO_MDEBUG_TIME)
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lcl = localtime(&m->time);
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_snprintf(bufp, BUF_REMAIN, "[%02d:%02d:%02d] ",
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			lcl->tm_hour,lcl->tm_min,lcl->tm_sec);
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufp += strlen(bufp);
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_snprintf(bufp, BUF_REMAIN, "%5lu file=%s, line=%d, ",
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		m->order,m->file,m->line);
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bufp += strlen(bufp);
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (options & V_CRYPTO_MDEBUG_THREAD)
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		BIO_snprintf(bufp, BUF_REMAIN, "thread=%lu, ",
694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			CRYPTO_THREADID_hash(&m->threadid));
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufp += strlen(bufp);
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%08lX\n",
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		m->num,(unsigned long)m->addr);
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bufp += strlen(bufp);
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(l->bio,buf);
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l->chunks++;
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l->bytes+=m->num;
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	amip=m->app_info;
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ami_cnt=0;
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!amip)
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	CRYPTO_THREADID_cpy(&ti, &amip->threadid);
712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	do
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int buf_len;
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int info_len;
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ami_cnt++;
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset(buf,'>',ami_cnt);
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_snprintf(buf + ami_cnt, sizeof buf - ami_cnt,
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			" thread=%lu, file=%s, line=%d, info=\"",
722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			CRYPTO_THREADID_hash(&amip->threadid), amip->file,
723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			amip->line);
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf_len=strlen(buf);
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		info_len=strlen(amip->info);
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (128 - buf_len - 3 < info_len)
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(buf + buf_len, amip->info, 128 - buf_len - 3);
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf_len = 128 - 3;
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BUF_strlcpy(buf + buf_len, amip->info,
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    sizeof buf - buf_len);
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf_len = strlen(buf);
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_snprintf(buf + buf_len, sizeof buf - buf_len, "\"\n");
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_puts(l->bio,buf);
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		amip = amip->next;
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	while(amip && !CRYPTO_THREADID_cmp(&amip->threadid, &ti));
744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LEVITTE_DEBUG_MEM
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (amip)
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fprintf(stderr, "Thread switch detected in backtrace!!!!\n");
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		abort();
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
754221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_ARG_FN(print_leak, const MEM, MEM_LEAK)
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_mem_leaks(BIO *b)
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MEM_LEAK ml;
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mh == NULL && amih == NULL)
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MemCheck_off(); /* obtain MALLOC2 lock */
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ml.bio=b;
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ml.bytes=0;
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ml.chunks=0;
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mh != NULL)
769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(print_leak), MEM_LEAK,
770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 &ml);
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ml.chunks != 0)
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(b,"%ld bytes leaked in %d chunks\n",
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   ml.bytes,ml.chunks);
775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef CRYPTO_MDEBUG_ABORT
776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		abort();
777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Make sure that, if we found no leaks, memory-leak debugging itself
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * does not introduce memory leaks (which might irritate
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * external debugging tools).
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * (When someone enables leak checking, but does not call
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * this function, we declare it to be their fault.)
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 *
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * XXX    This should be in CRYPTO_mem_leaks_cb,
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * and CRYPTO_mem_leaks should be implemented by
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * using CRYPTO_mem_leaks_cb.
790221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * (Also there should be a variant of lh_doall_arg
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * that takes a function pointer instead of a void *;
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * this would obviate the ugly and illegal
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * void_fn_to_char kludge in CRYPTO_mem_leaks_cb.
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * Otherwise the code police will come and get us.)
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 */
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int old_mh_mode;
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* avoid deadlock when lh_free() uses CRYPTO_dbg_free(),
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * which uses CRYPTO_is_mem_check_on */
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		old_mh_mode = mh_mode;
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mh_mode = CRYPTO_MEM_CHECK_OFF;
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (mh != NULL)
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			lh_MEM_free(mh);
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mh = NULL;
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (amih != NULL)
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (lh_APP_INFO_num_items(amih) == 0)
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				lh_APP_INFO_free(amih);
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				amih = NULL;
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mh_mode = old_mh_mode;
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MemCheck_on(); /* release MALLOC2 lock */
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_mem_leaks_fp(FILE *fp)
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *b;
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mh == NULL) return;
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Need to turn off memory checking when allocated BIOs ... especially
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * as we're creating them at a time when we're trying to check we've not
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * left anything un-free()'d!! */
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MemCheck_off();
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b = BIO_new(BIO_s_file());
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MemCheck_on();
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!b) return;
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_set_fp(b,fp,BIO_NOCLOSE);
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_mem_leaks(b);
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(b);
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* FIXME: We really don't allow much to the callback.  For example, it has
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   no chance of reaching the info stack for the item it processes.  Should
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   it really be this way?  -- Richard Levitte */
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* NB: The prototypes have been typedef'd to CRYPTO_MEM_LEAK_CB inside crypto.h
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this code is restructured, remove the callback type if it is no longer
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * needed. -- Geoff Thorpe */
852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* Can't pass CRYPTO_MEM_LEAK_CB directly to lh_MEM_doall_arg because it
854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * is a function pointer and conversion to void * is prohibited. Instead
855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * pass its address
856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
857221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
858221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef CRYPTO_MEM_LEAK_CB *PCRYPTO_MEM_LEAK_CB;
859221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
860221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void cb_leak_doall_arg(const MEM *m, PCRYPTO_MEM_LEAK_CB *cb)
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	(*cb)(m->order,m->file,m->line,m->num,m->addr);
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
865221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_ARG_FN(cb_leak, const MEM, PCRYPTO_MEM_LEAK_CB)
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb)
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mh == NULL) return;
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_MEM_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), PCRYPTO_MEM_LEAK_CB,
872221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 &cb);
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
875