Re: Solaris/SPARC: SIGBUS in unittests/array_out.c

[email protected] (Christos Zoulas)
Newsgroups gmane.comp.db.tds.freetds
Organization Astron Software
Message-ID <[email protected]>
On Sep 21, 12:56pm, [email protected] ("Peter C. Norton") wrote:
-- Subject: [freetds] Solaris/SPARC: SIGBUS in unittests/array_out.c

| Group, 
| 
| I'm no good at alignment issues, so I'm looking for help here.  I've
| got a 64-bit build of freetds-0.83.dev.20100902:
| 
| nortonp@ssqa1 11:54 /tmp/freetds/src/odbc/unittests $ ./array_out
| odbctest

Who in their right mind would try to run code on non Pee-Cee machines?!?
(just kidding). Try this completely untested fix...

christos

Index: array_out.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/odbc/unittests/array_out.c,v
retrieving revision 1.1.1.3
diff -u -u -r1.1.1.3 array_out.c
--- array_out.c	17 Jun 2009 18:31:59 -0000	1.1.1.3
+++ array_out.c	21 Sep 2010 19:16:59 -0000
@@ -22,13 +22,12 @@
 {
 #define ARRAY_SIZE 10
 
-	SQLUINTEGER *ids;
+	SQLUINTEGER *ids, id;
 	SQLCHAR *descs;
-	SQLLEN *id_lens, *desc_lens;
+	SQLLEN *id_lens, id_len, *desc_lens, desc_len;
 	SQLULEN processed;
 	SQLUSMALLINT i, statuses[ARRAY_SIZE];
-	int desc_len = trunc ? 4 : 51;
-	int rec_size = 0;
+	int rec_size = 0, dlen = trunc ? 4 : 51;
 	Record *rec = NULL;
 	char status[20];
 
@@ -41,37 +40,40 @@
 	SQLSetStmtAttr(Statement, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
 
 	if (!record_bind) {
-		ids = (SQLUINTEGER *) malloc(sizeof(SQLUINTEGER) * ARRAY_SIZE);
-		descs = malloc(sizeof(SQLCHAR) * ARRAY_SIZE * desc_len);
-		desc_lens = (SQLLEN *) malloc(sizeof(SQLLEN) * ARRAY_SIZE);
-		id_lens = (SQLLEN *) malloc(sizeof(SQLLEN) * ARRAY_SIZE);
+		ids = malloc(sizeof(*ids) * ARRAY_SIZE);
+		descs = malloc(sizeof(*descs) * ARRAY_SIZE * dlen);
+		desc_lens = malloc(sizeof(*desc_lens) * ARRAY_SIZE);
+		id_lens = malloc(sizeof(*id_lens) * ARRAY_SIZE);
 		assert(descs && ids && desc_lens && id_lens);
 	} else {
-		rec_size = sizeof(Record) + ((sizeof(SQLCHAR) * desc_len + sizeof(SQLINTEGER) - 1) & ~(sizeof(SQLINTEGER) - 1));
+		rec_size = sizeof(Record) + ((sizeof(SQLCHAR) * dlen + sizeof(SQLINTEGER) - 1) & ~(sizeof(SQLINTEGER) - 1));
 		SQLSetStmtAttr(Statement, SQL_ATTR_ROW_BIND_TYPE, int2ptr(rec_size), 0);
-		rec = (Record *) malloc(rec_size * ARRAY_SIZE);
+		rec = malloc(rec_size * ARRAY_SIZE);
 		ids = &rec->id;
 		id_lens = &rec->id_len;
 		desc_lens = &rec->desc_len;
 		descs = (SQLCHAR *) (((char *) rec) + sizeof(Record));
 	}
 #define REC(f,n) (((char*)f)+rec_size*(n))
-#define DESCS(n) (rec ? (SQLCHAR*)REC(descs,n): (descs+(n)*desc_len))
-#define IDS(n) *(rec ? (SQLUINTEGER*)REC(ids,n) : &ids[n])
-#define ID_LENS(n) *(rec ? (SQLLEN*)REC(id_lens,n) : &id_lens[n])
-#define DESC_LENS(n) *(rec ? (SQLLEN*)REC(desc_lens,n) : &desc_lens[n])
+#define DESCS(n) (rec ? (SQLCHAR*)REC(descs,n): (descs+(n)*dlen))
+#define IDS(n) (rec ? (SQLUINTEGER*)REC(ids,n) : &ids[n])
+#define ID_LENS(n) (rec ? (SQLLEN*)REC(id_lens,n) : &id_lens[n])
+#define DESC_LENS(n) (rec ? (SQLLEN*)REC(desc_lens,n) : &desc_lens[n])
 
 	processed = ARRAY_SIZE + 1;
 	for (i = 0; i < ARRAY_SIZE; i++) {
 		statuses[i] = SQL_ROW_UPDATED;
-		IDS(i) = i * 132;
+		id = i * 132;
+		memcpy(IDS(i), &id, sizeof(id));
 		sprintf((char *) DESCS(i), "aaa");
-		ID_LENS(i) = 0;
-		DESC_LENS(i) = -i;
+		id_len = 0;
+		memcpy(ID_LENS(i), &id_len, sizeof(id_len));
+		desc_len = -i;
+		memcpy(DESC_LENS(i), &desc_len, sizeof(desc_len));
 	}
 
-	SQLBindCol(Statement, 1, SQL_C_ULONG, &IDS(0), 0, &ID_LENS(0));
-	SQLBindCol(Statement, 2, SQL_C_CHAR, DESCS(0), desc_len, &DESC_LENS(0));
+	SQLBindCol(Statement, 1, SQL_C_ULONG, IDS(0), 0, ID_LENS(0));
+	SQLBindCol(Statement, 2, SQL_C_CHAR, DESCS(0), dlen, DESC_LENS(0));
 
 	CHKExecDirect((SQLCHAR *) test_query, SQL_NTS, "S");
 
@@ -85,8 +87,9 @@
 		sprintf(buf, "%crow number %d", 'a' + i, i * 13);
 		if (trunc)
 			buf[3] = 0;
-		if (IDS(i) != i + 1 || strcmp((char *) DESCS(i), buf) != 0) {
-			fprintf(stderr, "Invalid result\n\tgot '%d|%s'\n\texpected '%d|%s'\n", (int) IDS(i), DESCS(i), i + 1, buf);
+		memcpy(&id, IDS(i), sizeof(id));
+		if (id != i + 1 || strcmp((char *) DESCS(i), buf) != 0) {
+			fprintf(stderr, "Invalid result\n\tgot '%d|%s'\n\texpected '%d|%s'\n", (int) id, DESCS(i), i + 1, buf);
 			exit(1);
 		}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.