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

Reply via email to