Changeset: 7abfae9ee553 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7abfae9ee553 Modified Files: clients/mapilib/mapi.c sql/backends/monet5/sql_result.c Branch: protocol Log Message:
For some reason this fixes bus errors on Solaris (don't ask me, I don't know either). diffs (49 lines): diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -4120,8 +4120,10 @@ static char* mapi_convert_clob(struct Ma #define mapi_string_conversion_function(type, gdktpe, sqltpe,EXTRANULLCHECK) \ static char* mapi_convert_##sqltpe(struct MapiColumn *col) { \ - if (*((type*)col->buffer_ptr) == *((type*)col->null_value) EXTRANULLCHECK) return NULL; \ - if (conversion_##gdktpe##_to_string(col->write_buf, COLBUFSIZ, (type*) col->buffer_ptr, *((type*)col->null_value)) < 0) { \ + type buffer_value; \ + memcpy(&buffer_value, col->buffer_ptr, sizeof(type)); \ + if (buffer_value == *((type*)col->null_value) EXTRANULLCHECK) return NULL; \ + if (conversion_##gdktpe##_to_string(col->write_buf, COLBUFSIZ, &buffer_value, *((type*)col->null_value)) < 0) { \ return NULL; \ } \ return (char*) col->write_buf; \ @@ -5773,8 +5775,9 @@ mapi_fetch_row(MapiHdl hdl) for (i = 0; i < (size_t) result->fieldcnt; i++) { result->fields[i].buffer_ptr = buf; if (result->fields[i].typelen < 0) { - // variable-length column - lng col_len = *((lng*) buf); + lng col_len; + // variable length column + memcpy(&col_len, buf, sizeof(lng)); assert((size_t) col_len < hdl->mid->blocksize && col_len > 0); result->fields[i].buffer_ptr += sizeof(lng); buf += col_len + sizeof(lng); diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -2235,13 +2235,15 @@ int mvc_export_resultset_prot10(mvc *m, // variable columns are prefixed by a length, // but since we don't know the length yet, just skip over it for now char *startbuf = buf; + lng lenval; buf += sizeof(lng); for (crow = srow; crow < row; crow++) { char *str = (char*) BUNtail(iterators[i], crow); buf = mystpcpy(buf, str) + 1; + assert(buf - bs2_buffer(s).buf <= (lng) bsize); } - // after the loop we know the size of the column, so write it - *((lng*)startbuf) = mnstr_swap_lng(s, buf - (startbuf + sizeof(lng))); + lenval = mnstr_swap_lng(s, (lng) (buf - (startbuf + sizeof(lng)))); + memcpy(startbuf, &lenval, sizeof(lng)); } } else { int atom_size = ATOMsize(mtype); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list