summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorotto <>2018-11-21 06:57:04 +0000
committerotto <>2018-11-21 06:57:04 +0000
commit9d3c55760e9cc7dca8b55958537265f1162dc63c (patch)
tree6410826e21b5251b799d88942013e9629d773c3d /src/lib
parent02826236d6b2d590f7d31af8a7b01f56f6ea2a6a (diff)
downloadopenbsd-9d3c55760e9cc7dca8b55958537265f1162dc63c.tar.gz
openbsd-9d3c55760e9cc7dca8b55958537265f1162dc63c.tar.bz2
openbsd-9d3c55760e9cc7dca8b55958537265f1162dc63c.zip
Introducing malloc_usable_size() was a mistake. While some other
libs have it, it is a function that is considered harmful, so: Delete malloc_usable_size(). It is a function that blurs the line between malloc managed memory and application managed memory and exposes some of the internal workings of malloc. If an application relies on that, it is likely to break using another implementation of malloc. If you want usable size x, just allocate x bytes. ok deraadt@ and other devs
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/stdlib/malloc.331
-rw-r--r--src/lib/libc/stdlib/malloc.c79
2 files changed, 5 insertions, 105 deletions
diff --git a/src/lib/libc/stdlib/malloc.3 b/src/lib/libc/stdlib/malloc.3
index c1776f61cb..c0472ee2b9 100644
--- a/src/lib/libc/stdlib/malloc.3
+++ b/src/lib/libc/stdlib/malloc.3
@@ -30,9 +30,9 @@
30.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31.\" SUCH DAMAGE. 31.\" SUCH DAMAGE.
32.\" 32.\"
33.\" $OpenBSD: malloc.3,v 1.119 2018/11/18 16:15:18 otto Exp $ 33.\" $OpenBSD: malloc.3,v 1.120 2018/11/21 06:57:04 otto Exp $
34.\" 34.\"
35.Dd $Mdocdate: November 18 2018 $ 35.Dd $Mdocdate: November 21 2018 $
36.Dt MALLOC 3 36.Dt MALLOC 3
37.Os 37.Os
38.Sh NAME 38.Sh NAME
@@ -43,8 +43,7 @@
43.Nm reallocarray , 43.Nm reallocarray ,
44.Nm recallocarray , 44.Nm recallocarray ,
45.Nm freezero , 45.Nm freezero ,
46.Nm aligned_alloc , 46.Nm aligned_alloc
47.Nm malloc_usable_size
48.Nd memory allocation and deallocation 47.Nd memory allocation and deallocation
49.Sh SYNOPSIS 48.Sh SYNOPSIS
50.In stdlib.h 49.In stdlib.h
@@ -65,7 +64,6 @@
65.Ft void * 64.Ft void *
66.Fn aligned_alloc "size_t alignment" "size_t size" 65.Fn aligned_alloc "size_t alignment" "size_t size"
67.Ft size_t 66.Ft size_t
68.Fn malloc_usable_size "void *ptr"
69.Vt char *malloc_options ; 67.Vt char *malloc_options ;
70.Sh DESCRIPTION 68.Sh DESCRIPTION
71The standard functions 69The standard functions
@@ -236,25 +234,6 @@ If
236is not a multiple of 234is not a multiple of
237.Fa alignment , 235.Fa alignment ,
238behavior is undefined. 236behavior is undefined.
239.Pp
240The
241.Fn malloc_usable_size
242function returns the actual size of the allocated memory pointed to by
243.Va ptr .
244If
245.Va ptr
246is
247.Dv NULL ,
248it returns 0.
249If
250.Va ptr
251was never returned by an allocation function or freed before,
252the behavior is undefined.
253This function should not be relied upon since it exposes some of the internal
254workings of the
255.Fn malloc
256family of functions.
257Writing beyond the requested size introduces undefined behavior.
258.Sh RETURN VALUES 237.Sh RETURN VALUES
259Upon successful completion, the allocation functions 238Upon successful completion, the allocation functions
260return a pointer to the allocated space; otherwise, 239return a pointer to the allocated space; otherwise,
@@ -640,9 +619,7 @@ function appeared in
640.Ox 6.2 . 619.Ox 6.2 .
641The 620The
642.Fn aligned_alloc 621.Fn aligned_alloc
643and 622function appeared in
644.Fn malloc_usable_size
645functions appeared in
646.Ox 6.5 . 623.Ox 6.5 .
647.Sh CAVEATS 624.Sh CAVEATS
648When using 625When using
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 513defccbc..0912b904b8 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.253 2018/11/19 22:50:24 guenther Exp $ */ 1/* $OpenBSD: malloc.c,v 1.254 2018/11/21 06:57:04 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,83 +1466,6 @@ 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}
1545
1546static void * 1469static void *
1547orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f) 1470orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f)
1548{ 1471{