aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96>2013-01-24 10:52:19 +0000
committergrothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96>2013-01-24 10:52:19 +0000
commitd4ab8c32d0b94be4bc7212a5051c54ad7457a06b (patch)
tree34bc0472832f4132d81bac6b104657e4b98e1ab1
parent018b81a376a505b60d41329608f3ab06c8572723 (diff)
-fix #2743
git-svn-id: https://gnunet.org/svn/gnunet@25874 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r--src/fs/fs_namespace.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/fs/fs_namespace.c b/src/fs/fs_namespace.c
index eaff8a6d2b..5c16ea4ae8 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,
struct GNUNET_HashCode id; /* hash of hc = identifier */
struct GNUNET_HashCode query; /* id ^ nsid = DB query */
- if (NULL == meta)
- mmeta = GNUNET_CONTAINER_meta_data_create ();
- else
- mmeta = GNUNET_CONTAINER_meta_data_duplicate (meta);
- uris = GNUNET_FS_uri_to_string (uri);
- slen = strlen (uris) + 1;
idlen = strlen (identifier);
if (NULL != update)
nidlen = strlen (update) + 1;
else
nidlen = 1;
+ uris = GNUNET_FS_uri_to_string (uri);
+ slen = strlen (uris) + 1;
+ if ( (slen >= MAX_SBLOCK_SIZE - sizeof (struct SBlock)) ||
+ (nidlen >= MAX_SBLOCK_SIZE - sizeof (struct SBlock) - slen) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Identifiers or URI too long to create SBlock"));
+ GNUNET_free (uris);
+ return NULL;
+ }
+ if (NULL == meta)
+ mmeta = GNUNET_CONTAINER_meta_data_create ();
+ else
+ mmeta = GNUNET_CONTAINER_meta_data_duplicate (meta);
mdsize = GNUNET_CONTAINER_meta_data_get_serialized_size (mmeta);
size = sizeof (struct SBlock) + slen + nidlen + mdsize;
- if (size > MAX_SBLOCK_SIZE)
+ if ( (size > MAX_SBLOCK_SIZE) ||
+ (size < sizeof (struct SBlock) + slen + nidlen) )
{
size = MAX_SBLOCK_SIZE;
- mdsize = size - (sizeof (struct SBlock) + slen + nidlen);
+ mdsize = MAX_SBLOCK_SIZE - (sizeof (struct SBlock) + slen + nidlen);
}
sb = GNUNET_malloc (sizeof (struct SBlock) + size);
dest = (char *) &sb[1];
- if (update != NULL)
+ if (NULL != update)
memcpy (dest, update, nidlen);
else
memset (dest, 0, 1);