Text   |  XML   |  ReML   |   Visible Warnings:

Unreasonable Size Argument  at buffer.c:252

No properties have been set. | edit properties
Jump to warning location ↓ warning details...
Show Events | Options

mail_index_fsck_keywords

(/home/sate/Testcases/c/cve/dovecot-1.2.0/src/lib-index/mail-index-fsck.c)expand/collapse
Show more  
 129  mail_index_fsck_keywords(struct mail_index *index, struct mail_index_map *map,
 130                           struct mail_index_header *hdr,
 131                           const struct mail_index_ext_header *ext_hdr,
 132                           unsigned int ext_offset, unsigned int *offset_p)
 133  {
 134          const struct mail_index_keyword_header *kw_hdr;
 135          struct mail_index_keyword_header *new_kw_hdr;
 136          const struct mail_index_keyword_header_rec *kw_rec;
 137          struct mail_index_keyword_header_rec new_kw_rec;
 138          const char *name, *name_buffer, **name_array;
 139          unsigned int i, j, name_pos, name_size, rec_pos, hdr_offset, diff;
 140          unsigned int changed_count, keywords_count, name_base_pos;
 141          ARRAY_TYPE(const_string) names;
 142          buffer_t *dest;
 143          bool changed = FALSE;
 144   
 145          hdr_offset = ext_offset +
 146                  mail_index_map_ext_hdr_offset(sizeof(MAIL_INDEX_EXT_KEYWORDS)-1);
 147          kw_hdr = CONST_PTR_OFFSET(map->hdr_base, hdr_offset);
 148          keywords_count = kw_hdr->keywords_count;
 149   
 150          kw_rec = (const void *)(kw_hdr + 1);
 151          name_buffer = (const char *)(kw_rec + keywords_count);
 152   
 153          name_pos = (size_t)(name_buffer - (const char *)kw_hdr);
 154          if (name_pos > ext_hdr->hdr_size) {
 155                  /* the header is completely broken */
 156                  keywords_count =
 157                          mail_index_fsck_find_keyword_count(map, ext_hdr);
 158                  mail_index_fsck_error(index, "Assuming keywords_count = %u",
 159                                        keywords_count);
 160                  kw_rec = NULL;
 161                  name_size = 0;
 162                  changed = TRUE;
 163          } else {
 164                  name_size = ext_hdr->hdr_size - name_pos;
 165          }
 166   
 167          /* create keyword name array. invalid keywords are added as 
 168             empty strings */
 169          t_array_init(&names, keywords_count);
 170          for (i = 0; i < keywords_count; i++) {
 171                  if (name_size == 0 ||
 172                      !keyword_name_is_valid(name_buffer, kw_rec[i].name_offset,
 173                                             name_size))
 174                          name = "";
 175                  else 
 176                          name = name_buffer + kw_rec[i].name_offset;
 177   
 178                  if (*name != '\0' && array_has_name(&names, name)) {
 179                          /* duplicate */
 180                          name = "";
 181                  }
 182                  array_append(&names, &name, 1);
 183          }
 184   
 185          /* give new names to invalid keywords */
 186          changed_count = 0;
 187          name_array = array_idx_modifiable(&names, 0);
 188          for (i = j = 0; i < keywords_count; i++) {
 189                  while (name_array[i][0] == '\0') {
 190                          name = t_strdup_printf("unknown-%d", j++);
 191                          if (!array_has_name(&names, name)) {
 192                                  name_array[i] = name;
 193                                  changed = TRUE;
 194                                  changed_count++;
 195                          }
 196                  }
 197          }
 198   
 199          if (!changed) {
 200                  /* nothing was broken */
 201                  return;
 202          }
 203   
 204          mail_index_fsck_error(index, "Renamed %u keywords to unknown-*",
 205                                changed_count);
 206   
 207          dest = buffer_create_dynamic(default_pool,
 208                                       I_MAX(ext_hdr->hdr_size, 128));
 209          new_kw_hdr = buffer_append_space_unsafe(dest, sizeof(*new_kw_hdr));
 210          new_kw_hdr->keywords_count = keywords_count;
 211   
 212          /* add keyword records so we can start appending names directly */
 213          rec_pos = dest->used;
 214          memset(&new_kw_rec, 0, sizeof(new_kw_rec));
 215          buffer_append_space_unsafe(dest, keywords_count * sizeof(*kw_rec));
 216   
 217          /* write the actual records and names */
 218          name_base_pos = dest->used;
 219          for (i = 0; i < keywords_count; i++) {
 220                  new_kw_rec.name_offset = dest->used - name_base_pos;
 221                  buffer_write(dest, rec_pos, &new_kw_rec, sizeof(new_kw_rec));
 222                  rec_pos += sizeof(*kw_rec);
 223   
 224                  buffer_append(dest, name_array[i], strlen(name_array[i]) + 1);
 225          }
 226   
 227          /* keep the header size at least the same size as before */
 228          if (dest->used < ext_hdr->hdr_size)
 229                  buffer_append_zero(dest, ext_hdr->hdr_size - dest->used);
 230   
 231          if (dest->used > ext_hdr->hdr_size) {
 232                  /* need to resize the header */
 233                  struct mail_index_ext_header new_ext_hdr;
 234   
 235                  diff = dest->used - ext_hdr->hdr_size;
 236                  buffer_copy(map->hdr_copy_buf, hdr_offset + diff,
 237[+]                             map->hdr_copy_buf, hdr_offset, (size_t)-1);
expand/collapse

buffer_copy

(/home/sate/Testcases/c/cve/dovecot-1.2.0/src/lib/buffer.c)expand/collapse
Show more  
 236  void buffer_copy(buffer_t *_dest, size_t dest_pos,
 237                   const buffer_t *_src, size_t src_pos, size_t copy_size)
 238  {
 239          struct real_buffer *dest = (struct real_buffer *)_dest;
 240          const struct real_buffer *src = (const struct real_buffer *)_src;
 241          size_t max_size;
 242   
 243          i_assert(src_pos <= src->used);
 244   
 245          max_size = src->used - src_pos;
 246          if (copy_size > max_size)
 247                  copy_size = max_size;
 248   
 249          buffer_check_limits(dest, dest_pos, copy_size);
 250          if (src == dest) {
 251                  memmove(dest->w_buffer + dest_pos,
 252                          src->r_buffer + src_pos, copy_size);
Show more  
Show more  




Change Warning 7211.24878 : Unreasonable Size Argument

Priority:
State:
Finding:
Owner:
Note: