Diff for /libaitwww/src/mime.c between versions 1.1 and 1.2

version 1.1, 2012/03/08 23:40:21 version 1.2, 2012/03/10 00:26:49
Line 169  hdrValue(const char *str, size_t len, const char **end Line 169  hdrValue(const char *str, size_t len, const char **end
   
         e = str + len;          e = str + len;
         while (str < e) {          while (str < e) {
                if ((crlf = findtextpos(str, e - str, CRLF, strlen(CRLF)))) {                if (!(crlf = findtextpos(str, e - str, CRLF, strlen(CRLF)))) {
                        www_SetErr(EBADMSG, "Bad MIME format message");                        www_SetErr(EBADMSG, "Bad header format of MIME part");
                         return NULL;                          return NULL;
                 }                  }
   
Line 328  mime_parseMultiPart(const char *str, size_t len, const Line 328  mime_parseMultiPart(const char *str, size_t len, const
         mime_t *mime = NULL;          mime_t *mime = NULL;
         struct iovec bd[2];          struct iovec bd[2];
         struct tagMIME *m, *old = NULL;          struct tagMIME *m, *old = NULL;
        const char *next;        const char *next = NULL;
   
         if (!str | !bdtag) {          if (!str | !bdtag) {
                 www_SetErr(EINVAL, "String or boundary tag is NULL");                  www_SetErr(EINVAL, "String or boundary tag is NULL");
Line 359  mime_parseMultiPart(const char *str, size_t len, const Line 359  mime_parseMultiPart(const char *str, size_t len, const
                 return NULL;                  return NULL;
         } else          } else
                 bd[1].iov_len = strlen(bd[1].iov_base);                  bd[1].iov_len = strlen(bd[1].iov_base);
   
           /* check boundary tag */
         if (memcmp(str, strstr(bd[0].iov_base, "--"), strlen(strstr(bd[0].iov_base, "--")))) {          if (memcmp(str, strstr(bd[0].iov_base, "--"), strlen(strstr(bd[0].iov_base, "--")))) {
                 www_SetErr(EBADMSG, "Bad content data, not found boundary tag");                  www_SetErr(EBADMSG, "Bad content data, not found boundary tag");
                 free(bd[1].iov_base);                  free(bd[1].iov_base);
Line 370  mime_parseMultiPart(const char *str, size_t len, const Line 372  mime_parseMultiPart(const char *str, size_t len, const
                 len -= strlen(strstr(bd[0].iov_base, "--"));                  len -= strlen(strstr(bd[0].iov_base, "--"));
         }          }
   
        while (42) {        while (len > 0) {
                 m = malloc(sizeof(struct tagMIME));                  m = malloc(sizeof(struct tagMIME));
                 if (!m) {                  if (!m) {
                         LOGERR;                          LOGERR;
Line 413  mime_parseMultiPart(const char *str, size_t len, const Line 415  mime_parseMultiPart(const char *str, size_t len, const
         }          }
   
         str += bd[0].iov_len;          str += bd[0].iov_len;
           /* LLVM static code analyzer said for this - unusable
            *
         len -= bd[0].iov_len;          len -= bd[0].iov_len;
           */
   
           free(bd[1].iov_base);
           free(bd[0].iov_base);
   
         if (end)          if (end)
                 *end = str;                  *end = str;
         return mime;          return mime;
Line 512  mime_parseHeader(struct tagMIME * __restrict m, const  Line 520  mime_parseHeader(struct tagMIME * __restrict m, const 
                 }                  }
                 /* get value */                  /* get value */
                 c->cgi_value = hdrValue(colon + 1, e - colon - 1, &str);                  c->cgi_value = hdrValue(colon + 1, e - colon - 1, &str);
                   if (!c->cgi_value) {
                           free(c->cgi_name);
                           free(c);
                           freeHeader(m);
                           return -1;
                   }
   
                 if (!old)                  if (!old)
                         SLIST_INSERT_HEAD(&m->mime_header, c, cgi_node);                          SLIST_INSERT_HEAD(&m->mime_header, c, cgi_node);
Line 539  mime_getValue(struct tagMIME * __restrict m, const cha Line 553  mime_getValue(struct tagMIME * __restrict m, const cha
         const char *v = NULL;          const char *v = NULL;
   
         SLIST_FOREACH(c, &m->mime_header, cgi_node)          SLIST_FOREACH(c, &m->mime_header, cgi_node)
                if (!strcmp(c->cgi_name, name)) {                if (!strcasecmp(c->cgi_name, name)) {
                         v = c->cgi_value;                          v = c->cgi_value;
                         break;                          break;
                 }                  }
Line 561  mime_readPart(struct tagMIME * __restrict m, const cha Line 575  mime_readPart(struct tagMIME * __restrict m, const cha
         cgi_t *attr;          cgi_t *attr;
         struct iovec bd;          struct iovec bd;
   
        if (!m || !str) {        if (!m || !str || (ssize_t) len < 0) {
                www_SetErr(EINVAL, "Mime part or string is NULL");                www_SetErr(EINVAL, "Mime part, string is NULL or length is less 0");
                 return -1;                  return -1;
         }          }
   
Line 573  mime_readPart(struct tagMIME * __restrict m, const cha Line 587  mime_readPart(struct tagMIME * __restrict m, const cha
         if (!ct || www_cmptype(ct, "multipart")) {          if (!ct || www_cmptype(ct, "multipart")) {
                 /* not multi part, assign like body element */                  /* not multi part, assign like body element */
                 m->mime_body.iov_base = malloc(len - (eoh - str) + 1);                  m->mime_body.iov_base = malloc(len - (eoh - str) + 1);
                   if (!m->mime_body.iov_base) {
                           LOGERR;
                           freeHeader(m);
                           return -1;
                   }
                 memcpy(m->mime_body.iov_base, eoh, len - (eoh - str));                  memcpy(m->mime_body.iov_base, eoh, len - (eoh - str));
                 ((char*) m->mime_body.iov_base)[len - (eoh - str)] = 0;                  ((char*) m->mime_body.iov_base)[len - (eoh - str)] = 0;
                 m->mime_body.iov_len = len - (eoh - str) + 1;                  m->mime_body.iov_len = len - (eoh - str) + 1;
         } else {          } else {
                 /* multi part */                  /* multi part */
                 attr = www_parseAttributes(&ct);                  attr = www_parseAttributes(&ct);
                if (!attr)                if (!attr) {
                         freeHeader(m);
                         return -1;                          return -1;
                   }
                 bd.iov_base = bd_begin(www_getAttribute(attr, "boundary"));                  bd.iov_base = bd_begin(www_getAttribute(attr, "boundary"));
                 bd.iov_len = strlen(bd.iov_base);                  bd.iov_len = strlen(bd.iov_base);
                 eb = findtextpos(eoh, len - (eoh - str), bd.iov_base, bd.iov_len);                  eb = findtextpos(eoh, len - (eoh - str), bd.iov_base, bd.iov_len);
Line 592  mime_readPart(struct tagMIME * __restrict m, const cha Line 613  mime_readPart(struct tagMIME * __restrict m, const cha
                         if (!m->mime_prolog.iov_base) {                          if (!m->mime_prolog.iov_base) {
                                 LOGERR;                                  LOGERR;
                                 www_freeAttributes(&attr);                                  www_freeAttributes(&attr);
                                   freeHeader(m);
                                 return -1;                                  return -1;
                         }                          }
                         memcpy(m->mime_prolog.iov_base, eoh, eb - eoh);                          memcpy(m->mime_prolog.iov_base, eoh, eb - eoh);
Line 608  mime_readPart(struct tagMIME * __restrict m, const cha Line 630  mime_readPart(struct tagMIME * __restrict m, const cha
                         if (!m->mime_epilog.iov_base) {                          if (!m->mime_epilog.iov_base) {
                                 LOGERR;                                  LOGERR;
                                 www_freeAttributes(&attr);                                  www_freeAttributes(&attr);
                                   freeHeader(m);
                                 return -1;                                  return -1;
                         }                          }
                         memcpy(m->mime_epilog.iov_base, str, len - (eoh - str));                          memcpy(m->mime_epilog.iov_base, str, len - (eoh - str));
Line 615  mime_readPart(struct tagMIME * __restrict m, const cha Line 638  mime_readPart(struct tagMIME * __restrict m, const cha
                         m->mime_epilog.iov_len = len - (eoh - str) + 1;                          m->mime_epilog.iov_len = len - (eoh - str) + 1;
   
                 }                  }
   
                   www_freeAttributes(&attr);
         }          }
   
         www_freeAttributes(&attr);  
         return 0;          return 0;
 }  }
   

Removed from v.1.1  
changed lines
  Added in v.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>