diff options
author | Schanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de> | 2018-06-24 17:59:13 +0200 |
---|---|---|
committer | Schanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de> | 2018-06-24 17:59:13 +0200 |
commit | b052576b8a85ac17a80fb7b8fea79d0502f8d95b (patch) | |
tree | 627b037fdd0d35078e510010cfa1c4906bd474da /src/gnsrecord/gnsrecord_serialization.c | |
parent | a60bc39254a063f93f4b193691504e1bba0cb608 (diff) | |
download | gnunet-b052576b8a85ac17a80fb7b8fea79d0502f8d95b.tar.gz gnunet-b052576b8a85ac17a80fb7b8fea79d0502f8d95b.zip |
fix https://gnunet.org/bugs/view.php?id=4927
Diffstat (limited to 'src/gnsrecord/gnsrecord_serialization.c')
-rw-r--r-- | src/gnsrecord/gnsrecord_serialization.c | 34 |
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 | */ |
136 | ssize_t | 156 | ssize_t |
137 | GNUNET_GNSRECORD_records_serialize (unsigned int rd_count, | 157 | GNUNET_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 | */ |
206 | int | 226 | int |
207 | GNUNET_GNSRECORD_records_deserialize (size_t len, | 227 | GNUNET_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; |