summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
authordjm <>2008-12-30 07:44:51 +0000
committerdjm <>2008-12-30 07:44:51 +0000
commit611f21aa60c60f91295ec5451b469b73684b666a (patch)
tree2e9b38b54fe87b89b1a0258d12507c5b5e197c7e /src/lib/libc/stdlib/malloc.c
parentc2f9a0271169166b38060ef5e36ef203765e45dd (diff)
downloadopenbsd-611f21aa60c60f91295ec5451b469b73684b666a.tar.gz
openbsd-611f21aa60c60f91295ec5451b469b73684b666a.tar.bz2
openbsd-611f21aa60c60f91295ec5451b469b73684b666a.zip
Remove mprotecting of struct dir_info introduced in previous commit
(MALLOC_OPTIONS=L). It was too slow to turn on by default, and we don't do optional security. requested by deraadt@ grumbling ok otto@
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c39
1 files changed, 2 insertions, 37 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index e15a64ac72..3d2e3dd29a 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.112 2008/12/29 22:25:50 djm Exp $ */ 1/* $OpenBSD: malloc.c,v 1.113 2008/12/30 07:44:51 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
4 * 4 *
@@ -88,23 +88,6 @@
88#define MMAPA(a,sz) mmap((a), (size_t)(sz), PROT_READ | PROT_WRITE, \ 88#define MMAPA(a,sz) mmap((a), (size_t)(sz), PROT_READ | PROT_WRITE, \
89 MAP_ANON | MAP_PRIVATE, -1, (off_t) 0) 89 MAP_ANON | MAP_PRIVATE, -1, (off_t) 0)
90 90
91/* Protect and unprotect g_pool structure as we enter/exit the allocator */
92#define DIR_INFO_RSZ ((sizeof(struct dir_info) + PAGE_MASK) & ~PAGE_MASK)
93#define PROTECT_G_POOL() \
94 do { \
95 if (g_pool != NULL && mopts.malloc_poolprot) { \
96 mprotect((void *)((uintptr_t)g_pool & ~PAGE_MASK), \
97 DIR_INFO_RSZ, PROT_NONE); \
98 } \
99 } while (0)
100#define UNPROTECT_G_POOL() \
101 do { \
102 if (g_pool != NULL && mopts.malloc_poolprot) { \
103 mprotect((void *)((uintptr_t)g_pool & ~PAGE_MASK), \
104 DIR_INFO_RSZ, PROT_READ | PROT_WRITE); \
105 } \
106 } while (0)
107
108struct region_info { 91struct region_info {
109 void *p; /* page; low bits used to mark chunks */ 92 void *p; /* page; low bits used to mark chunks */
110 uintptr_t size; /* size for pages, or chunk_info pointer */ 93 uintptr_t size; /* size for pages, or chunk_info pointer */
@@ -142,7 +125,7 @@ struct dir_info {
142#endif /* MALLOC_STATS */ 125#endif /* MALLOC_STATS */
143 u_int32_t canary2; 126 u_int32_t canary2;
144}; 127};
145 128#define DIR_INFO_RSZ ((sizeof(struct dir_info) + PAGE_MASK) & ~PAGE_MASK)
146 129
147/* 130/*
148 * This structure describes a page worth of chunks. 131 * This structure describes a page worth of chunks.
@@ -165,7 +148,6 @@ struct chunk_info {
165struct malloc_readonly { 148struct malloc_readonly {
166 struct dir_info *g_pool; /* Main bookkeeping information */ 149 struct dir_info *g_pool; /* Main bookkeeping information */
167 int malloc_abort; /* abort() on error */ 150 int malloc_abort; /* abort() on error */
168 int malloc_poolprot; /* mprotect heap PROT_NONE? */
169 int malloc_freeprot; /* mprotect free pages PROT_NONE? */ 151 int malloc_freeprot; /* mprotect free pages PROT_NONE? */
170 int malloc_hint; /* call madvice on free pages? */ 152 int malloc_hint; /* call madvice on free pages? */
171 int malloc_junk; /* junk fill? */ 153 int malloc_junk; /* junk fill? */
@@ -653,12 +635,6 @@ omalloc_init(struct dir_info **dp)
653 case 'J': 635 case 'J':
654 mopts.malloc_junk = 1; 636 mopts.malloc_junk = 1;
655 break; 637 break;
656 case 'l':
657 mopts.malloc_poolprot = 0;
658 break;
659 case 'L':
660 mopts.malloc_poolprot = 1;
661 break;
662 case 'n': 638 case 'n':
663 case 'N': 639 case 'N':
664 break; 640 break;
@@ -1214,7 +1190,6 @@ malloc_recurse(void)
1214 wrterror("recursive call"); 1190 wrterror("recursive call");
1215 } 1191 }
1216 malloc_active--; 1192 malloc_active--;
1217 PROTECT_G_POOL();
1218 _MALLOC_UNLOCK(); 1193 _MALLOC_UNLOCK();
1219 errno = EDEADLK; 1194 errno = EDEADLK;
1220} 1195}
@@ -1223,7 +1198,6 @@ static void
1223malloc_global_corrupt(void) 1198malloc_global_corrupt(void)
1224{ 1199{
1225 wrterror("global malloc data corrupt"); 1200 wrterror("global malloc data corrupt");
1226 PROTECT_G_POOL();
1227 _MALLOC_UNLOCK(); 1201 _MALLOC_UNLOCK();
1228 errno = EINVAL; 1202 errno = EINVAL;
1229} 1203}
@@ -1248,7 +1222,6 @@ malloc(size_t size)
1248 int saved_errno = errno; 1222 int saved_errno = errno;
1249 1223
1250 _MALLOC_LOCK(); 1224 _MALLOC_LOCK();
1251 UNPROTECT_G_POOL();
1252 malloc_func = " in malloc():"; 1225 malloc_func = " in malloc():";
1253 if (g_pool == NULL) { 1226 if (g_pool == NULL) {
1254 if (malloc_init() != 0) 1227 if (malloc_init() != 0)
@@ -1260,7 +1233,6 @@ malloc(size_t size)
1260 } 1233 }
1261 r = omalloc(size, mopts.malloc_zero); 1234 r = omalloc(size, mopts.malloc_zero);
1262 malloc_active--; 1235 malloc_active--;
1263 PROTECT_G_POOL();
1264 _MALLOC_UNLOCK(); 1236 _MALLOC_UNLOCK();
1265 if (r == NULL && mopts.malloc_xmalloc) { 1237 if (r == NULL && mopts.malloc_xmalloc) {
1266 wrterror("out of memory"); 1238 wrterror("out of memory");
@@ -1349,7 +1321,6 @@ free(void *ptr)
1349 return; 1321 return;
1350 1322
1351 _MALLOC_LOCK(); 1323 _MALLOC_LOCK();
1352 UNPROTECT_G_POOL();
1353 malloc_func = " in free():"; 1324 malloc_func = " in free():";
1354 if (g_pool == NULL) { 1325 if (g_pool == NULL) {
1355 _MALLOC_UNLOCK(); 1326 _MALLOC_UNLOCK();
@@ -1362,7 +1333,6 @@ free(void *ptr)
1362 } 1333 }
1363 ofree(ptr); 1334 ofree(ptr);
1364 malloc_active--; 1335 malloc_active--;
1365 PROTECT_G_POOL();
1366 _MALLOC_UNLOCK(); 1336 _MALLOC_UNLOCK();
1367 errno = saved_errno; 1337 errno = saved_errno;
1368} 1338}
@@ -1466,7 +1436,6 @@ realloc(void *ptr, size_t size)
1466 int saved_errno = errno; 1436 int saved_errno = errno;
1467 1437
1468 _MALLOC_LOCK(); 1438 _MALLOC_LOCK();
1469 UNPROTECT_G_POOL();
1470 malloc_func = " in realloc():"; 1439 malloc_func = " in realloc():";
1471 if (g_pool == NULL) { 1440 if (g_pool == NULL) {
1472 if (malloc_init() != 0) 1441 if (malloc_init() != 0)
@@ -1479,7 +1448,6 @@ realloc(void *ptr, size_t size)
1479 r = orealloc(ptr, size); 1448 r = orealloc(ptr, size);
1480 1449
1481 malloc_active--; 1450 malloc_active--;
1482 PROTECT_G_POOL();
1483 _MALLOC_UNLOCK(); 1451 _MALLOC_UNLOCK();
1484 if (r == NULL && mopts.malloc_xmalloc) { 1452 if (r == NULL && mopts.malloc_xmalloc) {
1485 wrterror("out of memory"); 1453 wrterror("out of memory");
@@ -1500,7 +1468,6 @@ calloc(size_t nmemb, size_t size)
1500 int saved_errno = errno; 1468 int saved_errno = errno;
1501 1469
1502 _MALLOC_LOCK(); 1470 _MALLOC_LOCK();
1503 UNPROTECT_G_POOL();
1504 malloc_func = " in calloc():"; 1471 malloc_func = " in calloc():";
1505 if (g_pool == NULL) { 1472 if (g_pool == NULL) {
1506 if (malloc_init() != 0) 1473 if (malloc_init() != 0)
@@ -1508,7 +1475,6 @@ calloc(size_t nmemb, size_t size)
1508 } 1475 }
1509 if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && 1476 if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
1510 nmemb > 0 && SIZE_MAX / nmemb < size) { 1477 nmemb > 0 && SIZE_MAX / nmemb < size) {
1511 PROTECT_G_POOL();
1512 _MALLOC_UNLOCK(); 1478 _MALLOC_UNLOCK();
1513 if (mopts.malloc_xmalloc) 1479 if (mopts.malloc_xmalloc)
1514 wrterror("out of memory"); 1480 wrterror("out of memory");
@@ -1525,7 +1491,6 @@ calloc(size_t nmemb, size_t size)
1525 r = omalloc(size, 1); 1491 r = omalloc(size, 1);
1526 1492
1527 malloc_active--; 1493 malloc_active--;
1528 PROTECT_G_POOL();
1529 _MALLOC_UNLOCK(); 1494 _MALLOC_UNLOCK();
1530 if (r == NULL && mopts.malloc_xmalloc) { 1495 if (r == NULL && mopts.malloc_xmalloc) {
1531 wrterror("out of memory"); 1496 wrterror("out of memory");