aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-11-09 21:36:19 +0100
committerChristian Grothoff <christian@grothoff.org>2019-11-09 21:36:19 +0100
commit77b0e836d1ca5b1aec45ba6c4c901153a22ab196 (patch)
treebfeabf4306d0d23d9e571c75b7681bf0c6b99a74
parentc0a87f108718a891585b8da35005646ff0b4db34 (diff)
downloadexchange-77b0e836d1ca5b1aec45ba6c4c901153a22ab196.tar.gz
exchange-77b0e836d1ca5b1aec45ba6c4c901153a22ab196.zip
fix off by one: reserve space for 0-termination
-rw-r--r--src/util/util.c13
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;