gnome-keyring r1561 - in trunk: . egg
- From: nnielsen svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-keyring r1561 - in trunk: . egg
- Date: Fri, 13 Feb 2009 04:20:51 +0000 (UTC)
Author: nnielsen
Date: Fri Feb 13 04:20:51 2009
New Revision: 1561
URL: http://svn.gnome.org/viewvc/gnome-keyring?rev=1561&view=rev
Log:
Be much stricter about checking pointers and sizes being passed around.
Modified:
trunk/ChangeLog
trunk/egg/egg-secure-memory.c
Modified: trunk/egg/egg-secure-memory.c
==============================================================================
--- trunk/egg/egg-secure-memory.c (original)
+++ trunk/egg/egg-secure-memory.c Fri Feb 13 04:20:51 2009
@@ -111,8 +111,6 @@
#define C2P(c) ((char *)(c) + POFF)
#define P2C(p) ((struct cell *)((char *)(p) - POFF))
#define ISADJ(c1,c2) ((struct cell *)(C2P(c1) + (c1)->size) == (struct cell *)(c2))
-#define SREF(s,p) (ref_t)((char *)(p) - (char *)(s))
-#define SADR(s,r) (void *)((char *)(s) + (r))
#define MINCELL 32
#define HDRSIZ (ALIGN (sizeof *suba))
@@ -134,22 +132,20 @@
static inline void*
suba_addr (const struct allocator *suba, const ref_t ref)
{
- if (suba && ref > 0 && ref <= suba->size) {
- return (char *)suba + ref;
- }
- return NULL;
+ ASSERT (suba);
+ ASSERT (ref >= HDRSIZ);
+ ASSERT (ref < suba->size);
+ return (char*)suba + ref;
}
-static ref_t
+static inline ref_t
suba_ref (const struct allocator *suba, const void *ptr)
{
- if (suba && ptr) {
- ref_t ref = (char *)ptr - (char *)suba;
- if (ref > 0 && ref <= suba->size) {
- return ref;
- }
- }
- return 0;
+ ASSERT (suba);
+ ASSERT (ptr);
+ ASSERT ((char*)ptr >= (char*)suba + HDRSIZ);
+ ASSERT ((char*)ptr < (char*)suba + suba->size);
+ return (char*)ptr - (char*)suba;
}
static struct allocator *
@@ -167,7 +163,7 @@
suba->tail = HDRSIZ;
suba->size = size;
- c = suba_addr(suba, HDRSIZ);
+ c = suba_addr (suba, HDRSIZ);
c->size = size - (HDRSIZ + POFF);
c->next = suba->tail;
@@ -182,19 +178,14 @@
size = size < MINCELL ? MINCELL : ALIGN (size);
- c2 = SADR(suba, suba->tail);
+ c2 = suba_addr (suba, suba->tail);
for ( ;; ) {
c1 = c2;
- if ((c2 = suba_addr(suba, c1->next)) == NULL) {
- errno = EFAULT;
- return NULL;
- }
- if (c2->size >= size) {
+ c2 = suba_addr (suba, c1->next);
+ if (c2->size >= size)
break; /* found a cell large enough */
- }
- if (c1->next == suba->tail) {
+ if (c1->next == suba->tail)
return NULL;
- }
}
if ((c2->size - size) > MINCELL) {
@@ -206,11 +197,10 @@
} else {
c3->next = c2->next;
}
- c1->next = SREF(suba, c3);
+ c1->next = suba_ref (suba, c3);
c2->size = size;
- if (c2 == SADR(suba, suba->tail)) {
- suba->tail = SREF(suba, c3);
- }
+ if (c2 == suba_addr (suba, suba->tail))
+ suba->tail = suba_ref (suba, c3);
} else if (c1->next == suba->tail) {
/* never use the last cell! */
} else {
@@ -243,14 +233,11 @@
if (!ptr)
return;
- c1 = SADR(suba, suba->tail);
+ c1 = suba_addr (suba, suba->tail);
/* Find out what cell we're talking about */
c2 = P2C(ptr);
- if ((ref = suba_ref(suba, c2)) == 0) {
- ASSERT(0 && "invalid memory pointer passed to gkr-secure-memory");
- return;
- }
+ ref = suba_ref (suba, c2);
if (c2->magic != CELL_MAGIC) {
ASSERT(0 && "invalid memory pointer passed to gkr-secure-memory");
return;
@@ -282,29 +269,26 @@
return;
}
- while (c1->next < ref) { /* find insertion point */
- c1 = SADR(suba, c1->next);
- }
- c3 = SADR(suba, c1->next);
+ while (c1->next < ref) /* find insertion point */
+ c1 = suba_addr (suba, c1->next);
+ c3 = suba_addr (suba, c1->next);
j1 = ISADJ(c1,c2); /* c1 and c2 need to be joined */
j2 = ISADJ(c2,c3); /* c2 and c3 need to be joined */
if (j1) {
if (j2) { /* splice all three cells together */
- if (SREF(suba, c3) == suba->tail) {
- suba->tail = SREF(suba, c1);
- }
+ if (suba_ref (suba, c3) == suba->tail)
+ suba->tail = suba_ref (suba, c1);
c1->next = c3->next;
c1->size += POFF + c3->size;
}
c1->size += POFF + c2->size;
} else {
if (j2) {
- if (SREF(suba, c3) == suba->tail) {
+ if (suba_ref (suba, c3) == suba->tail)
suba->tail = ref;
- }
- c2->next = c3->next == SREF(suba, c3) ? ref : c3->next;
+ c2->next = c3->next == suba_ref (suba, c3) ? ref : c3->next;
c2->size += POFF + c3->size;
} else {
c2->next = c1->next;
@@ -342,7 +326,7 @@
static int
suba_print_cell(struct allocator *suba, const char *msg, struct cell *c)
{
- ref_t ref = suba_ref(suba, c);
+ ref_t ref = suba_ref (suba, c);
if (ref >= ALIGN(sizeof *suba) && (ref + POFF + c->size) <= 10000000) {
fprintf(stderr, "%s: %8u-%-8u %8u %-8u\n", msg,
(unsigned int)ref, (unsigned int)(ref + POFF + c->size),
@@ -364,15 +348,15 @@
int count = 0;
int ret = 1;
- c = suba_addr(suba, suba->tail);
+ c = suba_addr (suba, suba->tail);
while (c->next < suba->tail) {
- c = suba_addr(suba, c->next);
+ c = suba_addr (suba, c->next);
sprintf(buf, "%d", count++);
if (!suba_print_cell(suba, buf, c)) {
ret = 0;
}
}
- c = suba_addr(suba, c->next);
+ c = suba_addr (suba, c->next);
sprintf(buf, "%d", count++);
if (!suba_print_cell(suba, buf, c)) {
ret = 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]