X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Fstringbuf.c;h=a245c3c37ea81483f8bf1ffd4410e67f28097362;hb=4aa22c590d9d96a0590020cbe54d6b193ea1deb6;hp=968fe9793784d869e36f8d967439ea9e694616be;hpb=a3754a0427dfd1d6494b1ae1a89b414668ec5f54;p=citadel.git diff --git a/libcitadel/lib/stringbuf.c b/libcitadel/lib/stringbuf.c index 968fe9793..a245c3c37 100644 --- a/libcitadel/lib/stringbuf.c +++ b/libcitadel/lib/stringbuf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2013 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -362,7 +362,12 @@ long StrBufShrinkToFit(StrBuf *Buf, int Force) if (Force || (Buf->BufUsed + (Buf->BufUsed / 3) > Buf->BufSize)) { - char *TmpBuf = (char*) malloc(Buf->BufUsed + 1); + char *TmpBuf; + + TmpBuf = (char*) malloc(Buf->BufUsed + 1); + if (TmpBuf == NULL) + return -1; + memcpy (TmpBuf, Buf->buf, Buf->BufUsed + 1); Buf->BufSize = Buf->BufUsed + 1; free(Buf->buf); @@ -381,7 +386,15 @@ StrBuf* NewStrBuf(void) StrBuf *NewBuf; NewBuf = (StrBuf*) malloc(sizeof(StrBuf)); + if (NewBuf == NULL) + return NULL; + NewBuf->buf = (char*) malloc(BaseStrBufSize); + if (NewBuf->buf == NULL) + { + free(NewBuf); + return NULL; + } NewBuf->buf[0] = '\0'; NewBuf->BufSize = BaseStrBufSize; NewBuf->BufUsed = 0; @@ -406,7 +419,16 @@ StrBuf* NewStrBufDup(const StrBuf *CopyMe) return NewStrBuf(); NewBuf = (StrBuf*) malloc(sizeof(StrBuf)); + if (NewBuf == NULL) + return NULL; + NewBuf->buf = (char*) malloc(CopyMe->BufSize); + if (NewBuf->buf == NULL) + { + free(NewBuf); + return NULL; + } + memcpy(NewBuf->buf, CopyMe->buf, CopyMe->BufUsed + 1); NewBuf->BufUsed = CopyMe->BufUsed; NewBuf->BufSize = CopyMe->BufSize; @@ -502,6 +524,9 @@ StrBuf* NewStrBufPlain(const char* ptr, int nChars) size_t CopySize; NewBuf = (StrBuf*) malloc(sizeof(StrBuf)); + if (NewBuf == NULL) + return NULL; + if (nChars < 0) CopySize = strlen((ptr != NULL)?ptr:""); else @@ -595,6 +620,8 @@ StrBuf* _NewConstStrBuf(const char* StringConstant, size_t SizeOfStrConstant) StrBuf *NewBuf; NewBuf = (StrBuf*) malloc(sizeof(StrBuf)); + if (NewBuf == NULL) + return NULL; NewBuf->buf = (char*) StringConstant; NewBuf->BufSize = SizeOfStrConstant; NewBuf->BufUsed = SizeOfStrConstant; @@ -1146,29 +1173,22 @@ void StrBufSpaceToBlank(StrBuf *Buf) void StrBufStripAllBut(StrBuf *Buf, char leftboundary, char rightboundary) { - const char *pBuff; const char *pLeft; const char *pRight; - if ((Buf == NULL) || (Buf->buf == NULL)) + if ((Buf == NULL) || (Buf->buf == NULL)) { return; - pLeft = pBuff = Buf->buf; - while (pBuff != NULL) { - pLeft = pBuff; - pBuff = strchr(pBuff, leftboundary); - if (pBuff != NULL) - pBuff++; } - - if (pLeft != NULL) - pBuff = pLeft; - else - pBuff = Buf->buf; - pRight = strchr(pBuff, rightboundary); - if (pRight != NULL) + + pRight = strchr(Buf->buf, rightboundary); + if (pRight != NULL) { StrBufCutAt(Buf, 0, pRight); - if (pLeft != NULL) - StrBufCutLeft(Buf, pLeft - Buf->buf); + } + + pLeft = strrchr(ChrPtr(Buf), leftboundary); + if (pLeft != NULL) { + StrBufCutLeft(Buf, pLeft - Buf->buf + 1); + } } @@ -2513,6 +2533,23 @@ long StrHtmlEcmaEscAppend(StrBuf *Target, const StrBuf *Source, const char *Plai return Target->BufUsed; } + +/** + * @ingroup StrBuf_DeEnCoder + * @brief replace all non-Ascii characters by another + * @param Buf buffer to inspect + * @param repl charater to stamp over non ascii chars + */ +void StrBufAsciify(StrBuf *Buf, const char repl) +{ + long offset; + + for (offset = 0; offset < Buf->BufUsed; offset ++) + if (!isascii(Buf->buf[offset])) + Buf->buf[offset] = repl; + +} + /** * @ingroup StrBuf_DeEnCoder * @brief unhide special chars hidden to the HTML escaper @@ -2606,9 +2643,14 @@ int StrBufDecodeBase64(StrBuf *Buf) { char *xferbuf; size_t siz; - if (Buf == NULL) return -1; + + if (Buf == NULL) + return -1; xferbuf = (char*) malloc(Buf->BufSize); + if (xferbuf == NULL) + return -1; + *xferbuf = '\0'; siz = CtdlDecodeBase64(xferbuf, Buf->buf, @@ -3883,9 +3925,17 @@ long IOBufferStrLength(IOBuffer *FB) return StrLength(FB->Buf) - (FB->ReadWritePointer - FB->Buf->buf); } -void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize) +inline static void FDIOBufferFlush(FDIOBuffer *FDB) { memset(FDB, 0, sizeof(FDIOBuffer)); + FDB->OtherFD = -1; + FDB->SplicePipe[0] = -1; + FDB->SplicePipe[1] = -1; +} + +void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize) +{ + FDIOBufferFlush(FDB); FDB->ChunkSize = FDB->TotalSendSize = TotalSendSize; FDB->IOB = IO; @@ -3904,15 +3954,18 @@ void FDIOBufferDelete(FDIOBuffer *FDB) #ifdef LINUX_SPLICE if (EnableSplice) { - close(FDB->SplicePipe[0]); - close(FDB->SplicePipe[1]); + if (FDB->SplicePipe[0] > 0) + close(FDB->SplicePipe[0]); + if (FDB->SplicePipe[1] > 0) + close(FDB->SplicePipe[1]); } else #endif FreeStrBuf(&FDB->ChunkBuffer); - close(FDB->OtherFD); - memset(FDB, 0, sizeof(FDIOBuffer)); + if (FDB->OtherFD > 0) + close(FDB->OtherFD); + FDIOBufferFlush(FDB); } int FileSendChunked(FDIOBuffer *FDB, const char **Err) @@ -4512,6 +4565,10 @@ int StrBufTCP_read_buffered_line_fast(StrBuf *Line, continue; } + else + { + nSuccessLess++; + } } *Pos = NULL; if (pLF != NULL) { @@ -4648,9 +4705,12 @@ int StrBufReadBLOBBuffered(StrBuf *Blob, int nSuccessLess = 0; int MaxTries; - if ((Blob == NULL) || (*fd == -1) || (IOBuf == NULL) || (Pos == NULL)) + if ((Blob == NULL) || + (*fd == -1) || + (IOBuf == NULL) || + (Pos == NULL)) { - if (*Pos != NULL) + if (Pos != NULL) *Pos = NULL; *Error = ErrRBB_BLOBFPreConditionFailed; return -1;