diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-01-24 10:52:19 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-01-24 10:52:19 +0000 |
commit | 68953a2747692e86cd6d3eb49abf457904768529 (patch) | |
tree | 34bc0472832f4132d81bac6b104657e4b98e1ab1 /src/fs | |
parent | f1649b1c350008f59a99051c5cfefe8ce998b2f3 (diff) | |
download | gnunet-68953a2747692e86cd6d3eb49abf457904768529.tar.gz gnunet-68953a2747692e86cd6d3eb49abf457904768529.zip |
-fix #2743
Diffstat (limited to 'src/fs')
-rw-r--r-- | src/fs/fs_namespace.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/fs/fs_namespace.c b/src/fs/fs_namespace.c index eaff8a6d2..5c16ea4ae 100644 --- a/src/fs/fs_namespace.c +++ b/src/fs/fs_namespace.c | |||
@@ -544,27 +544,36 @@ GNUNET_FS_publish_sks (struct GNUNET_FS_Handle *h, | |||
544 | struct GNUNET_HashCode id; /* hash of hc = identifier */ | 544 | struct GNUNET_HashCode id; /* hash of hc = identifier */ |
545 | struct GNUNET_HashCode query; /* id ^ nsid = DB query */ | 545 | struct GNUNET_HashCode query; /* id ^ nsid = DB query */ |
546 | 546 | ||
547 | if (NULL == meta) | ||
548 | mmeta = GNUNET_CONTAINER_meta_data_create (); | ||
549 | else | ||
550 | mmeta = GNUNET_CONTAINER_meta_data_duplicate (meta); | ||
551 | uris = GNUNET_FS_uri_to_string (uri); | ||
552 | slen = strlen (uris) + 1; | ||
553 | idlen = strlen (identifier); | 547 | idlen = strlen (identifier); |
554 | if (NULL != update) | 548 | if (NULL != update) |
555 | nidlen = strlen (update) + 1; | 549 | nidlen = strlen (update) + 1; |
556 | else | 550 | else |
557 | nidlen = 1; | 551 | nidlen = 1; |
552 | uris = GNUNET_FS_uri_to_string (uri); | ||
553 | slen = strlen (uris) + 1; | ||
554 | if ( (slen >= MAX_SBLOCK_SIZE - sizeof (struct SBlock)) || | ||
555 | (nidlen >= MAX_SBLOCK_SIZE - sizeof (struct SBlock) - slen) ) | ||
556 | { | ||
557 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
558 | _("Identifiers or URI too long to create SBlock")); | ||
559 | GNUNET_free (uris); | ||
560 | return NULL; | ||
561 | } | ||
562 | if (NULL == meta) | ||
563 | mmeta = GNUNET_CONTAINER_meta_data_create (); | ||
564 | else | ||
565 | mmeta = GNUNET_CONTAINER_meta_data_duplicate (meta); | ||
558 | mdsize = GNUNET_CONTAINER_meta_data_get_serialized_size (mmeta); | 566 | mdsize = GNUNET_CONTAINER_meta_data_get_serialized_size (mmeta); |
559 | size = sizeof (struct SBlock) + slen + nidlen + mdsize; | 567 | size = sizeof (struct SBlock) + slen + nidlen + mdsize; |
560 | if (size > MAX_SBLOCK_SIZE) | 568 | if ( (size > MAX_SBLOCK_SIZE) || |
569 | (size < sizeof (struct SBlock) + slen + nidlen) ) | ||
561 | { | 570 | { |
562 | size = MAX_SBLOCK_SIZE; | 571 | size = MAX_SBLOCK_SIZE; |
563 | mdsize = size - (sizeof (struct SBlock) + slen + nidlen); | 572 | mdsize = MAX_SBLOCK_SIZE - (sizeof (struct SBlock) + slen + nidlen); |
564 | } | 573 | } |
565 | sb = GNUNET_malloc (sizeof (struct SBlock) + size); | 574 | sb = GNUNET_malloc (sizeof (struct SBlock) + size); |
566 | dest = (char *) &sb[1]; | 575 | dest = (char *) &sb[1]; |
567 | if (update != NULL) | 576 | if (NULL != update) |
568 | memcpy (dest, update, nidlen); | 577 | memcpy (dest, update, nidlen); |
569 | else | 578 | else |
570 | memset (dest, 0, 1); | 579 | memset (dest, 0, 1); |