diff options
author | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2013-01-24 10:52:19 +0000 |
---|---|---|
committer | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2013-01-24 10:52:19 +0000 |
commit | d4ab8c32d0b94be4bc7212a5051c54ad7457a06b (patch) | |
tree | 34bc0472832f4132d81bac6b104657e4b98e1ab1 | |
parent | 018b81a376a505b60d41329608f3ab06c8572723 (diff) |
-fix #2743
git-svn-id: https://gnunet.org/svn/gnunet@25874 140774ce-b5e7-0310-ab8b-a85725594a96
-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 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); |