Fix potential unaligned access
authorGuillaume Lager <g.lager@innoseis.com>
Fri, 9 Dec 2016 09:02:08 +0000 (10:02 +0100)
committerGuillaume Lager <g.lager@innoseis.com>
Fri, 9 Dec 2016 15:38:29 +0000 (16:38 +0100)
If the type is string, do not try to deference it as int16, int32 or int64.
This may lead to unalign memory access, which may cause trap on some architectures (ARM)

pb_encode.c

index b0a736a..00c381c 100644 (file)
@@ -220,11 +220,15 @@ static bool checkreturn encode_basic_field(pb_ostream_t *stream,
             if(bytes->size == 0)
                 implicit_has = false;
         }
-        else if ((PB_LTYPE(field->type) == PB_LTYPE_STRING && *(const char*)pData == '\0') ||
-                (field->data_size == sizeof(uint_least8_t) && *(const uint_least8_t*)pData == 0) ||
-                (field->data_size == sizeof(uint_least16_t) && *(const uint_least16_t*)pData == 0) ||
-                (field->data_size == sizeof(uint32_t) && *(const uint_least32_t*)pData == 0) ||
-                (field->data_size == sizeof(uint64_t) && *(const uint_least64_t*)pData == 0))                   
+        else if (PB_LTYPE(field->type) == PB_LTYPE_STRING )
+        {
+               if( *(const char*)pData == '\0')
+                                implicit_has = false;
+        }
+               else if ((field->data_size == sizeof(uint_least8_t) && *(const uint_least8_t*)pData == 0) ||
+                 (field->data_size == sizeof(uint_least16_t) && *(const uint_least16_t*)pData == 0) ||
+                 (field->data_size == sizeof(uint32_t) && *(const uint_least32_t*)pData == 0) ||
+                        (field->data_size == sizeof(uint64_t) && *(const uint_least64_t*)pData == 0))
         {                   
             implicit_has = false;
         }