diff options
Diffstat (limited to 'src/lib/libc/stdlib')
| -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 | { |
