Text   |  XML   |  ReML   |   Visible Warnings:

Redundant Condition  at virtual-sync.c:170

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

virtual_sync_ext_header_read

(/home/sate/Testcases/c/cve/dovecot-1.2.0/src/plugins/virtual/virtual-sync.c)expand/collapse
Show more  
 133  static bool virtual_sync_ext_header_read(struct virtual_sync_context *ctx)
 134  {
 135          const struct virtual_mail_index_header *ext_hdr;
 136          const struct mail_index_header *hdr;
 137          const struct virtual_mail_index_mailbox_record *mailboxes;
 138          struct virtual_backend_box *bbox, **bboxes;
 139          const void *ext_data;
 140          size_t ext_size;
 141          unsigned int i, count, ext_name_offset, ext_mailbox_count;
 142          uint32_t prev_mailbox_id;
 143          bool ret = TRUE;
 144   
 145          hdr = mail_index_get_header(ctx->sync_view);
 146          mail_index_get_header_ext(ctx->sync_view, ctx->mbox->virtual_ext_id,
 147                                    &ext_data, &ext_size);
 148          ext_hdr = ext_data;
 149          if (ctx->mbox->sync_initialized &&
 150              ctx->mbox->prev_uid_validity == hdr->uid_validity &&
 151              ext_size >= sizeof(*ext_hdr) &&
 152              ctx->mbox->prev_change_counter == ext_hdr->change_counter) {
 153                  /* fully refreshed */
 154                  return TRUE;
 155          }
 156   
 157          ctx->mbox->sync_initialized = TRUE;
 158          ctx->mbox->prev_uid_validity = hdr->uid_validity;
 159          if (ext_hdr == NULL ||
 160              ctx->mbox->search_args_crc32 != ext_hdr->search_args_crc32) {
 161                  mailboxes = NULL;
 162                  ext_name_offset = 0;
 163                  ext_mailbox_count = 0;
 164          } else {
 165                  ctx->mbox->prev_change_counter = ext_hdr->change_counter;
 166                  mailboxes = (const void *)(ext_hdr + 1);
 167                  ext_name_offset = sizeof(*ext_hdr) +
 168                          ext_hdr->mailbox_count * sizeof(*mailboxes);
 169                  if (ext_name_offset >= ext_size ||
 170                      ext_hdr->mailbox_count > INT_MAX/sizeof(*mailboxes)) {
 171                          i_error("virtual index %s: Broken mailbox_count header",
 172                                  ctx->mbox->path);
 173                          ctx->index_broken = TRUE;
 174                          ext_mailbox_count = 0;
 175                          ret = FALSE;
 176                  } else {
 177                          ext_mailbox_count = ext_hdr->mailbox_count;
 178                  }
 179          }
 180   
 181          /* update mailbox backends */
 182          prev_mailbox_id = 0;
 183          for (i = 0; i < ext_mailbox_count; i++) {
 184                  if (mailboxes[i].id > ext_hdr->highest_mailbox_id ||
 185                      mailboxes[i].id <= prev_mailbox_id) {
 186                          i_error("virtual index %s: Broken mailbox id",
 187                                  ctx->mbox->path);
 188                          break;
 189                  }
 190                  if (mailboxes[i].name_len == 0 ||
 191                      mailboxes[i].name_len > ext_size) {
 192                          i_error("virtual index %s: Broken mailbox name_len",
 193                                  ctx->mbox->path);
 194                          break;
 195                  }
 196                  if (ext_name_offset + mailboxes[i].name_len > ext_size) {
 197                          i_error("virtual index %s: Broken mailbox list",
 198                                  ctx->mbox->path);
 199                          break;
 200                  }
 201                  T_BEGIN {
 202                          const unsigned char *nameptr;
 203                          const char *name;
 204   
 205                          nameptr = CONST_PTR_OFFSET(ext_data, ext_name_offset);
 206                          name = t_strndup(nameptr, mailboxes[i].name_len);
 207                          bbox = virtual_backend_box_lookup_name(ctx->mbox, name);
 208                  } T_END;
 209                  if (bbox == NULL) {
 210                          /* mailbox no longer exists */
 211                          ret = FALSE;
 212                  } else {
 213                          bbox->mailbox_id = mailboxes[i].id;
 214                          bbox->sync_uid_validity = mailboxes[i].uid_validity;
 215                          bbox->sync_highest_modseq = mailboxes[i].highest_modseq;
 216                          bbox->sync_next_uid = mailboxes[i].next_uid;
 217                          bbox->sync_mailbox_idx = i;
 218                  }
 219                  ext_name_offset += mailboxes[i].name_len;
 220                  prev_mailbox_id = mailboxes[i].id;
 221          }
 222          if (i < ext_mailbox_count) {
 223                  ctx->index_broken = TRUE;
 224                  ret = FALSE;
 225          }
 226          ctx->mbox->highest_mailbox_id = ext_hdr == NULL ? 0 :
 227                  ext_hdr->highest_mailbox_id;
 228   
 229          /* assign new mailbox IDs if any are missing */
 230          bboxes = array_get_modifiable(&ctx->mbox->backend_boxes, &count);
 231          for (i = 0; i < count; i++) {
 232                  if (bboxes[i]->mailbox_id == 0) {
 233                          bboxes[i]->mailbox_id = ++ctx->mbox->highest_mailbox_id;
 234                          ret = FALSE;
 235                  }
 236          }
 237          /* sort the backend mailboxes by mailbox_id. */
 238          qsort(bboxes, count, sizeof(*bboxes), bbox_mailbox_id_cmp);
 239          return ret;
 240  }
Show more  




Change Warning 8154.24561 : Redundant Condition

Priority:
State:
Finding:
Owner:
Note: