diff options
author | otto <> | 2018-11-21 06:57:04 +0000 |
---|---|---|
committer | otto <> | 2018-11-21 06:57:04 +0000 |
commit | 9d3c55760e9cc7dca8b55958537265f1162dc63c (patch) | |
tree | 6410826e21b5251b799d88942013e9629d773c3d /src/lib | |
parent | 02826236d6b2d590f7d31af8a7b01f56f6ea2a6a (diff) | |
download | openbsd-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.3 | 31 | ||||
-rw-r--r-- | src/lib/libc/stdlib/malloc.c | 79 |
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 |
71 | The standard functions | 69 | The standard functions |
@@ -236,25 +234,6 @@ If | |||
236 | is not a multiple of | 234 | is not a multiple of |
237 | .Fa alignment , | 235 | .Fa alignment , |
238 | behavior is undefined. | 236 | behavior is undefined. |
239 | .Pp | ||
240 | The | ||
241 | .Fn malloc_usable_size | ||
242 | function returns the actual size of the allocated memory pointed to by | ||
243 | .Va ptr . | ||
244 | If | ||
245 | .Va ptr | ||
246 | is | ||
247 | .Dv NULL , | ||
248 | it returns 0. | ||
249 | If | ||
250 | .Va ptr | ||
251 | was never returned by an allocation function or freed before, | ||
252 | the behavior is undefined. | ||
253 | This function should not be relied upon since it exposes some of the internal | ||
254 | workings of the | ||
255 | .Fn malloc | ||
256 | family of functions. | ||
257 | Writing beyond the requested size introduces undefined behavior. | ||
258 | .Sh RETURN VALUES | 237 | .Sh RETURN VALUES |
259 | Upon successful completion, the allocation functions | 238 | Upon successful completion, the allocation functions |
260 | return a pointer to the allocated space; otherwise, | 239 | return a pointer to the allocated space; otherwise, |
@@ -640,9 +619,7 @@ function appeared in | |||
640 | .Ox 6.2 . | 619 | .Ox 6.2 . |
641 | The | 620 | The |
642 | .Fn aligned_alloc | 621 | .Fn aligned_alloc |
643 | and | 622 | function appeared in |
644 | .Fn malloc_usable_size | ||
645 | functions appeared in | ||
646 | .Ox 6.5 . | 623 | .Ox 6.5 . |
647 | .Sh CAVEATS | 624 | .Sh CAVEATS |
648 | When using | 625 | When 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 | } |
1467 | DEF_WEAK(freezero); | 1467 | DEF_WEAK(freezero); |
1468 | 1468 | ||
1469 | static size_t | ||
1470 | osize(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 | |||
1519 | size_t | ||
1520 | malloc_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 | |||
1546 | static void * | 1469 | static void * |
1547 | orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f) | 1470 | orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f) |
1548 | { | 1471 | { |