summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c80
1 files changed, 79 insertions, 1 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index af9cf39199..ee4d4c055e 100644
--- a/src/lib/libc/stdlib/malloc.c
+++ b/src/lib/libc/stdlib/malloc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: malloc.c,v 1.251 2018/11/06 08:01:43 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.252 2018/11/18 16:15:18 otto Exp $ */
2/* 2/*
3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> 4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org>
@@ -1466,6 +1466,84 @@ freezero(void *ptr, size_t sz)
1466} 1466}
1467DEF_WEAK(freezero); 1467DEF_WEAK(freezero);
1468 1468
1469static size_t
1470osize(struct dir_info *argpool, void *p)
1471{
1472 struct dir_info *pool;
1473 struct region_info *r;
1474 char *saved_function;
1475 size_t sz;
1476 int i;
1477
1478 pool = argpool;
1479 r = find(pool, p);
1480 if (r == NULL) {
1481 if (mopts.malloc_mt) {
1482 for (i = 0; i < _MALLOC_MUTEXES; i++) {
1483 if (i == argpool->mutex)
1484 continue;
1485 pool->active--;
1486 _MALLOC_UNLOCK(pool->mutex);
1487 pool = mopts.malloc_pool[i];
1488 _MALLOC_LOCK(pool->mutex);
1489 pool->active++;
1490 r = find(pool, p);
1491 if (r != NULL) {
1492 saved_function = pool->func;
1493 pool->func = argpool->func;
1494 break;
1495 }
1496 }
1497 }
1498 if (r == NULL)
1499 wrterror(argpool, "bogus pointer (double free?) %p", p);
1500 }
1501
1502 REALSIZE(sz, r);
1503 if (sz > MALLOC_MAXCHUNK) {
1504 if (MALLOC_MOVE_COND(sz))
1505 sz = MALLOC_PAGESIZE - ((char *)p - (char *)r->p);
1506 else
1507 sz = PAGEROUND(sz);
1508 }
1509 if (argpool != pool) {
1510 pool->active--;
1511 pool->func = saved_function;
1512 _MALLOC_UNLOCK(pool->mutex);
1513 _MALLOC_LOCK(argpool->mutex);
1514 argpool->active++;
1515 }
1516 return sz;
1517}
1518
1519size_t
1520malloc_usable_size(void *ptr)
1521{
1522 struct dir_info *d;
1523 int saved_errno = errno;
1524 size_t sz;
1525
1526 /* This is legal. */
1527 if (ptr == NULL)
1528 return 0;
1529
1530 d = getpool();
1531 if (d == NULL)
1532 wrterror(d, "malloc_usable_size() called before allocation");
1533 _MALLOC_LOCK(d->mutex);
1534 d->func = "malloc_usable_size";
1535 if (d->active++) {
1536 malloc_recurse(d);
1537 return 0;
1538 }
1539 sz = osize(d, ptr);
1540 d->active--;
1541 _MALLOC_UNLOCK(d->mutex);
1542 errno = saved_errno;
1543 return sz;
1544}
1545DEF_WEAK(malloc_usable_size);
1546
1469static void * 1547static void *
1470orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f) 1548orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f)
1471{ 1549{