Changeset: 222954178e51 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=222954178e51
Modified Files:
monetdb5/modules/atoms/inet.c
Branch: Dec2016
Log Message:
Force alignment of inet values.
This fixes a crash on 32 bit SPARC (where unaligned access is a no-no).
diffs (244 lines):
diff --git a/monetdb5/modules/atoms/inet.c b/monetdb5/modules/atoms/inet.c
--- a/monetdb5/modules/atoms/inet.c
+++ b/monetdb5/modules/atoms/inet.c
@@ -34,15 +34,30 @@
*
*/
typedef struct _inet {
- unsigned char q1;
- unsigned char q2;
- unsigned char q3;
- unsigned char q4;
- unsigned char mask;
- unsigned char filler1;
- unsigned char filler2;
- unsigned char isnil;
+ /* use a union to force alignment compatible with lng */
+ union {
+ struct {
+ unsigned char _q1;
+ unsigned char _q2;
+ unsigned char _q3;
+ unsigned char _q4;
+ unsigned char _mask;
+ unsigned char _filler1;
+ unsigned char _filler2;
+ unsigned char _isnil;
+ } s;
+ lng alignment;
+ } u;
} inet;
+#define q1 u.s._q1
+#define q2 u.s._q2
+#define q3 u.s._q3
+#define q4 u.s._q4
+#define mask u.s._mask
+#define filler1 u.s._filler1
+#define filler2 u.s._filler2
+#define isnil u.s._isnil
+
#ifdef WORDS_BIGENDIAN
/* HACK ALERT: once upon a time, lng_nil was used as inet_nil, but on
* big endian hardware, the byte that is not zero is on the other end;
@@ -72,7 +87,7 @@ mal_export str INET_comp_CSE(bit *retval
mal_export str INETbroadcast(inet *retval, const inet *val);
mal_export str INEThost(str *retval, const inet *val);
mal_export str INETmasklen(int *retval, const inet *val);
-mal_export str INETsetmasklen(inet *retval, const inet *val, const int *mask);
+mal_export str INETsetmasklen(inet *retval, const inet *val, const int *msk);
mal_export str INETnetmask(inet *retval, const inet *val);
mal_export str INEThostmask(inet *retval, const inet *val);
mal_export str INETnetwork(inet *retval, const inet *val);
@@ -82,7 +97,7 @@ mal_export str INET_inet(inet *d, const
mal_export str INET_fromstr(inet *ret, str *s);
mal_export inet *INETnull(void);
-static inet inet_nil = {0,0,0,0,0,0,0,1};
+static inet inet_nil = {{{0,0,0,0,0,0,0,1}}};
/**
* Creates a new inet from the given string.
@@ -399,18 +414,18 @@ INET_comp_CW(bit *retval, const inet *va
* be contained within */
*retval = 0;
} else {
- unsigned int mask;
+ unsigned int msk;
unsigned char m[4];
if (val2->mask > 0)
- mask = ~0U << (32 - val2->mask);
+ msk = ~0U << (32 - val2->mask);
else
- mask = 0;
+ msk = 0;
- m[0] = (mask >> 24) & 0xFF;
- m[1] = (mask >> 16) & 0xFF;
- m[2] = (mask >> 8) & 0xFF;
- m[3] = mask & 0xFF;
+ m[0] = (msk >> 24) & 0xFF;
+ m[1] = (msk >> 16) & 0xFF;
+ m[2] = (msk >> 8) & 0xFF;
+ m[3] = msk & 0xFF;
/* all operations here are done byte based, to avoid byte sex
* problems */
@@ -491,19 +506,19 @@ INETbroadcast(inet *retval, const inet *
{
*retval = *val;
if (!in_isnil(val) && val->mask != 32) {
- unsigned int mask;
+ unsigned int msk;
unsigned char m[4];
if (val->mask > 0)
- mask = ~0U << (32 - val->mask);
+ msk = ~0U << (32 - val->mask);
else
- mask = 0;
+ msk = 0;
- mask = ~mask; /* invert the mask */
- m[0] = (mask >> 24) & 0xFF;
- m[1] = (mask >> 16) & 0xFF;
- m[2] = (mask >> 8) & 0xFF;
- m[3] = mask & 0xFF;
+ msk = ~msk; /* invert the mask */
+ m[0] = (msk >> 24) & 0xFF;
+ m[1] = (msk >> 16) & 0xFF;
+ m[2] = (msk >> 8) & 0xFF;
+ m[3] = msk & 0xFF;
/* if you want to see some bytes, remove this comment
fprintf(stderr, "%x %x %x %x => %x %x %x %x\n",
@@ -564,14 +579,14 @@ INETmasklen(int *retval, const inet *val
* Set netmask length for inet value.
*/
str
-INETsetmasklen(inet *retval, const inet *val, const int *mask)
+INETsetmasklen(inet *retval, const inet *val, const int *msk)
{
- if (*mask < 0 || *mask > 32)
- throw(ILLARG, "inet.setmask", "Illegal netmask length value:
%d", *mask);
+ if (*msk < 0 || *msk > 32)
+ throw(ILLARG, "inet.setmask", "Illegal netmask length value:
%d", *msk);
*retval = *val;
if (!in_isnil(val))
- retval->mask = *mask;
+ retval->mask = *msk;
return (MAL_SUCCEED);
}
@@ -583,18 +598,18 @@ INETnetmask(inet *retval, const inet *va
{
*retval = *val;
if (!in_isnil(val)) {
- unsigned int mask;
+ unsigned int msk;
unsigned char m[4];
if (val->mask > 0)
- mask = ~0U << (32 - val->mask);
+ msk = ~0U << (32 - val->mask);
else
- mask = 0;
+ msk = 0;
- m[0] = (mask >> 24) & 0xFF;
- m[1] = (mask >> 16) & 0xFF;
- m[2] = (mask >> 8) & 0xFF;
- m[3] = mask & 0xFF;
+ m[0] = (msk >> 24) & 0xFF;
+ m[1] = (msk >> 16) & 0xFF;
+ m[2] = (msk >> 8) & 0xFF;
+ m[3] = msk & 0xFF;
retval->q1 = m[0];
retval->q2 = m[1];
@@ -644,18 +659,18 @@ INETnetwork(inet *retval, const inet *va
{
*retval = *val;
if (!in_isnil(val)) {
- unsigned int mask;
+ unsigned int msk;
unsigned char m[4];
if (val->mask > 0)
- mask = ~0U << (32 - val->mask);
+ msk = ~0U << (32 - val->mask);
else
- mask = 0;
+ msk = 0;
- m[0] = (mask >> 24) & 0xFF;
- m[1] = (mask >> 16) & 0xFF;
- m[2] = (mask >> 8) & 0xFF;
- m[3] = mask & 0xFF;
+ m[0] = (msk >> 24) & 0xFF;
+ m[1] = (msk >> 16) & 0xFF;
+ m[2] = (msk >> 8) & 0xFF;
+ m[3] = msk & 0xFF;
retval->q1 &= m[0];
retval->q2 &= m[1];
@@ -707,27 +722,27 @@ INETabbrev(str *retval, const inet *val)
if (in_isnil(val)) {
*retval = GDKstrdup(str_nil);
} else {
- unsigned int mask;
+ unsigned int msk;
unsigned char m[4];
if (val->mask > 0)
- mask = ~0U << (32 - val->mask);
+ msk = ~0U << (32 - val->mask);
else
- mask = 0;
- mask = ~mask; /* invert the mask */
+ msk = 0;
+ msk = ~msk; /* invert the mask */
- m[0] = (mask >> 24) & 0xFF;
- m[1] = (mask >> 16) & 0xFF;
- m[2] = (mask >> 8) & 0xFF;
- m[3] = mask & 0xFF;
+ m[0] = (msk >> 24) & 0xFF;
+ m[1] = (msk >> 16) & 0xFF;
+ m[2] = (msk >> 8) & 0xFF;
+ m[3] = msk & 0xFF;
if ((val->q1 & m[0]) != 0 ||
(val->q2 & m[1]) != 0 ||
(val->q3 & m[2]) != 0 ||
(val->q4 & m[3]) != 0) {
- mask = 32;
+ msk = 32;
} else {
- mask = val->mask;
+ msk = val->mask;
}
/* example: (hex notation)
@@ -740,16 +755,16 @@ INETabbrev(str *retval, const inet *val)
ip = GDKmalloc(sizeof(char) * 19);
- if (mask > 24) {
+ if (msk > 24) {
snprintf(ip, sizeof(char) * 19, "%d.%d.%d.%d/%d",
val->q1, val->q2, val->q3, val->q4,
val->mask);
- } else if (mask > 16) {
+ } else if (msk > 16) {
snprintf(ip, sizeof(char) * 19, "%d.%d.%d/%d",
val->q1, val->q2, val->q3, val->mask);
- } else if (mask > 8) {
+ } else if (msk > 8) {
snprintf(ip, sizeof(char) * 19, "%d.%d/%d",
val->q1, val->q2, val->mask);
- } else if (mask > 0) {
+ } else if (msk > 0) {
snprintf(ip, sizeof(char) * 19, "%d/%d", val->q1,
val->mask);
} else {
snprintf(ip, sizeof(char) * 19, "/0");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list