add some more NULL-pointer-checks; free allocated mem in case of OOM.
[citadel.git] / libcitadel / lib / stringbuf.c
index 31e99b52f06c15a477990a726314595cdda34956..7eac317a9b54fc50df8746844fcd11424ff9ad44 100644 (file)
@@ -30,9 +30,6 @@
 #define SHOW_ME_VAPPEND_PRINTF
 #include <stdarg.h>
 
-#ifndef LINUX_SENDFILE
-#include <sys/sendfile.h>
-#endif
 #include "libcitadel.h"
 
 #ifdef HAVE_ICONV
@@ -514,6 +511,7 @@ StrBuf* NewStrBufPlain(const char* ptr, int nChars)
 
        if (Siz == 0)
        {
+               free(NewBuf);
                return NULL;
        }
 
@@ -614,7 +612,7 @@ StrBuf* _NewConstStrBuf(const char* StringConstant, size_t SizeOfStrConstant)
  */
 int FlushStrBuf(StrBuf *buf)
 {
-       if (buf == NULL)
+       if ((buf == NULL) || (buf->buf == NULL))
                return -1;
        if (buf->ConstBuf)
                return -1;       
@@ -818,7 +816,8 @@ long StrBufPook(StrBuf *Buf, const char* ptr, long nThChar, long nChars, char Po
  */
 void StrBufAppendBuf(StrBuf *Buf, const StrBuf *AppendBuf, unsigned long Offset)
 {
-       if ((AppendBuf == NULL) || (Buf == NULL) || (AppendBuf->buf == NULL))
+       if ((AppendBuf == NULL) || (AppendBuf->buf == NULL) ||
+           (Buf == NULL) || (Buf->buf == NULL))
                return;
 
        if (Buf->BufSize - Offset < AppendBuf->BufUsed + Buf->BufUsed + 1)
@@ -1065,7 +1064,9 @@ void StrBufCutLeft(StrBuf *Buf, int nChars)
  */
 void StrBufCutRight(StrBuf *Buf, int nChars)
 {
-       if ((Buf == NULL) || (Buf->BufUsed == 0)) return;
+       if ((Buf == NULL) || (Buf->BufUsed == 0) || (Buf->buf == NULL))
+               return;
+
        if (nChars >= Buf->BufUsed) {
                FlushStrBuf(Buf);
                return;
@@ -1146,7 +1147,7 @@ void StrBufStripAllBut(StrBuf *Buf, char leftboundary, char rightboundary)
        const char *pLeft;
        const char *pRight;
 
-       if (Buf == NULL)
+       if ((Buf == NULL) || (Buf->buf == NULL))
                return;
        pLeft = pBuff = Buf->buf;
        while (pBuff != NULL) {
@@ -2503,14 +2504,14 @@ void StrBufEUid_unescapize(StrBuf *target, const StrBuf *source)
        int a, b, len;
        char hex[3];
 
-       if (target != NULL)
-               FlushStrBuf(target);
-
-       if (source == NULL ||target == NULL)
+       if ((source == NULL) || (target == NULL) || (target->buf == NULL))
        {
                return;
        }
 
+       if (target != NULL)
+               FlushStrBuf(target);
+
        len = source->BufUsed;
        for (a = 0; a < len; ++a) {
                if (target->BufUsed >= target->BufSize)
@@ -2547,7 +2548,7 @@ void StrBufEUid_escapize(StrBuf *target, const StrBuf *source)
        if (target != NULL)
                FlushStrBuf(target);
 
-       if (source == NULL ||target == NULL)
+       if ((source == NULL) || (target == NULL) || (target->buf == NULL))
        {
                return;
        }
@@ -2735,7 +2736,10 @@ int StrBufRFC2047encode(StrBuf **target, const StrBuf *source)
                        FlushStrBuf(*target);
                        StrBufAppendBuf(*target, source, 0);
                }
-               return (*target)->BufUsed;
+               if (*target != 0)
+                       return (*target)->BufUsed;
+               else
+                       return 0;
        }
        if (*target == NULL)
                *target = NewStrBufPlain(NULL, sizeof(headerStr) + source->BufUsed * 2);
@@ -2834,7 +2838,7 @@ StrBuf *StrBufSanitizeEmailRecipientVector(const StrBuf *Recp,
        while ((pch != NULL) && (pch < pche))
        {
                while (isspace(*pch)) pch++;
-               UserStart = UserEnd = EmailStart = EmailEnd = NULL;
+               UserEnd = EmailStart = EmailEnd = NULL;
                
                if ((*pch == '"') || (*pch == '\'')) {
                        UserStart = pch + 1;
@@ -2905,7 +2909,6 @@ StrBuf *StrBufSanitizeEmailRecipientVector(const StrBuf *Recp,
                                EmailStart ++;
                                if (UserStart >= UserEnd)
                                        UserStart = UserEnd = NULL;
-                               At = strchr(EmailStart, '@');
                        }
                        else { /* this is a local recipient... no domain, just a realname */
                                EmailStart = UserStart;
@@ -3084,6 +3087,9 @@ void StrBufConvert(StrBuf *ConvertBuf, StrBuf *TmpBuf, void *pic)
        size_t obuflen;                 /**< Length of output buffer */
 
 
+       if ((ConvertBuf == NULL) || (TmpBuf == NULL))
+               return;
+
        /* since we're converting to utf-8, one glyph may take up to 6 bytes */
        if (ConvertBuf->BufUsed * 6 >= TmpBuf->BufSize)
                IncreaseBuf(TmpBuf, 0, ConvertBuf->BufUsed * 6);
@@ -3266,9 +3272,12 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target,
 #endif
        const char *eptr;
        int passes = 0;
-       int i, len;
+       int i;
        int illegal_non_rfc2047_encoding = 0;
 
+
+       if (DecodeMe == NULL)
+               return;
        /* Sometimes, badly formed messages contain strings which were simply
         *  written out directly in some foreign character set instead of
         *  using RFC2047 encoding.  This is illegal but we will attempt to
@@ -3276,7 +3285,6 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target,
         *  charset to UTF-8 if we see any nonprintable characters.
         */
        
-       len = StrLength(DecodeMe);
        for (i=0; i<DecodeMe->BufUsed; ++i) {
                if ((DecodeMe->buf[i] < 32) || (DecodeMe->buf[i] > 126)) {
                        illegal_non_rfc2047_encoding = 1;
@@ -3300,8 +3308,7 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target,
        }
 
        /* pre evaluate the first pair */
-       nextend = end = NULL;
-       len = StrLength(DecodeMee);
+       end = NULL;
        start = strstr(DecodeMee->buf, "=?");
        eptr = DecodeMee->buf + DecodeMee->BufUsed;
        if (start != NULL) 
@@ -3318,7 +3325,6 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target,
                
                nFront = start - DecodeMee->buf;
                StrBufAppendBufPlain(Target, DecodeMee->buf, nFront, 0);
-               len -= nFront;
        }
        /*
         * Since spammers will go to all sorts of absurd lengths to get their
@@ -3758,6 +3764,10 @@ eReadState StrBufChunkSipLine(StrBuf *LineBuf, IOBuffer *FB)
        const char *aptr, *ptr, *eptr;
        char *optr, *xptr;
 
+       if ((FB == NULL) || (LineBuf == NULL) || (LineBuf->buf == NULL))
+               return eReadFail;
+       
+
        if ((FB->Buf == NULL) || (FB->ReadWritePointer == StrBufNOTNULL)) {
                FB->ReadWritePointer = StrBufNOTNULL;
                return eReadFail;
@@ -3845,6 +3855,8 @@ eReadState StrBufCheckBuffer(IOBuffer *FB)
 
 long IOBufferStrLength(IOBuffer *FB)
 {
+       if ((FB == NULL) || (FB->Buf == NULL))
+               return 0;
        if (FB->ReadWritePointer == NULL)
                return StrLength(FB->Buf);
        
@@ -3880,9 +3892,7 @@ void FDIOBufferDelete(FDIOBuffer *FDB)
 
 int FileSendChunked(FDIOBuffer *FDB, const char **Err)
 {
-       char *pRead;
-       long nRead = 0;
-       
+
 #ifdef LINUX_SENDFILE
        ssize_t sent;
        sent = sendfile(FDB->IOB->fd, FDB->OtherFD, &FDB->TotalSentAlready, FDB->ChunkSendRemain);
@@ -3895,6 +3905,10 @@ int FileSendChunked(FDIOBuffer *FDB, const char **Err)
        FDB->TotalSentAlready += sent;
        return FDB->ChunkSendRemain;
 #else
+
+       char *pRead;
+       long nRead = 0;
+
        pRead = FDB->ChunkBuffer->buf;
        while ((FDB->ChunkBuffer->BufUsed < FDB->TotalSendSize) && (nRead >= 0))
        {
@@ -4058,6 +4072,11 @@ int StrBufTCP_read_line(StrBuf *buf, int *fd, int append, const char **Error)
 {
        int len, rlen, slen;
 
+       if ((buf == NULL) || (buf->buf == NULL)) {
+               *Error = strerror(EINVAL);
+               return -1;
+       }
+
        if (!append)
                FlushStrBuf(buf);
 
@@ -4401,7 +4420,7 @@ int StrBufReadBLOB(StrBuf *Buf, int *fd, int append, long nBytes, const char **E
        struct timeval tv;
        fd_set rfds;
 
-       if ((Buf == NULL) || (*fd == -1))
+       if ((Buf == NULL) || (Buf->buf == NULL) || (*fd == -1))
        {
                *Error = ErrRBLF_BLOBPreConditionFailed;
                return -1;
@@ -4483,8 +4502,7 @@ int StrBufReadBLOBBuffered(StrBuf *Blob,
 {
        const char *pos;
        int fdflags;
-       int len = 0;
-       int rlen;
+       int rlen = 0;
        int nRead = 0;
        int nAlreadyRead = 0;
        int IsNonBlock;
@@ -4510,8 +4528,8 @@ int StrBufReadBLOBBuffered(StrBuf *Blob,
        pos = *Pos;
 
        if (pos != NULL)
-               len = pos - IOBuf->buf;
-       rlen = IOBuf->BufUsed - len;
+               rlen = pos - IOBuf->buf;
+       rlen = IOBuf->BufUsed - rlen;
 
 
        if ((IOBuf->BufUsed > 0) && 
@@ -4545,8 +4563,6 @@ int StrBufReadBLOBBuffered(StrBuf *Blob,
                IncreaseBuf(IOBuf, 0, nBytes - nRead);
        ptr = IOBuf->buf;
 
-       len = Blob->BufUsed;
-
        fdflags = fcntl(*fd, F_GETFL);
        IsNonBlock = (fdflags & O_NONBLOCK) == O_NONBLOCK;
        if (IsNonBlock)
@@ -4643,7 +4659,10 @@ int StrBufSipLine(StrBuf *LineBuf, const StrBuf *Buf, const char **Ptr)
        const char *aptr, *ptr, *eptr;
        char *optr, *xptr;
 
-       if ((Buf == NULL) || (*Ptr == StrBufNOTNULL)) {
+       if ((Buf == NULL) ||
+           (*Ptr == StrBufNOTNULL) ||
+           (LineBuf == NULL))
+       {
                *Ptr = StrBufNOTNULL;
                return 0;
        }