X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=osl.c;h=41318976963e92fbe8fec2618aa10775734dc59a;hp=6294fbbe3f8900f3bf9830a30ccb8bfed150383a;hb=f0380a05616524b149fa34f4a0873d9063ca2a95;hpb=97f53e18953fc2013c0b14f0261ac385e45b0284 diff --git a/osl.c b/osl.c index 6294fbbe..41318976 100644 --- a/osl.c +++ b/osl.c @@ -179,7 +179,7 @@ int for_each_file_in_dir(const char *dirname, int cwd_fd, ret2, ret = para_opendir(dirname, &dir, &cwd_fd); if (ret < 0) - return ret == -E_CHDIR_PERM? 1 : ret; + return ret == -ERRNO_TO_PARA_ERROR(EACCES)? 1 : ret; /* scan cwd recursively */ while ((entry = readdir(dir))) { mode_t m; @@ -994,8 +994,14 @@ static void free_volatile_objects(const struct osl_table *t, for (n = rb_first(&rb_col->rbtree); n; n = rb_next(n)) { struct osl_row *r = get_row_pointer(n, rb_col->rbtree_num); if (flags & OSL_FREE_VOLATILE) - for (j = 0; j < t->num_volatile_columns; j++) - free(r->volatile_objects[j].data); + FOR_EACH_VOLATILE_COLUMN(j, t, cd) { + if (cd->storage_flags & OSL_DONT_FREE) + continue; + free(r->volatile_objects[ + t->columns[j].volatile_num].data); + } +// for (j = 0; j < t->num_volatile_columns; j++) +// free(r->volatile_objects[j].data); free(r->volatile_objects); } } @@ -1569,7 +1575,7 @@ int osl_del_row(struct osl_table *t, struct osl_row *row) mark_mapped_object_invalid(t, r->num, i); continue; } - if (st == OSL_NO_STORAGE) + if (st == OSL_NO_STORAGE && !(cd->storage_flags & OSL_DONT_FREE)) free(r->volatile_objects[col->volatile_num].data); } if (t->num_mapped_columns) { @@ -2007,8 +2013,17 @@ int osl_get_nth_row(const struct osl_table *t, unsigned col_num, { struct osl_column *col; struct rb_node *node; - int ret = check_rbtree_col(t, col_num, &col); + unsigned num_rows; + int ret; + if (n == 0) + return -E_RB_KEY_NOT_FOUND; + ret = osl_get_num_rows(t, &num_rows); + if (ret < 0) + return ret; + if (n > num_rows) + return -E_RB_KEY_NOT_FOUND; + ret = check_rbtree_col(t, col_num, &col); if (ret < 0) return ret; node = rb_nth(col->rbtree.rb_node, n);