Update of /cvsroot/monetdb/MonetDB/src/gdk
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv15215/src/gdk
Modified Files:
gdk.mx gdk_align.mx gdk_atoms.mx gdk_bat.mx gdk_batop.mx
gdk_bbp.mx gdk_desc.mx gdk_heap.mx gdk_logger.mx gdk_relop.mx
gdk_search.mx gdk_setop.mx gdk_storage.mx gdk_value.mx
Log Message:
making klocwork happier..
klocwork is a kind of improved lint, ie. 'static c program analyses'
To find memory problems, out of bounds access, security problems etc
(first round was about 700 errors, now down to 295 (of which the larger part
are false possitives)
Index: gdk_logger.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_logger.mx,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- gdk_logger.mx 11 Jan 2008 10:37:00 -0000 1.13
+++ gdk_logger.mx 1 Feb 2008 12:21:37 -0000 1.14
@@ -190,7 +190,7 @@
#define LOGFILE "log"
static int bm_commit(logger *lg);
-static void tr_grow(trans *tr);
+static int tr_grow(trans *tr);
static void
logbat_destroy(BAT *b)
@@ -204,9 +204,11 @@
{
BAT *nb = BATnew(ht, tt, size);
- if (ht == TYPE_void)
- BATseqbase(nb, 0);
- nb->batDirty |= 2;
+ if (nb) {
+ if (ht == TYPE_void)
+ BATseqbase(nb, 0);
+ nb->batDirty |= 2;
+ }
return nb;
}
@@ -274,10 +276,11 @@
if (lg->debug & 1)
fprintf(stderr, "logger found log_read_clear %s\n", name);
- tr_grow(tr);
- tr->changes[tr->nr].type = LOG_CLEAR;
- tr->changes[tr->nr].name = GDKstrdup(name);
- tr->nr++;
+ if (tr_grow(tr)) {
+ tr->changes[tr->nr].type = LOG_CLEAR;
+ tr->changes[tr->nr].name = GDKstrdup(name);
+ tr->nr++;
+ }
}
static void
@@ -411,14 +414,15 @@
GDKfree(tv);
logbat_destroy(b);
- tr_grow(tr);
- tr->changes[tr->nr].type = l->flag;
- tr->changes[tr->nr].nr = l->nr;
- tr->changes[tr->nr].ht = ht;
- tr->changes[tr->nr].tt = tt;
- tr->changes[tr->nr].name = GDKstrdup(name);
- tr->changes[tr->nr].b = r;
- tr->nr++;
+ if (tr_grow(tr)) {
+ tr->changes[tr->nr].type = l->flag;
+ tr->changes[tr->nr].nr = l->nr;
+ tr->changes[tr->nr].ht = ht;
+ tr->changes[tr->nr].tt = tt;
+ tr->changes[tr->nr].name = GDKstrdup(name);
+ tr->changes[tr->nr].b = r;
+ tr->nr++;
+ }
} else { /* bat missing ERROR or ignore ? currently
error. */
res = LOG_ERR;
}
@@ -495,10 +499,11 @@
log_read_destroy(logger *lg, trans *tr, char *name)
{
(void) lg;
- tr_grow(tr);
- tr->changes[tr->nr].type = LOG_DESTROY;
- tr->changes[tr->nr].name = GDKstrdup(name);
- tr->nr++;
+ if (tr_grow(tr)) {
+ tr->changes[tr->nr].type = LOG_DESTROY;
+ tr->changes[tr->nr].name = GDKstrdup(name);
+ tr->nr++;
+ }
}
static void
@@ -538,13 +543,14 @@
} else {
tt = ATOMindex(ta);
}
- tr_grow(tr);
- tr->changes[tr->nr].type = LOG_CREATE;
- tr->changes[tr->nr].ht = ht;
- tr->changes[tr->nr].tt = tt;
- tr->changes[tr->nr].name = GDKstrdup(name);
- tr->changes[tr->nr].b = NULL;
- tr->nr++;
+ if (tr_grow(tr)) {
+ tr->changes[tr->nr].type = LOG_CREATE;
+ tr->changes[tr->nr].ht = ht;
+ tr->changes[tr->nr].tt = tt;
+ tr->changes[tr->nr].name = GDKstrdup(name);
+ tr->changes[tr->nr].b = NULL;
+ tr->nr++;
+ }
}
if (buf)
GDKfree(buf);
@@ -558,25 +564,28 @@
int tt = (la->tt < 0) ? TYPE_void : la->tt;
BAT *b = BATnew(ht, tt, BATSIZE);
- if (la->ht < 0)
- BATseqbase(b, 0);
- if (la->tt < 0)
- BATseqbase(BATmirror(b), 0);
-
- logger_add_bat(lg, b, la->name);
- logbat_destroy(b);
+ if (b != NULL) {
+ if (la->ht < 0)
+ BATseqbase(b, 0);
+ if (la->tt < 0)
+ BATseqbase(BATmirror(b), 0);
+
+ logger_add_bat(lg, b, la->name);
+ logbat_destroy(b);
+ }
}
static void
log_read_use(logger *lg, trans *tr, logformat *l, char *name)
{
(void) lg;
- tr_grow(tr);
- tr->changes[tr->nr].type = LOG_USE;
- tr->changes[tr->nr].nr = l->nr;
- tr->changes[tr->nr].name = GDKstrdup(name);
- tr->changes[tr->nr].b = NULL;
- tr->nr++;
+ if (tr_grow(tr)) {
+ tr->changes[tr->nr].type = LOG_USE;
+ tr->changes[tr->nr].nr = l->nr;
+ tr->changes[tr->nr].name = GDKstrdup(name);
+ tr->changes[tr->nr].b = NULL;
+ tr->nr++;
+ }
}
static void
@@ -601,10 +610,16 @@
{
trans *ntr = (trans *) GDKmalloc(sizeof(trans));
+ if (ntr == NULL)
+ return NULL;
ntr->tid = tid;
ntr->sz = TR_SIZE;
ntr->nr = 0;
ntr->changes = (logaction *) GDKmalloc(sizeof(logaction) * TR_SIZE);
+ if (ntr->changes == NULL) {
+ GDKfree(ntr);
+ return NULL;
+ }
ntr->tr = tr;
return ntr;
}
@@ -662,16 +677,19 @@
logbat_destroy(c->b);
}
-static void
+static int
tr_grow(trans *tr)
{
if (tr->nr == tr->sz) {
tr->sz <<= 1;
tr->changes = (logaction *) GDKrealloc(tr->changes, tr->sz *
sizeof(logaction));
+ if (tr->changes == NULL)
+ return 0;
}
/* cleanup the next */
tr->changes[tr->nr].name = NULL;
tr->changes[tr->nr].b = NULL;
+ return 1;
}
static trans *
@@ -938,6 +956,8 @@
snprintf(bak, BUFSIZ, "%s_catalog", fn);
catalog = BBPindex(bak);
+ if (lg == NULL)
+ return NULL;
lg->debug = debug;
lg->changes = 0;
@@ -1105,6 +1125,7 @@
logbat_destroy(lg->catalog);
logbat_destroy(lg->freed);
}
+ GDKfree(lg->fn);
GDKfree(lg->dir);
logger_close(lg);
GDKfree(lg);
@@ -1515,6 +1536,8 @@
/* sub commit all new snapshots */
BAT *b = BATselect(lg->snapshots, &lg->tid, &lg->tid);
+ if (b == NULL)
+ return LOG_ERR;
res = bm_subcommit(b, lg->snapshots, lg->debug);
BBPunfix(b->batCacheid);
}
Index: gdk.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk.mx,v
retrieving revision 1.247
retrieving revision 1.248
diff -u -d -r1.247 -r1.248
--- gdk.mx 11 Jan 2008 10:36:59 -0000 1.247
+++ gdk.mx 1 Feb 2008 12:21:32 -0000 1.248
@@ -2544,7 +2544,9 @@
static INLINE BAT *
BATmirror(REGISTER BAT *b)
{
- return BBP_cache(-(b)->batCacheid);
+ if (b == NULL)
+ return NULL;
+ return BBP_cache(-b->batCacheid);
}
#ifdef __cplusplus
Index: gdk_atoms.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_atoms.mx,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -d -r1.138 -r1.139
--- gdk_atoms.mx 11 Jan 2008 10:36:59 -0000 1.138
+++ gdk_atoms.mx 1 Feb 2008 12:21:34 -0000 1.139
@@ -1060,7 +1060,10 @@
return l;
}
- strcpy(*buf = GDKmalloc(4), "nil");
+ *buf = GDKmalloc(4);
+ if (*buf == NULL)
+ return -1;
+ strcpy(*buf, "nil");
return 3;
}
@@ -1093,6 +1096,8 @@
GDKfree(*dst);
*dst = (@1 *) GDKmalloc(*len = @2);
}
+ if (!*dst)
+ return -1;
@= atomtostr
int
@1ToStr(char ** dst, int *len, @1 *src)
@@ -1460,7 +1465,7 @@
{
char *s, *t, *r = src;
int c, sign = 1;
- bat bid;
+ bat bid = 0;
@:atommem(bat,sizeof(bat))@
@@ -1476,9 +1481,11 @@
while ((c = *t) && (c == '_' || GDKisalnum(c)))
t++;
s = (char *) alloca((unsigned) (1 + t - r));
- strncpy(s, r, t - r);
- s[t - r] = 0;
- bid = BBPindex(s);
+ if (s != NULL) {
+ strncpy(s, r, t - r);
+ s[t - r] = 0;
+ bid = BBPindex(s);
+ }
**dst = bid == 0 ? bat_nil : sign * bid;
return (int) (t + (c == '>') - src);
}
@@ -2553,10 +2560,10 @@
OIDfromStr(char *src, int *len, oid **dst)
{
#if SIZEOF_OID == SIZEOF_INT
- int ui, *uip = &ui;
+ int ui = 0, *uip = &ui;
int l = (int) sizeof(int);
#else
- lng ui, *uip = &ui;
+ lng ui = 0, *uip = &ui;
int l = (int) sizeof(lng);
#endif
int pos = 0;
Index: gdk_setop.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_setop.mx,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- gdk_setop.mx 14 Jan 2008 15:03:54 -0000 1.61
+++ gdk_setop.mx 1 Feb 2008 12:21:37 -0000 1.62
@@ -288,6 +288,8 @@
if (b->hkey) {
bn = BATcopy(b, b->htype, b->ttype, FALSE);
+ if (bn == NULL)
+ return NULL;
} else {
size_t cnt = BATcount(b);
Index: gdk_desc.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_desc.mx,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- gdk_desc.mx 11 Jan 2008 10:37:00 -0000 1.51
+++ gdk_desc.mx 1 Feb 2008 12:21:36 -0000 1.52
@@ -201,10 +201,10 @@
return NULL;
}
if (read(fd, &ver, sizeof(int)) != sizeof(int) ||
- ver > BUFSIZ ||
+ ver < 0 || ver > (int)sizeof(hatm) ||
read(fd, hatm, ver) != ver ||
read(fd, &ver, sizeof(int)) != sizeof(int) ||
- ver > BUFSIZ ||
+ ver < 0 || ver > (int)sizeof(tatm) ||
read(fd, tatm, ver) != ver) {
if (b->hheap)
GDKfree(b->hheap);
Index: gdk_bbp.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_bbp.mx,v
retrieving revision 1.207
retrieving revision 1.208
diff -u -d -r1.207 -r1.208
--- gdk_bbp.mx 11 Jan 2008 10:37:00 -0000 1.207
+++ gdk_bbp.mx 1 Feb 2008 12:21:35 -0000 1.208
@@ -687,6 +687,7 @@
if (!BBP)
return; /* AARGH */
+ BBPrecycle_minsize(0); /* clear the bat cache */
BBPlock("BBPexit"); /* stop all threads ever touching more
descriptors */
/* free all memory (just for leak-checking in Purify) */
@@ -813,9 +814,9 @@
if (i > 0) {
/* for tmp_X BATs, we already know X */
- str s = BBP_logical(i);
+ str s;
- if (i >= BBPsize || s == NULL || strcmp(s, nme)) {
+ if (i >= BBPsize || (s = BBP_logical(i)) == NULL || strcmp(s,
nme)) {
i = 0;
}
} else if (*nme != '.') {
@@ -1027,6 +1028,8 @@
int mode;
BAT *bm = (BAT *) GDKmalloc(sizeof(BAT)); /* alloc before lock to
prevent trim problems */
+ if (!bm)
+ return ;
if (i) {
assert(i > 0);
} else {
@@ -1522,10 +1525,13 @@
BBPreclaim(BAT *b)
{
int lock = locked_by ? BBP_getpid() != locked_by : 1;
- bat i = ABS(b->batCacheid);
+ bat i;
int reclaim_while_unloading = 0;
int ret = 0;
+ if (b == NULL)
+ return -1;
+ i = ABS(b->batCacheid);
if (lock)
gdk_set_lock(GDKswapLock(i), "BBPreclaim");
@@ -2819,6 +2825,8 @@
/* determine location dir and physical suffix */
GDKfilepath(srcdir, BATDIR, s, NULL);
s = strrchr(srcdir, DIR_SEP);
+ if (!s)
+ return -1;
strcpy(nme, ++s);
srcdir[s - srcdir] = 0;
Index: gdk_search.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_search.mx,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -d -r1.75 -r1.76
--- gdk_search.mx 13 Jan 2008 13:45:46 -0000 1.75
+++ gdk_search.mx 1 Feb 2008 12:21:37 -0000 1.76
@@ -389,9 +389,11 @@
GDKfree(h);
/* create the hash structures */
hp = (Heap *) GDKzalloc(sizeof(Heap));
- hp->filename = GDKmalloc(strlen(nme) + 12);
- sprintf(hp->filename, "%s.%chash", nme, b->batCacheid >
0 ? 'h' : 't');
- if ((h = HASHnew(hp, ATOMtype(b->htype),
BATcapacity(b), (size_t) mask)) == NULL) {
+ if (hp && (hp->filename = GDKmalloc(strlen(nme) + 12))
!= NULL)
+ sprintf(hp->filename, "%s.%chash", nme,
b->batCacheid > 0 ? 'h' : 't');
+ if (hp == NULL ||
+ hp->filename == NULL ||
+ (h = HASHnew(hp, ATOMtype(b->htype),
BATcapacity(b), (size_t) mask)) == NULL) {
gdk_unset_lock(GDKhashLock(ABS(b->batCacheid) &
BBP_BATMASK), "BAThash");
GDKfree(hp->filename);
GDKfree(hp);
@@ -518,17 +520,18 @@
HASHprint(BAT *b)
{
BATiter bi = bat_iterator(b);
+ BAT *bn;
+ BUN p, q;
+
+ if (!(b && b->H->hash))
+ return NULL;
#if SIZEOF_OID == SIZEOF_INT
- BAT *bn = BATnew(BAThtype(b), TYPE_int, BATcount(b));
+ bn = BATnew(BAThtype(b), TYPE_int, BATcount(b));
#else
- BAT *bn = BATnew(BAThtype(b), TYPE_lng, BATcount(b));
+ bn = BATnew(BAThtype(b), TYPE_lng, BATcount(b));
#endif
- BUN p, q;
-
if (bn == NULL)
return NULL;
- if (!(b && b->H->hash))
- return 0;
BATloop(b, p, q) {
size_t i = HASHprobe(b->H->hash, BUNhead(bi, p));
@@ -562,7 +565,7 @@
void
HASHremove(BAT *b)
{
- if (b->H->hash) {
+ if (b && b->H->hash) {
bat p = VIEWhparent(b);
BAT *hp = NULL;
@@ -586,9 +589,12 @@
void
HASHdestroy(BAT *b)
{
- HASHremove(b);
- if (BATmirror(b))
- HASHremove(BATmirror(b));
+ if (b) {
+ HASHremove(b);
+ if (BATmirror(b))
+ HASHremove(BATmirror(b));
+
+ }
}
int
Index: gdk_batop.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_batop.mx,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -d -r1.149 -r1.150
--- gdk_batop.mx 11 Jan 2008 10:36:59 -0000 1.149
+++ gdk_batop.mx 1 Feb 2008 12:21:35 -0000 1.150
@@ -285,7 +285,9 @@
return b;
}
/* we need to materialize the tail */
- BATmaterializet(b);
+ b = BATmaterializet(b);
+ if (b == NULL)
+ return NULL;
}
/* a hash is useless for void bats */
@@ -1001,7 +1003,7 @@
BATsample(BAT *b, size_t size)
{
size_t cnt, i, r = 0, n, j;
- size_t *choice, *dst;
+ size_t *choice = NULL, *dst;
BAT *bn;
BATiter bi = bat_iterator(b);
@@ -1016,10 +1018,14 @@
if (n == 0)
return bn;
dst = choice = (size_t *) GDKmalloc(n * sizeof(size_t));
+ if (!choice)
+ goto bunins_failed;
if (n * 2 < BATcount(b)) { /* nondense sample */
char *vec = (char *) GDKzalloc(1 + (cnt / 8));
+ if (vec == NULL)
+ goto bunins_failed;
for (j = 0; j < n; j++) {
r += rand();
i = r % cnt;
@@ -1040,6 +1046,8 @@
} else if (cnt < 65536) {
unsigned short *vec = (unsigned short *) GDKmalloc(cnt *
sizeof(unsigned short));
+ if (vec == NULL)
+ goto bunins_failed;
for (i = 0; i < cnt; i++)
vec[i] = (unsigned short) i;
for (j = 0; j < n; j++) {
@@ -1052,6 +1060,8 @@
} else {
size_t *vec = (size_t *) GDKmalloc(cnt * sizeof(size_t));
+ if (vec == NULL)
+ goto bunins_failed;
for (i = 0; i < cnt; i++)
vec[i] = i;
for (j = 0; j < n; j++) {
@@ -1088,6 +1098,8 @@
BATkey(BATmirror(bn), BATtkey(b));
return bn;
bunins_failed:
+ if (choice)
+ GDKfree(choice);
BBPreclaim(bn);
return NULL;
}
@@ -1556,9 +1568,10 @@
[EMAIL PROTECTED]@3(BAT *b)
{
BAT *bn;
- int tt = b->ttype;
+ int tt = 0;
BATcheck(b, "[EMAIL PROTECTED]: BAT");
+ tt = b->ttype;
if (b->htype == TYPE_void && b->hseqbase == oid_nil) {
/* b's head is void-nil, hence we return a read-only copy/view
of b */
return BATcopy(b, b->htype, b->ttype, FALSE);
@@ -1627,6 +1640,8 @@
if (b->ttype == TYPE_void && b->tseqbase != oid_nil) {
/* materialize void-tail in-place */
b = BATmaterializet(b);
+ if (b == NULL)
+ return NULL;
}
if (([EMAIL PROTECTED] == GDK_SORTED_REV && b->htype == TYPE_void) ||
(b->htype != TYPE_void && (b->hkey || '@7' != 's') && [EMAIL
PROTECTED](b))) {
@@ -1662,12 +1677,19 @@
if ((b->htype == TYPE_void && b->hseqbase != oid_nil) || (b->ttype ==
TYPE_void && b->tseqbase != oid_nil)) {
/* materialize void columns in-place */
b = BATmaterialize(b);
+ if (b == NULL)
+ return NULL;
}
ALIGNdel(b, "BATrevert", FALSE);
hs = (size_t) Hsize(b);
ts = (size_t) Tsize(b);
h = (char *) GDKmalloc(hs);
t = (char *) GDKmalloc(ts);
+ if (!h || !t) {
+ GDKfree(h);
+ GDKfree(t);
+ return NULL;
+ }
for (p = BUNlast(b)?BUNlast(b) - 1:0, q = BUNfirst(b); p > q; p--, q++){
char *ph = BUNhloc(bi,p);
char *qh = BUNhloc(bi,q);
@@ -2325,6 +2347,8 @@
BATiter bi = bat_iterator(b);
BATcheck(b, "BATconst");
+ if (!v)
+ return NULL;
if (BAThrestricted(b) == BAT_READ &&
!ATOMvarsized(tailtype) && tailtype != TYPE_bat) {
if (tailtype == TYPE_void) {
@@ -2395,7 +2419,8 @@
}
return bn;
bunins_failed:
- BBPreclaim(bn);
+ if (bn)
+ BBPreclaim(bn);
return NULL;
}
@@ -2488,16 +2513,16 @@
ValRecord vr;
PROPrec *p = BATgetprop(b, idx);
- if (!p) {
- p = (PROPrec *) GDKmalloc(sizeof(PROPrec));
+ if (!p && (p = (PROPrec *) GDKmalloc(sizeof(PROPrec))) != NULL) {
p->id = idx;
-
p->next = b->T->props;
b->T->props = p;
}
- VALset(&vr, type, v);
- VALcopy(&p->v, &vr);
- b->batDirtydesc = TRUE;
+ if (p) {
+ VALset(&vr, type, v);
+ VALcopy(&p->v, &vr);
+ b->batDirtydesc = TRUE;
+ }
}
void
Index: gdk_align.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_align.mx,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- gdk_align.mx 13 Jan 2008 13:45:46 -0000 1.89
+++ gdk_align.mx 1 Feb 2008 12:21:33 -0000 1.90
@@ -102,11 +102,12 @@
int
ALIGNsetH(BAT *b1, BAT *b2)
{
- ssize_t diff = BUNfirst(b1) - BUNfirst(b2);
+ ssize_t diff;
BATcheck(b1, "ALIGNsetH: bat 1 required");
BATcheck(b2, "ALIGNsetH: bat 2 required");
+ diff = BUNfirst(b1) - BUNfirst(b2);
if (b2->halign == 0) {
b2->halign = OIDnew(1);
b2->batDirtydesc = TRUE;
@@ -338,11 +339,13 @@
BAT *
VIEWhead(BAT *b)
{
- BAT *bn = VIEWhcreate(b);
- BAT *bm = BATmirror(bn);
+ BAT *bn = VIEWhcreate(b), *bm;
BATstore *bs = (BATstore *) bn;
- if (bn == NULL || bm == NULL)
+ if (bn == NULL)
+ return NULL;
+ bm = BATmirror(bn);
+ if (bm == NULL)
return NULL;
bm->H = bn->T = &bs->T;
bn->T->type = TYPE_void;
@@ -374,12 +377,13 @@
BAT *
VIEWcombine(BAT *b)
{
- BAT *bn = VIEWhcreate(b);
- BAT *bm = BATmirror(bn);
+ BAT *bn = VIEWhcreate(b), *bm;
- if (bn == NULL || bm == NULL)
+ if (bn == NULL)
+ return NULL;
+ bm = BATmirror(bn);
+ if (bm == NULL)
return NULL;
-
if (bn->htype != TYPE_void) {
bn->T = bn->H;
bm->H = bn->H;
@@ -400,15 +404,20 @@
BAT *
BATmaterializeh(BAT *b)
{
- int ht = b->htype;
- size_t cnt = BATcapacity(b);
- Heap head = b->H->heap;
- BUN p = BUNfirst(b), q = BUNlast(b);
+ int ht;
+ size_t cnt;
+ Heap head;
+ BUN p, q;
oid h, *x;
+ BATcheck(b, "BATmaterialize: bat required");
assert(!isVIEW(b));
+ ht = b->htype;
+ cnt = BATcapacity(b);
+ head = b->H->heap;
+ p = BUNfirst(b);
+ q = BUNlast(b);
assert(cnt >= q - p);
- BATcheck(b, "BATmaterialize: bat required");
ALGODEBUG THRprintf(GDKout, "#BATmaterialize(%d);\n", (int)
b->batCacheid);
if (!BAThdense(b) || ht != TYPE_void) {
@@ -509,60 +518,61 @@
BAT *
VIEWreset(BAT *b)
{
- bat hp = VIEWhparent(b), tp = VIEWtparent(b);
+ bat hp, tp;
+ Heap head,tail, hh, th;
- if (b && (hp || tp)) {
- Heap head,tail, hh, th;
- BAT *n = ((b) = BBP_cache(ABS((b)->batCacheid)));
+ if (b == NULL)
+ return NULL;
+ hp = VIEWhparent(b);
+ tp = VIEWtparent(b);
+ if (hp || tp) {
+ BAT *r = b, *n = ((b) = BBP_cache(ABS((b)->batCacheid)));
BAT *m = BATmirror(n);
BAT *v;
BATstore *bs = (BATstore *) n;
size_t cnt = BATcount(b) + 1;
str nme = BBP_physical(n->batCacheid);
+ assert(hp || !r->htype);
+ assert(tp || !r->ttype);
+
/* alloc heaps */
memset(&head, 0, sizeof(Heap));
+ memset(&tail, 0, sizeof(Heap));
+ memset(&hh, 0, sizeof(Heap));
+ memset(&th, 0, sizeof(Heap));
head.filename = (str) GDKmalloc(strlen(nme) + 12);
+ if (head.filename == NULL)
+ goto bailout;
sprintf(head.filename, "%s.head", nme);
- if (n->htype && HEAPalloc(&head, cnt, Hsize(n)) < 0) {
- GDKfree(head.filename);
- head.filename = NULL;
- return NULL;
- }
- memset(&tail, 0, sizeof(Heap));
+ if (n->htype && HEAPalloc(&head, cnt, Hsize(n)) < 0)
+ goto bailout;
tail.filename = (str) GDKmalloc(strlen(nme) + 12);
+ if (tail.filename == NULL)
+ goto bailout;
sprintf(tail.filename, "%s.tail", nme);
- if (n->ttype && HEAPalloc(&tail, cnt, Tsize(n)) < 0) {
- HEAPfree(&head);
- GDKfree(tail.filename);
- tail.filename = NULL;
- return NULL;
- }
- memset(&hh, 0, sizeof(Heap));
+ if (n->ttype && HEAPalloc(&tail, cnt, Tsize(n)) < 0)
+ goto bailout;
if (n->H->vheap) {
hh.filename = (str) GDKmalloc(strlen(nme) + 12);
+ if (hh.filename == NULL)
+ goto bailout;
sprintf(hh.filename, "%s.hheap", nme);
- if (ATOMheap(n->htype, &hh, cnt) < 0) {
- HEAPfree(&head);
- HEAPfree(&tail);
- GDKfree(hh.filename);
- return NULL;
- }
+ if (ATOMheap(n->htype, &hh, cnt) < 0)
+ goto bailout;
}
- memset(&th, 0, sizeof(Heap));
if (n->T->vheap) {
th.filename = (str) GDKmalloc(strlen(nme) + 12);
+ if (th.filename == NULL)
+ goto bailout;
sprintf(th.filename, "%s.theap", nme);
- if (ATOMheap(n->ttype, &th, cnt) < 0) {
- HEAPfree(&head);
- HEAPfree(&tail);
- HEAPfree(&hh);
- GDKfree(th.filename);
- return NULL;
- }
+ if (ATOMheap(n->ttype, &th, cnt) < 0)
+ goto bailout;
}
v = VIEWcreate(b, b);
+ if (v == NULL)
+ goto bailout;
/* cut the link to your parents */
VIEWunlink(n);
@@ -604,10 +614,14 @@
/* unshare from parents heap */
if (hh.base) {
n->H->vheap = (Heap *) GDKmalloc(sizeof(Heap));
+ if (n->H->vheap == NULL)
+ goto bailout;
*n->H->vheap = hh;
}
if (th.base) {
n->T->vheap = (Heap *) GDKmalloc(sizeof(Heap));
+ if (n->T->vheap == NULL)
+ goto bailout;
*n->T->vheap = th;
}
@@ -627,8 +641,15 @@
/* insert all of v in b, and quit */
BATins(b, v, FALSE);
BBPreclaim(v);
+ b = r;
}
return b;
+bailout:
+ HEAPfree(&head);
+ HEAPfree(&tail);
+ HEAPfree(&hh);
+ HEAPfree(&th);
+ return NULL;
}
@-
@@ -640,13 +661,18 @@
void
VIEWbounds(BAT *view, size_t l, size_t h)
{
- bat hp = VIEWhparent(view);
- bat tp = VIEWtparent(view);
+ bat hp, tp;
BAT *hb;
BAT *tb;
BAT *b;
- if (view == NULL || (hp == 0 && tp == 0)) {
+ if (view == NULL){
+ GDKerror("VIEWbounds: bat required");
+ return;
+ }
+ hp = VIEWhparent(view);
+ tp = VIEWtparent(view);
+ if (hp == 0 && tp == 0) {
GDKerror("VIEWbounds: bat required");
return;
}
Index: gdk_heap.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_heap.mx,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- gdk_heap.mx 13 Jan 2008 13:45:46 -0000 1.92
+++ gdk_heap.mx 1 Feb 2008 12:21:36 -0000 1.93
@@ -361,13 +361,14 @@
}
}
h->base = (char *) GDKload(nme, ext, h->free, h->size, h->storage);
- if (h->base == NULL) {
+ h->filename = (char *) GDKmalloc(strlen(nme) + strlen(ext) + 2);
+ if (h->base == NULL || h->filename == NULL) {
+ GDKfree(h->base);
+ GDKfree(h->filename);
return -1; /* file could not be read satisfactorily */
}
h->newstorage = h->storage;
- h->filename = (char *) GDKmalloc(strlen(nme) + strlen(ext) + 2);
sprintf(h->filename, "%s.%s", nme, ext);
-
return desc_status; /* ok */
}
@@ -895,6 +896,11 @@
*/
hr->validmask = (size_t *) GDKmalloc(sizeof(size_t) * ++nwords);
freemask = (size_t *) GDKmalloc(sizeof(size_t) * nwords);
+ if (hr->validmask == NULL || freemask == NULL) {
+ GDKfree(hr->validmask);
+ GDKfree(freemask);
+ return FALSE;
+ }
for (block = 0; block < nwords; block++)
freemask[block] = hr->validmask[block] = 0;
Index: gdk_value.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_value.mx,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- gdk_value.mx 11 Jan 2008 10:37:01 -0000 1.40
+++ gdk_value.mx 1 Feb 2008 12:21:38 -0000 1.41
@@ -55,6 +55,8 @@
{
ValPtr v = (ValPtr) GDKmalloc(sizeof(ValRecord));
+ if (v == NULL)
+ return NULL;
VALempty(v);
return v;
}
Index: gdk_storage.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_storage.mx,v
retrieving revision 1.133
retrieving revision 1.134
diff -u -d -r1.133 -r1.134
--- gdk_storage.mx 13 Jan 2008 13:45:46 -0000 1.133
+++ gdk_storage.mx 1 Feb 2008 12:21:38 -0000 1.134
@@ -519,11 +519,13 @@
if (b->hheap) {
b->hheap = (Heap *) GDKmalloc(sizeof(Heap));
- *b->hheap = *bd->hheap;
+ if (b->hheap)
+ *b->hheap = *bd->hheap;
}
if (b->theap) {
b->theap = (Heap *) GDKmalloc(sizeof(Heap));
- *b->theap = *bd->theap;
+ if (b->theap)
+ *b->theap = *bd->theap;
}
/* start saving data */
Index: gdk_relop.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_relop.mx,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -d -r1.139 -r1.140
--- gdk_relop.mx 11 Jan 2008 10:37:00 -0000 1.139
+++ gdk_relop.mx 1 Feb 2008 12:21:37 -0000 1.140
@@ -137,9 +137,8 @@
@:joinestimate(@1, @2, _estimate)@
bn = BATnew(BAThtype(l), BATttype(r), _estimate);
- if (bn == NULL) {
+ if (bn == NULL)
return bn;
- }
}
@}
@- Merge join
@@ -523,6 +522,8 @@
BATiter li = bat_iterator(l);
BATiter ri = bat_iterator(r);
+ if (bn == NULL)
+ return NULL;
dst = BUNfirst(bn);
base = BUNfirst(r);
offset = (ssize_t) (base - r->hseqbase);
@@ -555,6 +556,8 @@
BATiter li = bat_iterator(l);
BATiter ri = bat_iterator(r);
+ if (bn == NULL)
+ return NULL;
dst = BUNfirst(bn);
base = BUNfirst(r);
offset = (ssize_t) (base - r->hseqbase);
@@ -588,6 +591,8 @@
BATiter ri = bat_iterator(r);
+ if (bn == NULL)
+ return NULL;
dst = BUNfirst(bn);
base = BUNfirst(r);
offset = (ssize_t) (base - r->hseqbase);
@@ -817,6 +822,8 @@
}
#endif
bn = BATnew(@1->htype, @2->ttype, 0);
+ if (bn == NULL)
+ return NULL;
bn->hsorted = bn->tsorted = GDK_SORTED;
BATkey(bn, TRUE);
BATkey(BATmirror(bn), TRUE);
@@ -1658,9 +1665,8 @@
@= semijoinbat
bn = BATnew(BAThtype(@1), BATttype(@1), MAX(BATTINY, MIN(BATcount(l),
BATcount(r))));
ESTIDEBUG THRprintf(GDKout, "#%s.semijoinbat: estimated resultsize: "
SZFMT "\n",@4,MAX(BATTINY, MIN(BATcount(l), BATcount(r))));
- if (bn == NULL) {
+ if (bn == NULL)
return bn;
- }
BATkey(bn, BAThkey(@1));
BATkey(BATmirror(bn), BATtkey(@1));
bn->hsorted = @2;
@@ -2237,9 +2243,8 @@
}
bn = BATnew(BAThtype(l), BATttype(r), sz);
- if (bn == NULL) {
+ if (bn == NULL)
return bn;
- }
if (sz == 0)
return bn;
@@ -2406,9 +2411,8 @@
}
bn = BATnew(BAThtype(l), BATttype(r), sz);
- if (bn == NULL) {
+ if (bn == NULL)
return bn;
- }
if (sz == 0)
return bn;
Index: gdk_bat.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB/src/gdk/gdk_bat.mx,v
retrieving revision 1.186
retrieving revision 1.187
diff -u -d -r1.186 -r1.187
--- gdk_bat.mx 13 Jan 2008 13:45:46 -0000 1.186
+++ gdk_bat.mx 1 Feb 2008 12:21:35 -0000 1.187
@@ -143,30 +143,49 @@
if (ht) {
bn->H->heap.filename = (str) GDKmalloc(strlen(nme) +
12);
+ if (bn->H->heap.filename == NULL)
+ goto bailout;
GDKfilepath(bn->H->heap.filename, NULL, nme, "head");
}
if (tt) {
bn->T->heap.filename = (str) GDKmalloc(strlen(nme) +
12);
+ if (bn->T->heap.filename == NULL)
+ goto bailout;
GDKfilepath(bn->T->heap.filename, NULL, nme, "tail");
}
if (ATOMneedheap(ht)) {
- bn->H->vheap = (Heap *) GDKzalloc(sizeof(Heap));
- bn->H->vheap->filename = (str) GDKmalloc(strlen(nme) +
12);
+ if ((bn->H->vheap = (Heap *) GDKzalloc(sizeof(Heap)))
== NULL || (bn->H->vheap->filename = (str) GDKmalloc(strlen(nme) + 12)) == NULL)
+ goto bailout;
GDKfilepath(bn->H->vheap->filename, NULL, nme, "hheap");
bn->batMaphheap = STORE_UNSET;
}
if (ATOMneedheap(tt)) {
- bn->T->vheap = (Heap *) GDKzalloc(sizeof(Heap));
- bn->T->vheap->filename = (str) GDKmalloc(strlen(nme) +
12);
+ if ((bn->T->vheap = (Heap *) GDKzalloc(sizeof(Heap)))
== NULL || (bn->T->vheap->filename = (str) GDKmalloc(strlen(nme) + 12)) == NULL)
+ goto bailout;
GDKfilepath(bn->T->vheap->filename, NULL, nme, "theap");
bn->batMaptheap = STORE_UNSET;
}
}
bn->batDirty = TRUE;
return bn;
+bailout:
+ if (ht)
+ HEAPfree(&bn->H->heap);
+ if (tt)
+ HEAPfree(&bn->T->heap);
+ if (ht && bn->H->vheap) {
+ HEAPfree(bn->H->vheap);
+ GDKfree(bn->H->vheap);
+ }
+ if (tt && bn->T->vheap) {
+ HEAPfree(bn->T->vheap);
+ GDKfree(bn->T->vheap);
+ }
+ GDKfree(bn);
+ return NULL;
}
chr
@@ -269,9 +288,9 @@
{
BAT *c = BATnew(b->htype, b->ttype, cap);
- if (c->htype == TYPE_void && b->hseqbase != oid_nil)
+ if (c && c->htype == TYPE_void && b->hseqbase != oid_nil)
BATseqbase(c, b->hseqbase);
- if (c->ttype == TYPE_void && b->tseqbase != oid_nil)
+ if (c && c->ttype == TYPE_void && b->tseqbase != oid_nil)
BATseqbase(BATmirror(c), b->tseqbase);
return c;
}
@@ -736,12 +755,10 @@
(b->ttype && heapcopy(&bthp, &b->T->heap, &tremap)
< 0)||
(bn->H->vheap && heapcopy(&hhp, b->H->vheap,
&hvremap) < 0) ||
(bn->T->vheap && heapcopy(&thp, b->T->vheap,
&tvremap) < 0)) {
- if (hhp.base)
- HEAPfree(&hhp);
- if (bthp.base)
- HEAPfree(&bthp);
- if (bhhp.base)
- HEAPfree(&bhhp);
+ HEAPfree(&thp);
+ HEAPfree(&hhp);
+ HEAPfree(&bthp);
+ HEAPfree(&bhhp);
BBPreclaim(bn);
return NULL;
}
@@ -980,12 +997,13 @@
BAT *
BUNins(BAT *b, ptr h, ptr t, bit force)
{
- int countonly = (b->htype == TYPE_void && b->ttype == TYPE_void);
+ int countonly;
BUN p;
BAT *bm;
BATcheck(b, "BUNins");
BATcheck(h, "BUNins: head value is nil\n");
+ countonly = (b->htype == TYPE_void && b->ttype == TYPE_void);
bm = BBP_cache(-b->batCacheid);
@:void_insertbun(h)@
@@ -1186,12 +1204,12 @@
int countonly;
size_t hsize = 0, tsize = 0;
+ BATcheck(b, "BUNappend");
if (b->H->hash && b->H->vheap)
hsize = b->H->vheap->size;
if (b->T->hash && b->T->vheap)
tsize = b->T->vheap->size;
- BATcheck(b, "BUNappend");
bm = BBP_cache(-b->batCacheid);
countonly = (b->htype == TYPE_void && b->ttype == TYPE_void);
@@ -1268,6 +1286,8 @@
b = BATmaterializet(b);
countonly = 0;
+ if (b == NULL)
+ return NULL;
b->T->nodense = cnt;
b->tdense = FALSE;
if (b->tsorted & 1) {
@@ -1312,6 +1332,8 @@
if (*(oid *) t == oid_nil) {
BATmaterializet(b);
countonly = 0;
+ if (b == NULL)
+ return NULL;
} else {
b->tseqbase = bm->hseqbase = *(oid *) t;
}
@@ -1714,8 +1736,9 @@
BUN r = BUN_NONE;
BATiter bi = bat_iterator(b);
-
BATcheck(b, "BUNfnd");
+ if (!v)
+ return r;
if (BAThvoid(b)) {
BUNfndVOID(r, bi, v);
return r;
@@ -1751,8 +1774,8 @@
return r;
}
[EMAIL PROTECTED] swapif
- if (@1) {
[EMAIL PROTECTED] swap
+ {
int (*_cmp) (ptr, ptr);
ptr _p;
@@ -1763,8 +1786,6 @@
x = y;
y = _p;
bi.b = b = BATmirror(b);
- if (v)
- v = BATmirror(v);
}
@= dohash
@@ -1774,8 +1795,7 @@
BUNlocate(BAT *b, ptr x, ptr y)
{
BATiter bi = bat_iterator(b);
- int (*hcmp) (ptr, ptr) = BATatoms[b->htype].atomCmp;
- int (*tcmp) (ptr, ptr) = BATatoms[b->ttype].atomCmp;
+ int (*hcmp) (ptr, ptr), (*tcmp) (ptr, ptr);
int htpe, ttpe, hint = 0, tint = 0, hlng = 0, tlng = 0;
var_t hidx, tidx;
BUN p, q;
@@ -1783,19 +1803,23 @@
BATcheck(b, "BUNlocate: BAT parameter");
BATcheck(x, "BUNlocate: value parameter");
+ hcmp = BATatoms[b->htype].atomCmp;
+ tcmp = BATatoms[b->ttype].atomCmp;
p = BUNfirst(b);
q = BUNlast(b);
if (p == q)
return BUN_NONE; /* empty bat */
/* sometimes BUNlocate is just about a single column */
- @:swapif(y && ((BAThordered(b)&1) && (*hcmp)(x,BUNhead(bi,p)) == 0 &&
(*hcmp)(x,BUNhead(bi,q-1)) == 0))@
+ if(y && ((BAThordered(b)&1) && (*hcmp)(x,BUNhead(bi,p)) == 0 &&
(*hcmp)(x,BUNhead(bi,q-1)) == 0))
+ @:swap()@
if (y == NULL || ((BATtordered(b) & 1) && (*tcmp) (y, BUNtail(bi, p))
== 0 && (*tcmp) (y, BUNtail(bi, q - 1)) == 0)) {
return BUNfnd(b, x);
}
/* positional lookup is always the best choice */
- @:swapif(BATtdense(b))@
+ if(BATtdense(b))
+ @:swap()@
if (BAThdense(b)) {
oid i = *(oid *) x - b->hseqbase;
@@ -1830,7 +1854,8 @@
/* regrettably MonetDB support only single-column hashes
* strategy: create a hash on both columns, and select the
column with the best distribution
*/
- @:swapif((b->T->hash && b->H->hash == NULL) ||
!(@:dohash(b,h)@))@
+ if((b->T->hash && b->H->hash == NULL) || !(@:dohash(b,h)@))
+ @:swap()@
if (b->H->hash == NULL && (v = VIEWcreate_(b, b, TRUE)) !=
NULL) {
/* As we are going to remove the worst hash table
later, we must do everything
* in a view, as it is not permitted to remove a hash
table from a read-only
@@ -1847,12 +1872,17 @@
hcnt += (v->H->hash->hash[i] !=
HASH_MAX);
for (i = 0; i <= v->T->hash->mask; i++)
tcnt += (v->T->hash->hash[i] !=
HASH_MAX);
- @:swapif(hcnt < tcnt)@
-
+ if (hcnt < tcnt) {
+ @:swap()@
+ v = BATmirror(v);
+ }
/* remove the least selective hash table */
HASHremove(BATmirror(v));
}
- @:swapif(v->H->hash == NULL)@
+ if (v->H->hash == NULL) {
+ @:swap()@
+ v = BATmirror(v);
+ }
if (v->H->hash) {
gdk_set_lock(GDKhashLock(ABS(b->batCacheid) &
BBP_BATMASK), "BUNlocate");
if (b->H->hash == NULL) { /* give it to
the parent */
@@ -2148,8 +2178,10 @@
str
BATrename(BAT *b, str nme)
{
- int ret = BATname(b, nme);
+ int ret;
+ BATcheck(b, "BATrename");
+ ret = BATname(b, nme);
if (ret == 1) {
GDKerror("BATrename: identifier expected: %s\n", nme);
} else if (ret == BBPRENAME_ALREADY) {
@@ -3067,8 +3099,10 @@
str nme = BBP_physical(bv->batCacheid);
hp->filename = GDKmalloc(strlen(nme) + 12);
- sprintf(hp->filename, "%s.%chash", nme,
b->batCacheid > 0 ? 'h' : 't');
- if ((bv->H->hash = HASHnew(hp, tpe, yy + lim,
HASHmask(lim))) == NULL) {
+ if (hp->filename != NULL)
+ sprintf(hp->filename, "%s.%chash", nme,
b->batCacheid > 0 ? 'h' : 't');
+ if (hp->filename == NULL ||
+ (bv->H->hash = HASHnew(hp, tpe, yy + lim,
HASHmask(lim))) == NULL) {
GDKfree(hp->filename);
GDKfree(hp);
THRprintf(GDKout, "#BATpropcheck: BAT
%s(%d): could not allocate hash table for key test\n", BATgetId(b),
b->batCacheid);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins