- MemCheck_on(); /* release MALLOC2 lock */
- }
-
- return(ret);
- }
-
-int CRYPTO_pop_info(void)
- {
- int ret=0;
-
- if (is_MemCheck_on()) /* _must_ be true, or something went severely wrong */
- {
- MemCheck_off(); /* obtain MALLOC2 lock */
-
- ret=(pop_info() != NULL);
-
- MemCheck_on(); /* release MALLOC2 lock */
- }
- return(ret);
- }
-
-int CRYPTO_remove_all_info(void)
- {
- int ret=0;
-
- if (is_MemCheck_on()) /* _must_ be true */
- {
- MemCheck_off(); /* obtain MALLOC2 lock */
-
- while(pop_info() != NULL)
- ret++;
-
- MemCheck_on(); /* release MALLOC2 lock */
- }
- return(ret);
- }
-
-
-static unsigned long break_order_num=0;
-void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line,
- int before_p)
- {
- MEM *m,*mm;
- APP_INFO tmp,*amim;
-
- switch(before_p & 127)
- {
- case 0:
- break;
- case 1:
- if (addr == NULL)
- break;
-
- if (is_MemCheck_on())
- {
- MemCheck_off(); /* make sure we hold MALLOC2 lock */
- if ((m=(MEM *)OPENSSL_malloc(sizeof(MEM))) == NULL)
- {
- OPENSSL_free(addr);
- MemCheck_on(); /* release MALLOC2 lock
- * if num_disabled drops to 0 */
- return;
- }
- if (mh == NULL)
- {
- if ((mh=lh_MEM_new()) == NULL)
- {
- OPENSSL_free(addr);
- OPENSSL_free(m);
- addr=NULL;
- goto err;
- }
- }
-
- m->addr=addr;
- m->file=file;
- m->line=line;
- m->num=num;
- if (options & V_CRYPTO_MDEBUG_THREAD)
- {
- m->thread_id=CRYPTO_thread_id();
- m->thread_idptr=CRYPTO_thread_idptr();
- }
- else
- {
- m->thread_id=0;
- m->thread_idptr=NULL;
- }
-
- if (order == break_order_num)
- {
- /* BREAK HERE */
- m->order=order;
- }
- m->order=order++;
-#ifdef LEVITTE_DEBUG_MEM
- fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] %c 0x%p (%d)\n",
- m->order,
- (before_p & 128) ? '*' : '+',
- m->addr, m->num);
-#endif
- if (options & V_CRYPTO_MDEBUG_TIME)
- m->time=time(NULL);
- else
- m->time=0;
-
- tmp.thread_id=CRYPTO_thread_id();
- tmp.thread_idptr=CRYPTO_thread_idptr();
- m->app_info=NULL;
- if (amih != NULL
- && (amim=lh_APP_INFO_retrieve(amih,&tmp)) != NULL)
- {
- m->app_info = amim;
- amim->references++;
- }
-
- if ((mm=lh_MEM_insert(mh, m)) != NULL)
- {
- /* Not good, but don't sweat it */
- if (mm->app_info != NULL)
- {
- mm->app_info->references--;
- }
- OPENSSL_free(mm);
- }
- err:
- MemCheck_on(); /* release MALLOC2 lock
- * if num_disabled drops to 0 */
- }
- break;
- }
- return;
- }
-
-void CRYPTO_dbg_free(void *addr, int before_p)
- {
- MEM m,*mp;
-
- switch(before_p)
- {
- case 0:
- if (addr == NULL)
- break;
-
- if (is_MemCheck_on() && (mh != NULL))
- {
- MemCheck_off(); /* make sure we hold MALLOC2 lock */
-
- m.addr=addr;
- mp=lh_MEM_delete(mh,&m);
- if (mp != NULL)
- {
-#ifdef LEVITTE_DEBUG_MEM
- fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] - 0x%p (%d)\n",
- mp->order, mp->addr, mp->num);
-#endif
- if (mp->app_info != NULL)
- app_info_free(mp->app_info);
- OPENSSL_free(mp);
- }
-
- MemCheck_on(); /* release MALLOC2 lock
- * if num_disabled drops to 0 */
- }
- break;
- case 1:
- break;
- }
- }
-
-void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num,
- const char *file, int line, int before_p)
- {
- MEM m,*mp;
-
-#ifdef LEVITTE_DEBUG_MEM
- fprintf(stderr, "LEVITTE_DEBUG_MEM: --> CRYPTO_dbg_malloc(addr1 = %p, addr2 = %p, num = %d, file = \"%s\", line = %d, before_p = %d)\n",
- addr1, addr2, num, file, line, before_p);
-#endif
-
- switch(before_p)
- {
- case 0:
- break;
- case 1:
- if (addr2 == NULL)
- break;
-
- if (addr1 == NULL)
- {
- CRYPTO_dbg_malloc(addr2, num, file, line, 128 | before_p);
- break;
- }
-
- if (is_MemCheck_on())
- {
- MemCheck_off(); /* make sure we hold MALLOC2 lock */
-
- m.addr=addr1;
- mp=lh_MEM_delete(mh,&m);
- if (mp != NULL)
- {
-#ifdef LEVITTE_DEBUG_MEM
- fprintf(stderr, "LEVITTE_DEBUG_MEM: [%5ld] * 0x%p (%d) -> 0x%p (%d)\n",
- mp->order,
- mp->addr, mp->num,
- addr2, num);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+
+ return (ret);
+}
+
+int CRYPTO_mem_debug_pop(void)
+{
+ int ret = 0;
+
+ if (mem_check_on()) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ ret = pop_info();
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+ return (ret);
+}
+
+static unsigned long break_order_num = 0;
+
+void CRYPTO_mem_debug_malloc(void *addr, size_t num, int before_p,
+ const char *file, int line)
+{
+ MEM *m, *mm;
+ APP_INFO tmp, *amim;
+
+ switch (before_p & 127) {
+ case 0:
+ break;
+ case 1:
+ if (addr == NULL)
+ break;
+
+ if (mem_check_on()) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ if ((m = OPENSSL_malloc(sizeof(*m))) == NULL) {
+ OPENSSL_free(addr);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ return;
+ }
+ if (mh == NULL) {
+ if ((mh = lh_MEM_new(mem_hash, mem_cmp)) == NULL) {
+ OPENSSL_free(addr);
+ OPENSSL_free(m);
+ addr = NULL;
+ goto err;
+ }
+ }
+
+ m->addr = addr;
+ m->file = file;
+ m->line = line;
+ m->num = num;
+ CRYPTO_THREADID_current(&m->threadid);
+
+ if (order == break_order_num) {
+ /* BREAK HERE */
+ m->order = order;
+ }
+ m->order = order++;
+# if defined(CRYPTO_MDEBUG_BACKTRACE) && defined(__GNUC__)
+ m->array_siz = backtrace(m->array, OSSL_NELEM(m->array));
+# endif
+ m->time = time(NULL);
+
+ CRYPTO_THREADID_current(&tmp.threadid);
+ m->app_info = NULL;
+ if (amih != NULL
+ && (amim = lh_APP_INFO_retrieve(amih, &tmp)) != NULL) {
+ m->app_info = amim;
+ amim->references++;
+ }
+
+ if ((mm = lh_MEM_insert(mh, m)) != NULL) {
+ /* Not good, but don't sweat it */
+ if (mm->app_info != NULL) {
+ mm->app_info->references--;
+ }
+ OPENSSL_free(mm);
+ }
+ err:
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+ break;
+ }
+ return;
+}
+
+void CRYPTO_mem_debug_free(void *addr, int before_p)
+{
+ MEM m, *mp;
+
+ switch (before_p) {
+ case 0:
+ if (addr == NULL)
+ break;
+
+ if (mem_check_on() && (mh != NULL)) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+
+ m.addr = addr;
+ mp = lh_MEM_delete(mh, &m);
+ if (mp != NULL) {
+ app_info_free(mp->app_info);
+ OPENSSL_free(mp);
+ }
+
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+ break;
+ case 1:
+ break;
+ }
+}
+
+void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, size_t num,
+ int before_p, const char *file, int line)
+{
+ MEM m, *mp;
+
+ switch (before_p) {
+ case 0:
+ break;
+ case 1:
+ if (addr2 == NULL)
+ break;
+
+ if (addr1 == NULL) {
+ CRYPTO_mem_debug_malloc(addr2, num, 128 | before_p, file, line);
+ break;
+ }
+
+ if (mem_check_on()) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+
+ m.addr = addr1;
+ mp = lh_MEM_delete(mh, &m);
+ if (mp != NULL) {
+ mp->addr = addr2;
+ mp->num = num;
+#if defined(CRYPTO_MDEBUG_BACKTRACE) && defined(__GNUC__)
+ mp->array_siz = backtrace(mp->array, OSSL_NELEM(mp->array));