int imap_msgpart_url_create(struct mail_user *user, const struct imap_url *url, struct imap_msgpart_url **mpurl_r, const char **error_r) { const char *section = url->section == NULL ? "" : url->section; struct imap_msgpart_url *mpurl; struct imap_msgpart *msgpart; i_assert(url->mailbox != NULL && url->uid != 0 && url->search_program == NULL); if (imap_msgpart_parse(section, &msgpart) < 0) { *error_r = "Invalid section"; return -1; } mpurl = i_new(struct imap_msgpart_url, 1); mpurl->part = msgpart; mpurl->user = user; mpurl->mailbox = i_strdup(url->mailbox); mpurl->uidvalidity = url->uidvalidity; mpurl->uid = url->uid; if (url->section != NULL) mpurl->section = i_strdup(url->section); mpurl->partial_offset = url->partial_offset; mpurl->partial_size = url->partial_size; imap_msgpart_set_partial(msgpart, url->partial_offset, url->partial_size == 0 ? (uoff_t)-1 : url->partial_size); *mpurl_r = mpurl; return 0; }
static int body_parse_partial(struct imap_fetch_body_data *body, const char *p, const char **error_r) { uoff_t offset, size = (uoff_t)-1; if (*p == '\0') return 0; /* <start.end> */ if (*p != '<') { *error_r = "Unexpected data after ']'"; return -1; } p++; body->partial = TRUE; if (read_uoff_t(&p, &offset) < 0 || offset > OFF_T_MAX) { /* wrapped */ *error_r = "Too big partial start"; return -1; } if (*p == '.') { p++; if (read_uoff_t(&p, &size) < 0 || size > OFF_T_MAX) { /* wrapped */ *error_r = "Too big partial end"; return -1; } } if (*p != '>') { *error_r = "Missing '>' in partial"; return -1; } if (p[1] != '\0') { *error_r = "Unexpected data after '>'"; return -1; } imap_msgpart_set_partial(body->msgpart, offset, size); return 0; }