aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>2018-06-24 17:59:13 +0200
committerSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>2018-06-24 17:59:13 +0200
commitb052576b8a85ac17a80fb7b8fea79d0502f8d95b (patch)
tree627b037fdd0d35078e510010cfa1c4906bd474da /src
parenta60bc39254a063f93f4b193691504e1bba0cb608 (diff)
downloadgnunet-b052576b8a85ac17a80fb7b8fea79d0502f8d95b.tar.gz
gnunet-b052576b8a85ac17a80fb7b8fea79d0502f8d95b.zip
fix https://gnunet.org/bugs/view.php?id=4927
Diffstat (limited to 'src')
-rw-r--r--src/gnsrecord/gnsrecord_serialization.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/gnsrecord/gnsrecord_serialization.c b/src/gnsrecord/gnsrecord_serialization.c
index adbf02755..82b09c24e 100644
--- a/src/gnsrecord/gnsrecord_serialization.c
+++ b/src/gnsrecord/gnsrecord_serialization.c
@@ -89,6 +89,7 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
89 const struct GNUNET_GNSRECORD_Data *rd) 89 const struct GNUNET_GNSRECORD_Data *rd)
90{ 90{
91 size_t ret; 91 size_t ret;
92 size_t no_padding;
92 93
93 ret = sizeof (struct NetworkRecord) * rd_count; 94 ret = sizeof (struct NetworkRecord) * rd_count;
94 for (unsigned int i=0;i<rd_count;i++) 95 for (unsigned int i=0;i<rd_count;i++)
@@ -120,6 +121,25 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
120 GNUNET_break (0); 121 GNUNET_break (0);
121 return -1; 122 return -1;
122 } 123 }
124 //Do not pad PKEY
125 if (GNUNET_GNSRECORD_TYPE_PKEY == rd->record_type)
126 return ret;
127 /**
128 * Efficiently round up to the next
129 * power of 2 for padding
130 * https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
131 */
132 no_padding = ret;
133 ret--;
134 ret |= ret >> 1;
135 ret |= ret >> 2;
136 ret |= ret >> 4;
137 ret |= ret >> 8;
138 ret |= ret >> 16;
139 ret++;
140 //If padding record does not fit, pad again.
141 if ((ret - no_padding) < sizeof (struct NetworkRecord))
142 ret = ret << 1;
123 return (ssize_t) ret; 143 return (ssize_t) ret;
124} 144}
125 145
@@ -135,9 +155,9 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
135 */ 155 */
136ssize_t 156ssize_t
137GNUNET_GNSRECORD_records_serialize (unsigned int rd_count, 157GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
138 const struct GNUNET_GNSRECORD_Data *rd, 158 const struct GNUNET_GNSRECORD_Data *rd,
139 size_t dest_size, 159 size_t dest_size,
140 char *dest) 160 char *dest)
141{ 161{
142 struct NetworkRecord rec; 162 struct NetworkRecord rec;
143 size_t off; 163 size_t off;
@@ -190,7 +210,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
190 } 210 }
191#endif 211#endif
192 } 212 }
193 return off; 213 return dest_size;
194} 214}
195 215
196 216
@@ -205,9 +225,9 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
205 */ 225 */
206int 226int
207GNUNET_GNSRECORD_records_deserialize (size_t len, 227GNUNET_GNSRECORD_records_deserialize (size_t len,
208 const char *src, 228 const char *src,
209 unsigned int rd_count, 229 unsigned int rd_count,
210 struct GNUNET_GNSRECORD_Data *dest) 230 struct GNUNET_GNSRECORD_Data *dest)
211{ 231{
212 struct NetworkRecord rec; 232 struct NetworkRecord rec;
213 size_t off; 233 size_t off;