diff options
author | Christian Grothoff <christian@grothoff.org> | 2019-11-09 21:36:19 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2019-11-09 21:36:19 +0100 |
commit | 77b0e836d1ca5b1aec45ba6c4c901153a22ab196 (patch) | |
tree | bfeabf4306d0d23d9e571c75b7681bf0c6b99a74 | |
parent | c0a87f108718a891585b8da35005646ff0b4db34 (diff) | |
download | exchange-77b0e836d1ca5b1aec45ba6c4c901153a22ab196.tar.gz exchange-77b0e836d1ca5b1aec45ba6c4c901153a22ab196.zip |
fix off by one: reserve space for 0-termination
-rw-r--r-- | src/util/util.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/src/util/util.c b/src/util/util.c index 10d5d53f7..fa65fc238 100644 --- a/src/util/util.c +++ b/src/util/util.c | |||
@@ -265,25 +265,22 @@ TALER_url_join (const char *base_url, | |||
265 | unsigned int iparam = 0; | 265 | unsigned int iparam = 0; |
266 | va_list args; | 266 | va_list args; |
267 | struct TALER_Buffer buf = { 0 }; | 267 | struct TALER_Buffer buf = { 0 }; |
268 | size_t len = 0; | 268 | size_t len; |
269 | 269 | ||
270 | GNUNET_assert (NULL != base_url); | 270 | GNUNET_assert (NULL != base_url); |
271 | GNUNET_assert (NULL != path); | 271 | GNUNET_assert (NULL != path); |
272 | 272 | if (0 == strlen (base_url)) | |
273 | if (strlen (base_url) == 0) | ||
274 | { | 273 | { |
275 | /* base URL can't be empty */ | 274 | /* base URL can't be empty */ |
276 | GNUNET_break (0); | 275 | GNUNET_break (0); |
277 | return NULL; | 276 | return NULL; |
278 | } | 277 | } |
279 | |||
280 | if ('/' != base_url[strlen (base_url) - 1]) | 278 | if ('/' != base_url[strlen (base_url) - 1]) |
281 | { | 279 | { |
282 | /* Must be an actual base URL! */ | 280 | /* Must be an actual base URL! */ |
283 | GNUNET_break (0); | 281 | GNUNET_break (0); |
284 | return NULL; | 282 | return NULL; |
285 | } | 283 | } |
286 | |||
287 | if ('/' == path[0]) | 284 | if ('/' == path[0]) |
288 | { | 285 | { |
289 | /* The path must be relative. */ | 286 | /* The path must be relative. */ |
@@ -291,14 +288,14 @@ TALER_url_join (const char *base_url, | |||
291 | return NULL; | 288 | return NULL; |
292 | } | 289 | } |
293 | 290 | ||
294 | // Path should be relative to existing path of base URL | 291 | /* Path should be relative to existing path of base URL */ |
295 | GNUNET_break ('/' != path[0]); | 292 | GNUNET_break ('/' != path[0]); |
296 | 293 | ||
297 | if ('/' == path[0]) | 294 | if ('/' == path[0]) |
298 | GNUNET_break (0); | 295 | GNUNET_break (0); |
299 | 296 | ||
300 | /* 1st pass: compute length */ | 297 | /* 1st pass: compute length */ |
301 | len += strlen (base_url) + strlen (path); | 298 | len = strlen (base_url) + strlen (path) + 1; |
302 | 299 | ||
303 | va_start (args, path); | 300 | va_start (args, path); |
304 | while (1) | 301 | while (1) |
@@ -316,7 +313,6 @@ TALER_url_join (const char *base_url, | |||
316 | va_end (args); | 313 | va_end (args); |
317 | 314 | ||
318 | TALER_buffer_prealloc (&buf, len); | 315 | TALER_buffer_prealloc (&buf, len); |
319 | |||
320 | TALER_buffer_write_str (&buf, base_url); | 316 | TALER_buffer_write_str (&buf, base_url); |
321 | TALER_buffer_write_str (&buf, path); | 317 | TALER_buffer_write_str (&buf, path); |
322 | 318 | ||
@@ -325,6 +321,7 @@ TALER_url_join (const char *base_url, | |||
325 | { | 321 | { |
326 | char *key; | 322 | char *key; |
327 | char *value; | 323 | char *value; |
324 | |||
328 | key = va_arg (args, char *); | 325 | key = va_arg (args, char *); |
329 | if (NULL == key) | 326 | if (NULL == key) |
330 | break; | 327 | break; |