# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20090131142003-l2uzds196lgav619 # target_branch: http://www.squid-cache.org/bzr/squid3/trunk/ # testament_sha1: 63b2ec690f0a2876c0d18b2c6e3d38bae2d38bcd # timestamp: 2009-01-31 16:35:34 +0100 # base_revision_id: squid3@treenet.co.nz-20090131124205-\ # ou7b879ark530us2 # # Begin patch === modified file 'src/ACLExtUser.cc' --- src/ACLExtUser.cc 2009-01-21 03:47:47 +0000 +++ src/ACLExtUser.cc 2009-01-29 14:50:26 +0000 @@ -79,7 +79,7 @@ ACLExtUser::match(ACLChecklist *checklist) { if (checklist->request->extacl_user.size()) { - return data->match(checklist->request->extacl_user.buf()); + return data->match(checklist->request->extacl_user.unsafeBuf()); } else { return -1; } === modified file 'src/ACLHTTPHeaderData.cc' --- src/ACLHTTPHeaderData.cc 2009-01-21 03:47:47 +0000 +++ src/ACLHTTPHeaderData.cc 2009-01-30 14:55:22 +0000 @@ -63,18 +63,18 @@ if (hdr == NULL) return false; - debugs(28, 3, "aclHeaderData::match: checking '" << hdrName.buf() << "'"); - - String value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.buf()); - - return regex_rule->match(value.buf()); + debugs(28, 3, "aclHeaderData::match: checking '" << hdrName << "'"); + + String value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.termedBuf()); + + return regex_rule->match(value.termedBuf()); } wordlist * ACLHTTPHeaderData::dump() { wordlist *W = NULL; - wordlistAdd(&W, hdrName.buf()); + wordlistAdd(&W, hdrName.termedBuf()); wordlist * regex_dump = regex_rule->dump(); wordlistAddWl(&W, regex_dump); wordlistDestroy(®ex_dump); @@ -87,14 +87,14 @@ char* t = strtokFile(); assert (t != NULL); hdrName = t; - hdrId = httpHeaderIdByNameDef(hdrName.buf(), strlen(hdrName.buf())); + hdrId = httpHeaderIdByNameDef(hdrName.rawBuf(), hdrName.size()); regex_rule->parse(); } bool ACLHTTPHeaderData::empty() const { - return (hdrId == HDR_BAD_HDR && !hdrName.buf()) || regex_rule->empty(); + return (hdrId == HDR_BAD_HDR && hdrName.undefined()) || regex_rule->empty(); } ACLData * === modified file 'src/ACLUrlPath.cc' --- src/ACLUrlPath.cc 2009-01-21 03:47:47 +0000 +++ src/ACLUrlPath.cc 2009-01-30 14:55:22 +0000 @@ -47,7 +47,7 @@ int ACLUrlPathStrategy::match (ACLData * &data, ACLChecklist *checklist) { - char *esc_buf = xstrdup(checklist->request->urlpath.buf()); + char *esc_buf = xstrdup(checklist->request->urlpath.termedBuf()); rfc1738_unescape(esc_buf); int result = data->match(esc_buf); safe_free(esc_buf); === modified file 'src/CommonPool.h' --- src/CommonPool.h 2009-01-21 03:47:47 +0000 +++ src/CommonPool.h 2009-01-29 14:50:26 +0000 @@ -59,7 +59,7 @@ void *operator new(size_t); void operator delete (void *); static CommonPool *Factory (unsigned char _class, CompositePoolNode::Pointer&); - char const* theClassTypeLabel() const {return typeLabel.buf();} + char const* theClassTypeLabel() const {return typeLabel.unsafeBuf();} protected: CommonPool(); === modified file 'src/DelayTagged.cc' --- src/DelayTagged.cc 2009-01-21 03:47:47 +0000 +++ src/DelayTagged.cc 2009-01-29 14:50:26 +0000 @@ -77,7 +77,7 @@ DelayTaggedCmp(DelayTaggedBucket::Pointer const &left, DelayTaggedBucket::Pointer const &right) { /* for rate limiting, case insensitive */ - return left->tag.caseCmp(right->tag.buf()); + return left->tag.caseCmp(right->tag.unsafeBuf()); } void @@ -195,7 +195,7 @@ void DelayTaggedBucket::stats (StoreEntry *entry) const { - storeAppendPrintf(entry, " %s:", tag.buf()); + storeAppendPrintf(entry, " %s:", tag.unsafeBuf()); theBucket.stats (entry); } === modified file 'src/DiskIO/AIO/AIODiskFile.cc' --- src/DiskIO/AIO/AIODiskFile.cc 2009-01-21 03:47:47 +0000 +++ src/DiskIO/AIO/AIODiskFile.cc 2009-01-29 14:50:26 +0000 @@ -87,10 +87,10 @@ { /* Simulate async calls */ #ifdef _SQUID_WIN32_ - fd = aio_open(path.buf(), flags); + fd = aio_open(path.unsafeBuf(), flags); #else - fd = file_open(path.buf() , flags); + fd = file_open(path.unsafeBuf() , flags); #endif ioRequestor = callback; @@ -130,7 +130,7 @@ fatal("Aiee! out of aiocb slots! - FIXME and wrap file_read\n"); debugs(79, 1, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ - // file_read(fd, request->buf, request->len, request->offset, callback, data); + // file_read(fd, request->unsafeBuf, request->len, request->offset, callback, data); return; } @@ -167,7 +167,7 @@ fatalf("Aiee! aio_read() returned error (%d) FIXME and wrap file_read !\n", errno); debugs(79, 1, "WARNING: aio_read() returned error: " << xstrerror()); /* fall back to blocking method */ - // file_read(fd, request->buf, request->len, request->offset, callback, data); + // file_read(fd, request->unsafeBuf, request->len, request->offset, callback, data); } } @@ -188,7 +188,7 @@ fatal("Aiee! out of aiocb slots FIXME and wrap file_write !\n"); debugs(79, 1, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ - // file_write(fd, offset, buf, len, callback, data, freefunc); + // file_write(fd, offset, unsafeBuf, len, callback, data, freefunc); return; } @@ -225,7 +225,7 @@ fatalf("Aiee! aio_write() returned error (%d) FIXME and wrap file_write !\n", errno); debugs(79, 1, "WARNING: aio_write() returned error: " << xstrerror()); /* fall back to blocking method */ - // file_write(fd, offset, buf, len, callback, data, freefunc); + // file_write(fd, offset, unsafeBuf, len, callback, data, freefunc); } } === modified file 'src/ESI.cc' --- src/ESI.cc 2009-01-07 11:24:40 +0000 +++ src/ESI.cc 2009-01-29 14:50:26 +0000 @@ -1578,7 +1578,7 @@ /* Ensure variable state is clean */ while (temp.getRaw()) { - varState->feedData(temp->buf,temp->len); + varState->feedData(temp->unsafeBuf,temp->len); temp = temp->next; } === modified file 'src/ESIVarState.cc' --- src/ESIVarState.cc 2009-01-21 03:47:47 +0000 +++ src/ESIVarState.cc 2009-01-29 14:50:26 +0000 @@ -317,7 +317,7 @@ void ESIVarState::removeVariable (String const &name) { - Variable *candidate = static_cast (variables.find (name.buf(), name.size())); + Variable *candidate = static_cast (variables.find (name.unsafeBuf(), name.size())); if (candidate) { /* XXX: remove me */ @@ -434,7 +434,7 @@ String S = state.header().getListMember (HDR_COOKIE, subref, ';'); if (S.size()) - ESISegment::ListAppend (state.getOutput(), S.buf(), S.size()); + ESISegment::ListAppend (state.getOutput(), S.unsafeBuf(), S.size()); else if (found_default) ESISegment::ListAppend (state.getOutput(), found_default, strlen (found_default)); } @@ -468,7 +468,7 @@ if (state.header().has(HDR_ACCEPT_LANGUAGE)) { if (!subref) { String S (state.header().getList (HDR_ACCEPT_LANGUAGE)); - ESISegment::ListAppend (state.getOutput(), S.buf(), S.size()); + ESISegment::ListAppend (state.getOutput(), S.unsafeBuf(), S.size()); } else { if (state.header().hasListMember (HDR_ACCEPT_LANGUAGE, subref, ',')) { s = "true"; @@ -884,7 +884,7 @@ String strVary (rep->header.getList (HDR_VARY)); - if (!strVary.size() || strVary.buf()[0] != '*') { + if (!strVary.size() || strVary.unsafeBuf()[0] != '*') { rep->header.putStr (HDR_VARY, tempstr); } } === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrCc.cc 2009-01-29 14:50:26 +0000 @@ -134,13 +134,13 @@ CcFieldsInfo, CC_ENUM_END); if (type < 0) { - debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str->unsafeBuf() << "'"); type = CC_OTHER; } if (EBIT_TEST(cc->mask, type)) { if (type != CC_OTHER) - debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str->unsafeBuf() << "'"); CcFieldsInfo[type].stat.repCount++; @@ -205,7 +205,7 @@ { assert(cc); - if (cc->other.buf()) + if (cc->other.unsafeBuf()) cc->other.clean(); memFree(cc, MEM_HTTP_HDR_CC); @@ -235,7 +235,7 @@ if (EBIT_TEST(cc->mask, flag) && flag != CC_OTHER) { /* print option name */ - packerPrintf(p, (pcount ? ", %s" : "%s"), CcFieldsInfo[flag].name.buf()); + packerPrintf(p, (pcount ? ", %s" : "%s"), CcFieldsInfo[flag].name.unsafeBuf()); /* handle options with values */ @@ -253,7 +253,7 @@ } if (cc->other.size()) - packerPrintf(p, (pcount ? ", %s" : "%s"), cc->other.buf()); + packerPrintf(p, (pcount ? ", %s" : "%s"), cc->other.unsafeBuf()); } /* negative max_age will clean old max_Age setting */ @@ -299,7 +299,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < CC_ENUM_END; - const char *name = valid_id ? CcFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? CcFieldsInfo[id].name.unsafeBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", === modified file 'src/HttpHdrExtField.cc' --- src/HttpHdrExtField.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrExtField.cc 2009-01-29 14:50:26 +0000 @@ -96,6 +96,6 @@ { assert(f); return httpHdrExtFieldDoCreate( - f->name.buf(), f->name.size(), - f->value.buf(), f->value.size()); + f->name.unsafeBuf(), f->name.size(), + f->value.unsafeBuf(), f->value.size()); } === modified file 'src/HttpHdrRange.cc' --- src/HttpHdrRange.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrRange.cc 2009-01-29 14:50:26 +0000 @@ -251,14 +251,14 @@ int count = 0; assert(this && range_spec); ++ParsedCount; - debugs(64, 8, "parsing range field: '" << range_spec->buf() << "'"); + debugs(64, 8, "parsing range field: '" << range_spec->unsafeBuf() << "'"); /* check range type */ if (range_spec->caseCmp("bytes=", 6)) return 0; /* skip "bytes="; hack! */ - pos = range_spec->buf() + 6; + pos = range_spec->unsafeBuf() + 6; /* iterate through comma separated list */ while (strListGetItem(range_spec, ',', &item, &ilen, &pos)) { === modified file 'src/HttpHdrSc.cc' --- src/HttpHdrSc.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrSc.cc 2009-01-29 14:50:26 +0000 @@ -138,7 +138,7 @@ ScFieldsInfo, SC_ENUM_END); if (type < 0) { - debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << str->unsafeBuf() << "'"); type = SC_OTHER; } @@ -162,7 +162,7 @@ if (EBIT_TEST(sct->mask, type)) { if (type != SC_OTHER) - debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << str->unsafeBuf() << "'"); ScFieldsInfo[type].stat.repCount++; @@ -257,7 +257,7 @@ if (EBIT_TEST(sc->mask, flag) && flag != SC_OTHER) { /* print option name */ - packerPrintf(p, (pcount ? ", %s" : "%s"), ScFieldsInfo[flag].name.buf()); + packerPrintf(p, (pcount ? ", %s" : "%s"), ScFieldsInfo[flag].name.unsafeBuf()); /* handle options with values */ @@ -265,14 +265,14 @@ packerPrintf(p, "=%d", (int) sc->max_age); if (flag == SC_CONTENT) - packerPrintf(p, "=\"%s\"", sc->content.buf()); + packerPrintf(p, "=\"%s\"", sc->content.unsafeBuf()); pcount++; } } if (sc->target.size()) - packerPrintf (p, ";%s", sc->target.buf()); + packerPrintf (p, ";%s", sc->target.unsafeBuf()); } void @@ -339,7 +339,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < SC_ENUM_END; - const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? ScFieldsInfo[id].name.unsafeBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", @@ -352,7 +352,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < SC_ENUM_END; - const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? ScFieldsInfo[id].name.unsafeBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", @@ -369,9 +369,9 @@ while (node) { HttpHdrScTarget *sct = (HttpHdrScTarget *)node->data; - if (target && sct->target.buf() && !strcmp (target, sct->target.buf())) + if (target && sct->target.unsafeBuf() && !strcmp (target, sct->target.unsafeBuf())) return sct; - else if (!target && !sct->target.buf()) + else if (!target && !sct->target.unsafeBuf()) return sct; node = node->next; === modified file 'src/HttpHdrScTarget.cc' --- src/HttpHdrScTarget.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrScTarget.cc 2009-01-29 14:50:26 +0000 @@ -68,7 +68,7 @@ { HttpHdrScTarget *dup; assert(sc); - dup = httpHdrScTargetCreate(sc->target.buf()); + dup = httpHdrScTargetCreate(sc->target.unsafeBuf()); dup->mask = sc->mask; dup->max_age = sc->max_age; dup->content = sc->content; === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHeader.cc 2009-01-29 14:50:26 +0000 @@ -461,7 +461,7 @@ if (e->id != HDR_OTHER) delById(e->id); else - delByName(e->name.buf()); + delByName(e->name.unsafeBuf()); } pos = HttpHeaderInitPos; @@ -578,7 +578,7 @@ } if (e->id == HDR_CONTENT_LENGTH && (e2 = findEntry(e->id)) != NULL) { - if (e->value.cmp(e2->value.buf()) != 0) { + if (e->value.cmp(e2->value.unsafeBuf()) != 0) { int64_t l1, l2; debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2, "WARNING: found two conflicting content-length headers in {" << getStringPrefix(header_start, header_end) << "}"); @@ -588,12 +588,12 @@ goto reset; } - if (!httpHeaderParseOffset(e->value.buf(), &l1)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e->value.buf() << "'"); + if (!httpHeaderParseOffset(e->value.unsafeBuf(), &l1)) { + debugs(55, 1, "WARNING: Unparseable content-length '" << e->value.unsafeBuf() << "'"); delete e; continue; - } else if (!httpHeaderParseOffset(e2->value.buf(), &l2)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value.buf() << "'"); + } else if (!httpHeaderParseOffset(e2->value.unsafeBuf(), &l2)) { + debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value.unsafeBuf() << "'"); delById(e2->id); } else if (l1 > l2) { delById(e2->id); @@ -615,7 +615,7 @@ } } - if (e->id == HDR_OTHER && stringHasWhitespace(e->name.buf())) { + if (e->id == HDR_OTHER && stringHasWhitespace(e->name.unsafeBuf())) { debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2, "WARNING: found whitespace in HTTP header name {" << getStringPrefix(field_start, field_end) << "}"); @@ -875,7 +875,7 @@ while ((e = getEntry(&pos))) { if (e->id == id) - strListAdd(s, e->value.buf(), ','); + strListAdd(s, e->value.unsafeBuf(), ','); } /* @@ -909,7 +909,7 @@ while ((e = getEntry(&pos))) { if (e->id == id) - strListAdd(&s, e->value.buf(), ','); + strListAdd(&s, e->value.unsafeBuf(), ','); } /* @@ -964,7 +964,7 @@ /* Sorry, an unknown header name. Do linear search */ while ((e = getEntry(&pos))) { if (e->id == HDR_OTHER && e->name.caseCmp(name) == 0) { - strListAdd(&result, e->value.buf(), ','); + strListAdd(&result, e->value.unsafeBuf(), ','); } } @@ -1209,7 +1209,7 @@ assert(Headers[id].type == ftDate_1123); /* must be of an appropriate type */ if ((e = findEntry(id))) { - value = parse_rfc1123(e->value.buf()); + value = parse_rfc1123(e->value.unsafeBuf()); httpHeaderNoteParsedEntry(e->id, e->value, value < 0); } @@ -1226,7 +1226,7 @@ if ((e = findEntry(id))) { httpHeaderNoteParsedEntry(e->id, e->value, 0); /* no errors are possible */ - return e->value.buf(); + return e->value.unsafeBuf(); } return NULL; @@ -1242,7 +1242,7 @@ if ((e = findLastEntry(id))) { httpHeaderNoteParsedEntry(e->id, e->value, 0); /* no errors are possible */ - return e->value.buf(); + return e->value.unsafeBuf(); } return NULL; @@ -1322,7 +1322,7 @@ HttpHeaderEntry *e; if ((e = findEntry(HDR_CONTENT_RANGE))) { - cr = httpHdrContRangeParseCreate(e->value.buf()); + cr = httpHdrContRangeParseCreate(e->value.unsafeBuf()); httpHeaderNoteParsedEntry(e->id, e->value, !cr); } @@ -1367,7 +1367,7 @@ assert(Headers[id].type == ftETag); /* must be of an appropriate type */ if ((e = findEntry(id))) - etagParseInit(&etag, e->value.buf()); + etagParseInit(&etag, e->value.unsafeBuf()); return etag; } @@ -1381,7 +1381,7 @@ memset(&tot, 0, sizeof(tot)); if ((e = findEntry(id))) { - const char *str = e->value.buf(); + const char *str = e->value.unsafeBuf(); /* try as an ETag */ if (etagParseInit(&tot.tag, str)) { @@ -1417,13 +1417,13 @@ Headers[id].stat.aliveCount++; - debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name.buf() << " : " << value.buf()); + debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name.unsafeBuf() << " : " << value.unsafeBuf()); } HttpHeaderEntry::~HttpHeaderEntry() { assert_eid(id); - debugs(55, 9, "destroying entry " << this << ": '" << name.buf() << ": " << value.buf() << "'"); + debugs(55, 9, "destroying entry " << this << ": '" << name.unsafeBuf() << ": " << value.unsafeBuf() << "'"); /* clean name if needed */ if (id == HDR_OTHER) @@ -1503,7 +1503,7 @@ if (field_end - value_start > 65534) { /* String must be LESS THAN 64K and it adds a terminating NULL */ - debugs(55, 1, "WARNING: ignoring '" << name.buf() << "' header of " << (field_end - value_start) << " bytes"); + debugs(55, 1, "WARNING: ignoring '" << name.unsafeBuf() << "' header of " << (field_end - value_start) << " bytes"); if (id == HDR_OTHER) name.clean(); @@ -1518,24 +1518,24 @@ Headers[id].stat.aliveCount++; - debugs(55, 9, "parsed HttpHeaderEntry: '" << name.buf() << ": " << value.buf() << "'"); + debugs(55, 9, "parsed HttpHeaderEntry: '" << name.unsafeBuf() << ": " << value.unsafeBuf() << "'"); - return new HttpHeaderEntry(id, name.buf(), value.buf()); + return new HttpHeaderEntry(id, name.unsafeBuf(), value.unsafeBuf()); } HttpHeaderEntry * HttpHeaderEntry::clone() const { - return new HttpHeaderEntry(id, name.buf(), value.buf()); + return new HttpHeaderEntry(id, name.unsafeBuf(), value.unsafeBuf()); } void HttpHeaderEntry::packInto(Packer * p) const { assert(p); - packerAppend(p, name.buf(), name.size()); + packerAppend(p, name.unsafeBuf(), name.size()); packerAppend(p, ": ", 2); - packerAppend(p, value.buf(), value.size()); + packerAppend(p, value.unsafeBuf(), value.size()); packerAppend(p, "\r\n", 2); } @@ -1545,7 +1545,7 @@ assert_eid (id); assert (Headers[id].type == ftInt); int val = -1; - int ok = httpHeaderParseInt(value.buf(), &val); + int ok = httpHeaderParseInt(value.unsafeBuf(), &val); httpHeaderNoteParsedEntry(id, value, !ok); /* XXX: Should we check ok - ie * return ok ? -1 : value; @@ -1559,7 +1559,7 @@ assert_eid (id); assert (Headers[id].type == ftInt64); int64_t val = -1; - int ok = httpHeaderParseOffset(value.buf(), &val); + int ok = httpHeaderParseOffset(value.unsafeBuf(), &val); httpHeaderNoteParsedEntry(id, value, !ok); /* XXX: Should we check ok - ie * return ok ? -1 : value; @@ -1574,7 +1574,7 @@ if (error) { Headers[id].stat.errCount++; - debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name.buf() << ": " << context.buf() << "'"); + debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name.unsafeBuf() << ": " << context.unsafeBuf() << "'"); } } @@ -1591,7 +1591,7 @@ { const int id = (int) val; const int valid_id = id >= 0 && id < HDR_ENUM_END; - const char *name = valid_id ? Headers[id].name.buf() : "INVALID"; + const char *name = valid_id ? Headers[id].name.unsafeBuf() : "INVALID"; int visible = count > 0; /* for entries with zero count, list only those that belong to current type of message */ @@ -1669,7 +1669,7 @@ for (ht = (http_hdr_type)0; ht < HDR_ENUM_END; ++ht) { HttpHeaderFieldInfo *f = Headers + ht; storeAppendPrintf(e, "%2d\t %-25s\t %5d\t %6.3f\t %6.3f\n", - f->id, f->name.buf(), f->stat.aliveCount, + f->id, f->name.unsafeBuf(), f->stat.aliveCount, xpercent(f->stat.errCount, f->stat.parsCount), xpercent(f->stat.repCount, f->stat.seenCount)); } @@ -1690,7 +1690,7 @@ if (name_len >= 0 && name_len != info[i].name.size()) continue; - if (!strncasecmp(name, info[i].name.buf(), + if (!strncasecmp(name, info[i].name.unsafeBuf(), name_len < 0 ? info[i].name.size() + 1 : name_len)) return info[i].id; } @@ -1715,7 +1715,7 @@ assert(id >= 0 && id < HDR_ENUM_END); - return Headers[id].name.buf(); + return Headers[id].name.unsafeBuf(); } int @@ -1804,7 +1804,7 @@ int headers_deleted = 0; while ((e = getEntry(&pos))) { - if (strListIsMember(&strConnection, e->name.buf(), ',')) + if (strListIsMember(&strConnection, e->name.unsafeBuf(), ',')) delAt(pos, headers_deleted); } if (headers_deleted) === modified file 'src/HttpHeaderTools.cc' --- src/HttpHeaderTools.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHeaderTools.cc 2009-01-29 14:50:26 +0000 @@ -258,7 +258,7 @@ delim[2][1] = del; if (!*pos) { - *pos = str->buf(); + *pos = str->unsafeBuf(); if (!*pos) return 0; === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2009-01-21 03:47:47 +0000 +++ src/HttpReply.cc 2009-01-29 14:50:26 +0000 @@ -281,7 +281,7 @@ two = otherRep->header.getStrOrList(HDR_ETAG); - if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) { + if (!one.unsafeBuf() || !two.unsafeBuf() || strcasecmp (one.unsafeBuf(), two.unsafeBuf())) { one.clean(); two.clean(); return 0; @@ -295,7 +295,7 @@ two = otherRep->header.getStrOrList(HDR_CONTENT_MD5); - if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) { + if (!one.unsafeBuf() || !two.unsafeBuf() || strcasecmp (one.unsafeBuf(), two.unsafeBuf())) { one.clean(); two.clean(); return 0; @@ -440,7 +440,7 @@ bool HttpReply::sanityCheckStartLine(MemBuf *buf, http_status *error) { if (buf->contentSize() >= protoPrefix.size() && protoPrefix.cmp(buf->content(), protoPrefix.size()) != 0) { - debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix.buf() << ") in '" << buf->content() << "'"); + debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix.unsafeBuf() << ") in '" << buf->content() << "'"); *error = HTTP_INVALID_HEADER; return false; } === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2009-01-21 03:47:47 +0000 +++ src/HttpRequest.cc 2009-01-29 14:50:26 +0000 @@ -150,7 +150,7 @@ HttpRequest * HttpRequest::clone() const { - HttpRequest *copy = new HttpRequest(method, protocol, urlpath.buf()); + HttpRequest *copy = new HttpRequest(method, protocol, urlpath.unsafeBuf()); // TODO: move common cloning clone to Msg::copyTo() or copy ctor copy->header.append(&header); copy->hdrCacheInit(); @@ -299,7 +299,7 @@ assert(p); /* pack request-line */ packerPrintf(p, "%s %s HTTP/1.0\r\n", - RequestMethodStr(method), urlpath.buf()); + RequestMethodStr(method), urlpath.unsafeBuf()); /* headers */ header.packInto(p); /* trailer */ @@ -336,7 +336,7 @@ assert(e); /* check connection header */ - if (strConn && strListIsMember(strConn, e->name.buf(), ',')) + if (strConn && strListIsMember(strConn, e->name.unsafeBuf(), ',')) return 0; return 1; @@ -411,7 +411,7 @@ return urlCanonical((HttpRequest*)this); if (urlpath.size()) - return urlpath.buf(); + return urlpath.unsafeBuf(); return "/"; } === modified file 'src/HttpRequestMethod.cc' --- src/HttpRequestMethod.cc 2009-01-21 03:47:47 +0000 +++ src/HttpRequestMethod.cc 2009-01-29 14:50:26 +0000 @@ -177,7 +177,7 @@ return RequestMethodStr[theMethod]; } else { if (theImage.size()>0) { - return theImage.buf(); + return theImage.unsafeBuf(); } else { return "METHOD_OTHER"; } === modified file 'src/ICAP/ICAPModXact.cc' --- src/ICAP/ICAPModXact.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPModXact.cc 2009-01-30 09:54:59 +0000 @@ -1038,13 +1038,17 @@ // we must forward "Proxy-Authenticate" and "Proxy-Authorization" // as ICAP headers. - if (virgin.header->header.has(HDR_PROXY_AUTHENTICATE)) - buf.Printf("Proxy-Authenticate: %s\r\n", - virgin.header->header.getByName("Proxy-Authenticate").buf()); + if (virgin.header->header.has(HDR_PROXY_AUTHENTICATE)) { + String vh=virgin.header->header.getByName("Proxy-Authenticate"); + buf.Printf("Proxy-Authenticate: %.*s\r\n", + vh.size(), vh.rawBuf()); + } - if (virgin.header->header.has(HDR_PROXY_AUTHORIZATION)) - buf.Printf("Proxy-Authorization: %s\r\n", - virgin.header->header.getByName("Proxy-Authorization").buf()); + if (virgin.header->header.has(HDR_PROXY_AUTHORIZATION)) { + String vh=virgin.header->header.getByName("Proxy-Authorization"); + buf.Printf("Proxy-Authorization: %.*s\r\n", + vh.size(), vh.rawBuf()); + } buf.Printf("Encapsulated: "); @@ -1107,7 +1111,7 @@ if (TheICAPConfig.send_client_username && request) makeUsernameHeader(request, buf); - // fprintf(stderr, "%s\n", buf.content()); + // fprintf(stderr, "%s\n", unsafeBuf.content()); buf.append(ICAP::crlf, 2); // terminate ICAP header @@ -1268,7 +1272,7 @@ Must(!preview.ad()); // do not add last-chunk because our Encapsulated header says null-body - // addLastRequestChunk(buf); + // addLastRequestChunk(unsafeBuf); preview.wrote(0, true); Must(preview.done()); @@ -1376,7 +1380,7 @@ Must(virgin.body_pipe->setConsumerIfNotLate(this)); // make sure TheBackupLimit is in-sync with the buffer size - Must(TheBackupLimit <= static_cast(msg->body_pipe->buf().max_capacity)); + Must(TheBackupLimit <= static_cast(msg->body_pipe->unsafeBuf().max_capacity)); } else { debugs(93, 6, "ICAPModXact does not expect virgin body"); Must(msg->body_pipe == NULL); === modified file 'src/ICAP/ICAPOptXact.cc' --- src/ICAP/ICAPOptXact.cc 2008-10-10 08:02:53 +0000 +++ src/ICAP/ICAPOptXact.cc 2009-01-30 14:55:22 +0000 @@ -43,8 +43,10 @@ void ICAPOptXact::makeRequest(MemBuf &buf) { const Adaptation::Service &s = service(); - buf.Printf("OPTIONS %s ICAP/1.0\r\n", s.cfg().uri.buf()); - buf.Printf("Host: %s:%d\r\n", s.cfg().host.buf(), s.cfg().port); + const String uri = s.cfg().uri; + buf.Printf("OPTIONS %.*s ICAP/1.0\r\n", uri.size(), uri.rawBuf()); + const String host = s.cfg().host; + buf.Printf("Host: %.*s:%d\r\n", host.size(), host.rawBuf(), s.cfg().port); buf.append(ICAP::crlf, 2); } === modified file 'src/ICAP/ICAPOptions.cc' --- src/ICAP/ICAPOptions.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPOptions.cc 2009-01-30 14:55:22 +0000 @@ -124,8 +124,8 @@ { const String s = h->getByName(fname); - if (s.size() && xisdigit(*s.buf())) - value = atoi(s.buf()); + if (s.size() && xisdigit(*s.termedBuf())) + value = atoi(s.termedBuf()); else value = -1; @@ -176,8 +176,8 @@ if (eLen < urlLen) { const int eOff = urlLen - eLen; // RFC 3507 examples imply that extensions come without leading '.' - if (urlPath.buf()[eOff-1] == '.' && - strcmp(urlPath.buf() + eOff, e->key) == 0) { + if (urlPath[eOff-1] == '.' && + strcmp(urlPath.termedBuf() + eOff, e->key) == 0) { debugs(93,7, "ICAPOptions url " << urlPath << " matches " << name << " extension " << e->key); return true; === modified file 'src/ICAP/ICAPServiceRep.cc' --- src/ICAP/ICAPServiceRep.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPServiceRep.cc 2009-01-30 14:55:22 +0000 @@ -279,8 +279,8 @@ if (!method_found) { debugs(93,1, "WARNING: Squid is configured to use ICAP method " << cfg().methodStr() << - " for service " << cfg().uri.buf() << - " but OPTIONS response declares the methods are " << method_list.buf()); + " for service " << cfg().uri.unsafeBuf() << + " but OPTIONS response declares the methods are " << method_list); } } @@ -293,7 +293,7 @@ // TODO: If skew is negative, the option will be considered down // because of stale options. We should probably change this. debugs(93, 1, "ICAP service's clock is skewed by " << skew << - " seconds: " << cfg().uri.buf()); + " seconds: " << cfg().uri.unsafeBuf()); } } === modified file 'src/ICAP/ICAPXaction.cc' --- src/ICAP/ICAPXaction.cc 2009-01-07 10:49:48 +0000 +++ src/ICAP/ICAPXaction.cc 2009-01-29 14:50:26 +0000 @@ -76,7 +76,7 @@ disableRetries(); // this will also safely drain pconn pool // TODO: check whether NULL domain is appropriate here - connection = icapPconnPool->pop(s.cfg().host.buf(), s.cfg().port, NULL, client_addr, isRetriable); + connection = icapPconnPool->pop(s.cfg().host.unsafeBuf(), s.cfg().port, NULL, client_addr, isRetriable); if (connection >= 0) { debugs(93,3, HERE << "reused pconn FD " << connection); @@ -96,12 +96,12 @@ IpAddress outgoing; connection = comm_open(SOCK_STREAM, 0, outgoing, - COMM_NONBLOCKING, s.cfg().uri.buf()); + COMM_NONBLOCKING, s.cfg().uri.unsafeBuf()); if (connection < 0) dieOnConnectionFailure(); // throws - debugs(93,3, typeName << " opens connection to " << s.cfg().host.buf() << ":" << s.cfg().port); + debugs(93,3, typeName << " opens connection to " << s.cfg().host.unsafeBuf() << ":" << s.cfg().port); // TODO: service bypass status may differ from that of a transaction typedef CommCbMemFunT TimeoutDialer; @@ -119,7 +119,7 @@ typedef CommCbMemFunT ConnectDialer; connector = asyncCall(93,3, "ICAPXaction::noteCommConnected", ConnectDialer(this, &ICAPXaction::noteCommConnected)); - commConnectStart(connection, s.cfg().host.buf(), s.cfg().port, connector); + commConnectStart(connection, s.cfg().host.unsafeBuf(), s.cfg().port, connector); } /* @@ -157,7 +157,7 @@ debugs(93,3, HERE << "pushing pconn" << status()); AsyncCall::Pointer call = NULL; commSetTimeout(connection, -1, call); - icapPconnPool->push(connection, theService->cfg().host.buf(), + icapPconnPool->push(connection, theService->cfg().host.unsafeBuf(), theService->cfg().port, NULL, client_addr); disableRetries(); } else { @@ -232,7 +232,7 @@ { debugs(93, 2, HERE << typeName << " failed: timeout with " << theService->cfg().methodStr() << " " << - theService->cfg().uri.buf() << status()); + theService->cfg().uri.unsafeBuf() << status()); reuseConnection = false; service().noteFailure(); @@ -295,7 +295,7 @@ /* * See comments in ICAPXaction.h about why we use commBuf - * here instead of reading directly into readBuf.buf. + * here instead of reading directly into readBuf.unsafeBuf. */ typedef CommCbMemFunT Dialer; reader = asyncCall(93,3, "ICAPXaction::noteCommRead", @@ -320,7 +320,7 @@ /* * See comments in ICAPXaction.h about why we use commBuf - * here instead of reading directly into readBuf.buf. + * here instead of reading directly into readBuf.unsafeBuf. */ if (io.size > 0) { === modified file 'src/LoadableModule.cc' --- src/LoadableModule.cc 2008-10-10 08:02:53 +0000 +++ src/LoadableModule.cc 2009-01-29 14:50:26 +0000 @@ -67,7 +67,7 @@ void *LoadableModule::openModule(int mode) { # if XSTD_USE_LIBLTDL - return lt_dlopen(theName.buf()); + return lt_dlopen(theName.unsafeBuf()); # else return dlopen(theName.c_str(), mode == lmNow ? RTLD_NOW : RTLD_LAZY); === modified file 'src/SquidString.h' --- src/SquidString.h 2009-01-21 03:47:47 +0000 +++ src/SquidString.h 2009-01-29 14:50:26 +0000 @@ -98,7 +98,26 @@ _SQUID_INLINE_ char &operator [](unsigned int pos); _SQUID_INLINE_ int size() const; - _SQUID_INLINE_ char const * buf() const; + _SQUID_INLINE_ char const * unsafeBuf() const; + + /** + * \retval true the String has some contents + */ + _SQUID_INLINE_ bool defined() const; + /** + * \retval true the String does not hold any contents + */ + _SQUID_INLINE_ bool undefined() const; + /** + * Returns a raw pointer to the underlying backing store. The caller has been + * verified not to make any assumptions about null-termination + */ + _SQUID_INLINE_ char const * rawBuf() const; + /** + * Returns a raw pointer to the underlying backing store. + * The caller requires it to be null-terminated. + */ + _SQUID_INLINE_ char const * termedBuf() const; void limitInit(const char *str, int len); // TODO: rename to assign() void clean(); void reset(char const *str); === modified file 'src/String.cc' --- src/String.cc 2009-01-21 03:47:47 +0000 +++ src/String.cc 2009-01-29 16:14:07 +0000 @@ -42,7 +42,7 @@ String::allocBuffer(size_t sz) { PROF_start(StringInitBuf); - assert (buf_ == NULL); + assert (undefined()); char *newBuffer = (char*)memAllocString(sz, &sz); setBuffer(newBuffer, sz); PROF_stop(StringInitBuf); @@ -53,7 +53,7 @@ void String::setBuffer(char *aBuf, size_t aSize) { - assert(!buf_); + assert(undefined()); assert(aSize < 65536); buf_ = aBuf; size_ = aSize; @@ -81,7 +81,7 @@ { clean(); // TODO: optimize to avoid cleaning the buffer we can use if (old.size() > 0) - allocAndFill(old.buf(), old.size()); + allocAndFill(old.rawBuf(), old.size()); return *this; } @@ -128,7 +128,7 @@ String::String (String const &old) : size_(0), len_(0), buf_(NULL) { if (old.size() > 0) - allocAndFill(old.buf(), old.size()); + allocAndFill(old.rawBuf(), old.size()); #if DEBUGSTRINGS StringRegistry::Instance().add(this); @@ -141,7 +141,7 @@ PROF_start(StringClean); assert(this); - if (buf()) + if (defined()) memFreeString(size_, buf_); len_ = 0; @@ -188,7 +188,7 @@ snew.allocBuffer(snew.len_ + 1); if (len_) - xmemcpy(snew.buf_, buf(), len_); + xmemcpy(snew.buf_, unsafeBuf(), len_); if (len) xmemcpy(snew.buf_ + len_, str, len); @@ -219,7 +219,7 @@ void String::append(String const &old) { - append (old.buf(), old.len_); + append (old.rawBuf(), old.len_); } void @@ -237,7 +237,7 @@ void String::stat(StoreEntry *entry) const { - storeAppendPrintf(entry, "%p : %d/%d \"%s\"\n",this,len_, size_, buf()); + storeAppendPrintf(entry, "%p : %d/%d \"%.*s\"\n",this,len_, size_, size(), rawBuf()); } StringRegistry & === modified file 'src/String.cci' --- src/String.cci 2009-01-21 03:47:47 +0000 +++ src/String.cci 2009-01-29 16:14:07 +0000 @@ -49,7 +49,29 @@ } char const * -String::buf() const +String::unsafeBuf() const +{ + return buf_; +} + +bool String::defined() const +{ + return buf_!=NULL; +} + +bool String::undefined() const +{ + return buf_==NULL; +} + +char const * +String::rawBuf() const +{ + return buf_; +} + +char const * +String::termedBuf() const { return buf_; } @@ -65,19 +87,19 @@ const char * String::pos(char const *aString) const { - return strstr(buf(), aString); + return strstr(termedBuf(), aString); } const char * String::pos(char const ch) const { - return strchr(buf(), ch); + return strchr(termedBuf(), ch); } const char * String::rpos(char const ch) const { - return strrchr(buf(), (ch)); + return strrchr(termedBuf(), (ch)); } int @@ -94,7 +116,7 @@ if (aString == NULL || aString[0] == '\0') return 1; - return strcmp(buf(), aString); + return strcmp(termedBuf(), aString); } int @@ -114,7 +136,7 @@ if (aString == NULL || aString[0] == '\0') return 1; - return strncmp(buf(), aString, count); + return strncmp(termedBuf(), aString, count); } int @@ -131,19 +153,19 @@ if (aString.size() == 0) return 1; - return strcmp(buf(), aString.buf()); + return strcmp(termedBuf(), aString.termedBuf()); } int String::caseCmp(char const *aString) const { - return strcasecmp(buf(), aString); + return strcasecmp(termedBuf(), aString); } int String::caseCmp(char const *aString, size_t count) const { - return strncasecmp(buf(), aString, count); + return strncasecmp(termedBuf(), aString, count); } void @@ -179,6 +201,6 @@ std::ostream & operator<<(std::ostream& os, String const &aString) { - os << aString.buf(); + os.write(aString.rawBuf(),aString.size()); return os; } === modified file 'src/access_log.cc' --- src/access_log.cc 2009-01-21 03:47:47 +0000 +++ src/access_log.cc 2009-01-29 14:50:26 +0000 @@ -625,7 +625,7 @@ if (al->request) sb = al->request->header.getByName(fmt->data.header.header); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -635,7 +635,7 @@ if (al->reply) sb = al->reply->header.getByName(fmt->data.header.header); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -645,7 +645,7 @@ if (al->request) sb = al->request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -655,7 +655,7 @@ if (al->reply) sb = al->reply->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -764,7 +764,7 @@ case LFT_REQUEST_URLPATH: if (al->request) { - out = al->request->urlpath.buf(); + out = al->request->urlpath.unsafeBuf(); quote = 1; } break; @@ -810,7 +810,7 @@ case LFT_TAG: if (al->request) - out = al->request->tag.buf(); + out = al->request->tag.unsafeBuf(); quote = 1; @@ -823,7 +823,7 @@ case LFT_EXT_LOG: if (al->request) - out = al->request->extacl_log.buf(); + out = al->request->extacl_log.unsafeBuf(); quote = 1; === modified file 'src/adaptation/Config.cc' --- src/adaptation/Config.cc 2009-01-21 03:47:47 +0000 +++ src/adaptation/Config.cc 2009-01-29 16:14:56 +0000 @@ -68,8 +68,8 @@ typedef Services::iterator SCI; for (SCI i = AllServices().begin(); i != AllServices().end(); ++i) { const ServiceConfig &cfg = (*i)->cfg(); - storeAppendPrintf(entry, "%s %s_%s %s %d %s\n", name, cfg.key.buf(), - cfg.methodStr(), cfg.vectPointStr(), cfg.bypass, cfg.uri.buf()); + storeAppendPrintf(entry, "%s %.*s_%s %s %d %.*s\n", name, cfg.key.size(), cfg.key.rawBuf(), + cfg.methodStr(), cfg.vectPointStr(), cfg.bypass, cfg.uri.size(), cfg.uri.rawBuf()); } } @@ -141,7 +141,7 @@ { typedef Groups::iterator GI; for (GI i = AllGroups().begin(); i != AllGroups().end(); ++i) - storeAppendPrintf(entry, "%s %s\n", name, (*i)->id.buf()); + storeAppendPrintf(entry, "%s %s\n", name, (*i)->id.unsafeBuf()); } void @@ -168,7 +168,7 @@ typedef AccessRules::iterator CI; for (CI i = AllRules().begin(); i != AllRules().end(); ++i) { - snprintf(nom, 64, "%s %s", name, (*i)->groupId.buf()); + snprintf(nom, 64, "%s %s", name, (*i)->groupId.unsafeBuf()); dump_acl_access(entry, nom, (*i)->acl); } } === modified file 'src/adaptation/ServiceConfig.cc' --- src/adaptation/ServiceConfig.cc 2008-10-10 08:02:53 +0000 +++ src/adaptation/ServiceConfig.cc 2009-01-29 16:14:56 +0000 @@ -63,7 +63,7 @@ ConfigParser::ParseString(&uri); debugs(3, 5, HERE << cfg_filename << ':' << config_lineno << ": " << - key.buf() << " " << method_point << " " << bypass); + key << " " << method_point << " " << bypass); method = parseMethod(method_point); point = parseVectPoint(method_point); @@ -76,14 +76,14 @@ // extract scheme and use it as the service_configConfig protocol const char *schemeSuffix = "://"; if (const char *schemeEnd = uri.pos(schemeSuffix)) - protocol.limitInit(uri.buf(), schemeEnd - uri.buf()); + protocol.limitInit(uri.rawBuf(), schemeEnd - uri.rawBuf()); //substring debugs(3, 5, HERE << cfg_filename << ':' << config_lineno << ": " << "service protocol is " << protocol); if (!protocol.size()) return false; // skip scheme - const char *s = uri.buf() + protocol.size() + strlen(schemeSuffix); + const char *s = uri.termedBuf() + protocol.size() + strlen(schemeSuffix); const char *e; === modified file 'src/client_side.cc' --- src/client_side.cc 2009-01-27 17:37:32 +0000 +++ src/client_side.cc 2009-01-30 14:55:22 +0000 @@ -464,7 +464,7 @@ aLogEntry->http.version = request->http_ver; aLogEntry->hier = request->hier; aLogEntry->cache.requestSize += request->content_length; - aLogEntry->cache.extuser = request->extacl_user.buf(); + aLogEntry->cache.extuser = request->extacl_user.termedBuf(); if (request->auth_user_request) { @@ -486,10 +486,10 @@ if (al.reply) { al.http.code = al.reply->sline.status; - al.http.content_type = al.reply->content_type.buf(); + al.http.content_type = al.reply->content_type.termedBuf(); } else if (loggingEntry() && loggingEntry()->mem_obj) { al.http.code = loggingEntry()->mem_obj->getReply()->sline.status; - al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.buf(); + al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.unsafeBuf(); } debugs(33, 9, "clientLogRequest: http.code='" << al.http.code << "'"); @@ -852,7 +852,7 @@ static void clientPackTermBound(String boundary, MemBuf * mb) { - mb->Printf("\r\n--%s--\r\n", boundary.buf()); + mb->Printf("\r\n--%.*s--\r\n", boundary.size(), boundary.rawBuf()); debugs(33, 6, "clientPackTermBound: buf offset: " << mb->size); } @@ -866,10 +866,9 @@ assert(spec); /* put boundary */ - debugs(33, 5, "clientPackRangeHdr: appending boundary: " << - boundary.buf()); + debugs(33, 5, "clientPackRangeHdr: appending boundary: " << boundary); /* rfc2046 requires to _prepend_ boundary with ! */ - mb->Printf("\r\n--%s\r\n", boundary.buf()); + mb->Printf("\r\n--%.*s\r\n", boundary.size(), boundary.rawBuf()); /* stuff the header with required entries and pack it */ @@ -891,7 +890,7 @@ } /** - * extracts a "range" from *buf and appends them to mb, updating + * extracts a "range" from *unsafeBuf and appends them to mb, updating * all offsets and such. */ void @@ -1170,7 +1169,7 @@ hdr->delById(HDR_CONTENT_TYPE); httpHeaderPutStrf(hdr, HDR_CONTENT_TYPE, "multipart/byteranges; boundary=\"%s\"", - http->range_iter.boundary.buf()); + http->range_iter.boundary.unsafeBuf()); /* Content-Length is not required in multipart responses * but it is always nice to have one */ actual_clen = http->mRangeCLen(); @@ -1924,7 +1923,7 @@ req_sz = HttpParserReqSz(hp); } - /* We know the whole request is in hp->buf now */ + /* We know the whole request is in hp->unsafeBuf now */ assert(req_sz <= (size_t) hp->bufsiz); @@ -2271,11 +2270,11 @@ request->flags.spoof_client_ip = conn->port->spoof_client_ip; } - if (internalCheck(request->urlpath.buf())) { + if (internalCheck(request->urlpath.termedBuf())) { if (internalHostnameIs(request->GetHost()) && request->port == getMyPort()) { http->flags.internal = 1; - } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.buf())) { + } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.unsafeBuf())) { request->SetHost(internalHostname()); request->port = getMyPort(); http->flags.internal = 1; @@ -2623,7 +2622,7 @@ } /** - * called when new request body data has been buffered in in.buf + * called when new request body data has been buffered in in.unsafeBuf * may close the connection if we were closing and piped everything out */ void === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2009-01-21 03:47:47 +0000 +++ src/client_side_reply.cc 2009-01-30 14:55:22 +0000 @@ -1291,7 +1291,7 @@ int connection_auth_blocked = 0; while ((e = hdr->getEntry(&pos))) { if (e->id == HDR_WWW_AUTHENTICATE) { - const char *value = e->value.buf(); + const char *value = e->value.rawBuf(); if ((strncasecmp(value, "NTLM", 4) == 0 && (value[4] == '\0' || value[4] == ' ')) @@ -1391,7 +1391,7 @@ ThisCache); strListAdd(&strVia, bbuf, ','); hdr->delById(HDR_VIA); - hdr->putStr(HDR_VIA, strVia.buf()); + hdr->putStr(HDR_VIA, strVia.termedBuf()); } /* Signal keep-alive if needed */ hdr->putStr(http->flags.accel ? HDR_CONNECTION : HDR_PROXY_CONNECTION, @@ -1671,7 +1671,7 @@ } /* - * accepts chunk of a http message in buf, parses prefix, filters headers and + * accepts chunk of a http message in unsafeBuf, parses prefix, filters headers and * such, writes processed message to the message recipient */ void === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2009-01-21 03:47:47 +0000 +++ src/client_side_request.cc 2009-01-30 14:55:22 +0000 @@ -426,7 +426,7 @@ const char *asciiaddr; int l; struct in_addr addr; - p = request->x_forwarded_for_iterator.buf(); + p = request->x_forwarded_for_iterator.unsafeBuf(); l = request->x_forwarded_for_iterator.size(); /* @@ -851,7 +851,7 @@ int may_pin = 0; while ((e = req_hdr->getEntry(&pos))) { if (e->id == HDR_AUTHORIZATION || e->id == HDR_PROXY_AUTHORIZATION) { - const char *value = e->value.buf(); + const char *value = e->value.rawBuf(); if (strncasecmp(value, "NTLM ", 5) == 0 || strncasecmp(value, "Negotiate ", 10) == 0 @@ -892,7 +892,7 @@ } #if FORW_VIA_DB - fvdbCountVia(s.buf()); + fvdbCountVia(s.unsafeBuf()); #endif @@ -918,7 +918,7 @@ if (req_hdr->has(HDR_X_FORWARDED_FOR)) { String s = req_hdr->getList(HDR_X_FORWARDED_FOR); - fvdbCountForw(s.buf()); + fvdbCountForw(s.unsafeBuf()); s.clean(); } @@ -1387,13 +1387,13 @@ assert(request_satisfaction_mode); assert(adaptedBodySource != NULL); - if (const size_t contentSize = adaptedBodySource->buf().contentSize()) { + if (const size_t contentSize = adaptedBodySource->unsafeBuf().contentSize()) { BodyPipeCheckout bpc(*adaptedBodySource); - const StoreIOBuffer ioBuf(&bpc.buf, request_satisfaction_offset); + const StoreIOBuffer ioBuf(&bpc.unsafeBuf, request_satisfaction_offset); storeEntry()->write(ioBuf); // assume can write everything request_satisfaction_offset += contentSize; - bpc.buf.consume(contentSize); + bpc.unsafeBuf.consume(contentSize); bpc.checkIn(); } === modified file 'src/eCAP/MessageRep.cc' --- src/eCAP/MessageRep.cc 2008-10-10 08:02:53 +0000 +++ src/eCAP/MessageRep.cc 2009-01-29 16:14:56 +0000 @@ -39,7 +39,7 @@ const String value = squidId == HDR_OTHER ? theHeader.getByName(name.image().c_str()) : theHeader.getStrOrList(squidId); - return Value::FromTempString(value.buf()); + return Value::FromTempString(value.termedBuf()); } void @@ -192,7 +192,7 @@ Ecap::RequestLineRep::Area Ecap::RequestLineRep::uri() const { - return Area::FromTempBuffer(theMessage.urlpath.buf(), + return Area::FromTempBuffer(theMessage.urlpath.unsafeBuf(), theMessage.urlpath.size()); } === modified file 'src/eCAP/ServiceRep.cc' --- src/eCAP/ServiceRep.cc 2008-10-10 08:02:53 +0000 +++ src/eCAP/ServiceRep.cc 2009-01-29 16:14:56 +0000 @@ -56,7 +56,7 @@ bool Ecap::ServiceRep::wantsUrl(const String &urlPath) const { Must(up()); - return theService->wantsUrl(urlPath.buf()); + return theService->wantsUrl(urlPath.termedBuf()); } Adaptation::Initiate * === modified file 'src/errorpage.cc' --- src/errorpage.cc 2009-01-21 03:47:47 +0000 +++ src/errorpage.cc 2009-01-29 14:50:26 +0000 @@ -558,7 +558,7 @@ Packer p; str.Printf("%s %s HTTP/%d.%d\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.unsafeBuf() : "/", request->http_ver.major, request->http_ver.minor); packerToMemInit(&p, &str); request->header.packInto(&p); @@ -736,7 +736,7 @@ Packer p; mb.Printf("%s %s HTTP/%d.%d\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.unsafeBuf() : "/", request->http_ver.major, request->http_ver.minor); packerToMemInit(&p, &mb); request->header.packInto(&p); @@ -928,7 +928,7 @@ */ if (!Config.errorDirectory && request && request->header.getList(HDR_ACCEPT_LANGUAGE, &hdr) ) { - const char *buf = hdr.buf(); // raw header string for parsing + const char *unsafeBuf = hdr.unsafeBuf(); // raw header string for parsing int pos = 0; // current parsing position in header string char *reset = NULL; // where to reset the p pointer for each new tag file char *dt = NULL; @@ -950,12 +950,12 @@ * - IFF a tag contains only two characters we can wildcard ANY translations matching: '-'? .* * with preference given to an exact match. */ - while (pos < hdr.size() && buf[pos] != ';' && buf[pos] != ',' && !xisspace(buf[pos]) && dt < (dir+256) ) { - *dt++ = xtolower(buf[pos++]); + while (pos < hdr.size() && unsafeBuf[pos] != ';' && unsafeBuf[pos] != ',' && !xisspace(unsafeBuf[pos]) && dt < (dir+256) ) { + *dt++ = xtolower(unsafeBuf[pos++]); } *dt++ = '\0'; // nul-terminated the filename content string before system use. - debugs(4, 9, HERE << "STATE: dt='" << dt << "', reset='" << reset << "', reset[1]='" << reset[1] << "', pos=" << pos << ", buf='" << &buf[pos] << "'"); + debugs(4, 9, HERE << "STATE: dt='" << dt << "', reset='" << reset << "', reset[1]='" << reset[1] << "', pos=" << pos << ", buf='" << &unsafeBuf[pos] << "'"); /* if we found anything we might use, try it. */ if (*reset != '\0') { @@ -983,8 +983,8 @@ dt = reset; // reset for next tag testing. we replace the failed name instead of cloning. // IFF we terminated the tag on ';' we need to skip the 'q=' bit to the next ',' or end. - while (pos < hdr.size() && buf[pos] != ',') pos++; - if (buf[pos] == ',') pos++; + while (pos < hdr.size() && unsafeBuf[pos] != ',') pos++; + if (unsafeBuf[pos] == ',') pos++; } } #endif /* USE_ERR_LOCALES */ === modified file 'src/external_acl.cc' --- src/external_acl.cc 2009-01-26 08:38:26 +0000 +++ src/external_acl.cc 2009-01-29 14:50:26 +0000 @@ -757,7 +757,7 @@ external_acl_cache_touch(acl->def, entry); result = entry->result; - external_acl_message = entry->message.buf(); + external_acl_message = entry->message.unsafeBuf(); debugs(82, 2, "aclMatchExternal: " << acl->def->name << " = " << result); @@ -885,7 +885,7 @@ break; case _external_acl_format::EXT_ACL_PATH: - str = request->urlpath.buf(); + str = request->urlpath.unsafeBuf(); break; case _external_acl_format::EXT_ACL_METHOD: @@ -894,49 +894,49 @@ case _external_acl_format::EXT_ACL_HEADER_REQUEST: sb = request->header.getByName(format->header); - str = sb.buf(); + str = sb.unsafeBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_ID: sb = request->header.getStrOrList(format->header_id); - str = sb.buf(); + str = sb.unsafeBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_MEMBER: sb = request->header.getByNameListMember(format->header, format->member, format->separator); - str = sb.buf(); + str = sb.unsafeBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_ID_MEMBER: sb = request->header.getListMember(format->header_id, format->member, format->separator); - str = sb.buf(); + str = sb.unsafeBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REPLY: if (reply) { sb = reply->header.getByName(format->header); - str = sb.buf(); + str = sb.unsafeBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_ID: if (reply) { sb = reply->header.getStrOrList(format->header_id); - str = sb.buf(); + str = sb.unsafeBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_MEMBER: if (reply) { sb = reply->header.getByNameListMember(format->header, format->member, format->separator); - str = sb.buf(); + str = sb.unsafeBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_ID_MEMBER: if (reply) { sb = reply->header.getListMember(format->header_id, format->member, format->separator); - str = sb.buf(); + str = sb.unsafeBuf(); } break; #if USE_SSL @@ -987,7 +987,7 @@ #endif case _external_acl_format::EXT_ACL_EXT_USER: - str = request->extacl_user.buf(); + str = request->extacl_user.unsafeBuf(); break; case _external_acl_format::EXT_ACL_UNKNOWN: @@ -1336,8 +1336,8 @@ if (entry != NULL) { debugs(82, 4, "externalAclLookup: entry = { date=" << (long unsigned int) entry->date << ", result=" << - entry->result << ", user=" << entry->user.buf() << " tag=" << - entry->tag.buf() << " log=" << entry->log.buf() << " }"); + entry->result << ", user=" << entry->user.unsafeBuf() << " tag=" << + entry->tag.unsafeBuf() << " log=" << entry->log.unsafeBuf() << " }"); } === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2009-01-21 03:47:47 +0000 +++ src/fs/coss/store_dir_coss.cc 2009-01-29 16:14:56 +0000 @@ -1175,7 +1175,7 @@ if (!stripe_path) { String result = path; result.append("/stripe"); - const_cast(this)->stripe_path = xstrdup(result.buf()); + const_cast(this)->stripe_path = xstrdup(result.termedBuf()); } return stripe_path; === modified file 'src/ftp.cc' --- src/ftp.cc 2009-01-21 03:47:47 +0000 +++ src/ftp.cc 2009-01-29 14:50:26 +0000 @@ -567,7 +567,7 @@ wordlist *w; char *dirup; int i, j, k; - const char *title = title_url.buf(); + const char *title = title_url.unsafeBuf(); flags.listing_started = true; printfReplyBody("\n"); printfReplyBody("\n", @@ -586,7 +586,7 @@ if (flags.need_base_href) printfReplyBody("\n", - html_quote(base_href.buf())); + html_quote(base_href.unsafeBuf())); printfReplyBody("\n"); @@ -1013,7 +1013,7 @@ if (flags.dir_slash) { url = xstrdup("./"); } else { - const char *title = title_url.buf(); + const char *title = title_url.unsafeBuf(); int k = 6 + strcspn(&title[6], "/"); char *t; url = xstrdup(title + k); @@ -1150,7 +1150,7 @@ FtpStateData::parseListing() { char *buf = data.readBuf->content(); - char *sbuf; /* NULL-terminated copy of buf */ + char *sbuf; /* NULL-terminated copy of unsafeBuf */ char *end; char *line; char *s; @@ -1485,7 +1485,7 @@ /* UNIX root directory */ flags.isdir = 1; flags.root_dir = 1; - } else if ((l >= 1) && (*(request->urlpath.buf() + l - 1) == '/')) { + } else if ((l >= 1) && (*(request->urlpath.unsafeBuf() + l - 1) == '/')) { /* Directory URL, ending in / */ flags.isdir = 1; @@ -1574,7 +1574,7 @@ checkUrlpath(); buildTitleUrl(); debugs(9, 5, HERE << "host=" << request->GetHost() << ", path=" << - request->urlpath.buf() << ", user=" << user << ", passwd=" << + request->urlpath.unsafeBuf() << ", user=" << user << ", passwd=" << password); state = BEGIN; @@ -2025,7 +2025,7 @@ mode = 'A'; } else { t = ftpState->request->urlpath.rpos('/'); - filename = t ? t + 1 : ftpState->request->urlpath.buf(); + filename = t ? t + 1 : ftpState->request->urlpath.unsafeBuf(); mode = mimeGetTransferMode(filename); } @@ -2054,7 +2054,7 @@ debugs(9, 3, HERE); if (code == 200) { - p = path = xstrdup(ftpState->request->urlpath.buf()); + p = path = xstrdup(ftpState->request->urlpath.unsafeBuf()); if (*p == '/') p++; @@ -2308,7 +2308,7 @@ if (ftpState->theSize == 0) { debugs(9, 2, "SIZE reported " << ftpState->ctrl.last_reply << " on " << - ftpState->title_url.buf()); + ftpState->title_url.unsafeBuf()); ftpState->theSize = -1; } } else if (code < 0) { @@ -3396,7 +3396,7 @@ safe_free(ftpState->filepath); /* Build the new path (urlpath begins with /) */ - path = xstrdup(ftpState->request->urlpath.buf()); + path = xstrdup(ftpState->request->urlpath.unsafeBuf()); rfc1738_unescape(path); @@ -3640,7 +3640,7 @@ e->buffer(); /* released when done processing current data payload */ - filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.buf(); + filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.unsafeBuf(); if (flags.isdir) { mime_type = "text/html"; @@ -3753,12 +3753,12 @@ if (request->protocol != PROTO_FTP) return NULL; - if ( !strncmp(request->urlpath.buf(), "/", 1) ) { + if ( !strncmp(request->urlpath.unsafeBuf(), "/", 1) ) { newbuf.append(request->urlpath); request->urlpath.absorb(newbuf); safe_free(request->canonical); - } else if ( !strncmp(request->urlpath.buf(), "%2f", 3) ) { - newbuf.append(request->urlpath.buf() +1); + } else if ( !strncmp(request->urlpath.unsafeBuf(), "%2f", 3) ) { + newbuf.append(request->urlpath.unsafeBuf() +1); request->urlpath.absorb(newbuf); safe_free(request->canonical); } === modified file 'src/gopher.cc' --- src/gopher.cc 2009-01-21 03:47:47 +0000 +++ src/gopher.cc 2009-01-29 14:50:26 +0000 @@ -277,7 +277,7 @@ static void gopher_request_parse(const HttpRequest * req, char *type_id, char *request) { - const char *path = req->urlpath.buf(); + const char *path = req->urlpath.unsafeBuf(); if (request) request[0] = '\0'; @@ -751,7 +751,7 @@ } /* while loop */ if (outbuf.size() > 0) { - entry->append(outbuf.buf(), outbuf.size()); + entry->append(outbuf.unsafeBuf(), outbuf.size()); /* now let start sending stuff to client */ entry->flush(); } @@ -853,7 +853,7 @@ do_next_read = 0; } else if (len == 0) { /* Connection closed; retrieval done. */ - /* flush the rest of data in temp buf if there is one. */ + /* flush the rest of data in temp unsafeBuf if there is one. */ if (gopherState->conversion != gopher_ds::NORMAL) gopherEndHTML(gopherState); === modified file 'src/http.cc' --- src/http.cc 2009-01-21 03:47:47 +0000 +++ src/http.cc 2009-01-29 14:50:26 +0000 @@ -93,7 +93,7 @@ const char *url; if (_peer->options.originserver) - url = orig_request->urlpath.buf(); + url = orig_request->urlpath.unsafeBuf(); else url = entry->url(); @@ -578,7 +578,7 @@ strListAdd(&vstr, name, ','); hdr = request->header.getByName(name); safe_free(name); - value = hdr.buf(); + value = hdr.unsafeBuf(); if (value) { value = rfc1738_escape_part(value); @@ -603,7 +603,7 @@ strListAdd(&vstr, name, ','); hdr = request->header.getByName(name); safe_free(name); - value = hdr.buf(); + value = hdr.unsafeBuf(); if (value) { value = rfc1738_escape_part(value); @@ -618,8 +618,8 @@ vary.clean(); #endif - debugs(11, 3, "httpMakeVaryMark: " << vstr.buf()); - return vstr.buf(); + debugs(11, 3, "httpMakeVaryMark: " << vstr.unsafeBuf()); + return vstr.unsafeBuf(); } void @@ -791,7 +791,7 @@ header = hdr->getStrOrList(HDR_PROXY_SUPPORT); /* XXX This ought to be done in a case-insensitive manner */ - rc = (strstr(header.buf(), "Session-Based-Authentication") != NULL); + rc = (strstr(header.unsafeBuf(), "Session-Based-Authentication") != NULL); return rc; } @@ -988,11 +988,11 @@ */ /* void -HttpStateData::ReadReplyWrapper(int fd, char *buf, size_t len, comm_err_t flag, int xerrno, void *data) +HttpStateData::ReadReplyWrapper(int fd, char *unsafeBuf, size_t len, comm_err_t flag, int xerrno, void *data) { HttpStateData *httpState = static_cast(data); assert (fd == httpState->fd); - // assert(buf == readBuf->content()); + // assert(unsafeBuf == readBuf->content()); PROF_start(HttpStateData_readReply); httpState->readReply (len, flag, xerrno); PROF_stop(HttpStateData_readReply); @@ -1072,8 +1072,8 @@ if (!flags.headers_parsed && len > 0 && fd_table[fd].uses > 1) { /* Skip whitespace between replies */ - while (len > 0 && xisspace(*buf)) - xmemmove(buf, buf + 1, len--); + while (len > 0 && xisspace(*unsafeBuf)) + xmemmove(unsafeBuf, unsafeBuf + 1, len--); if (len == 0) { /* Continue to read... */ @@ -1454,7 +1454,7 @@ orig_request->http_ver.major, orig_request->http_ver.minor, ThisCache); strListAdd(&strVia, bbuf, ','); - hdr_out->putStr(HDR_VIA, strVia.buf()); + hdr_out->putStr(HDR_VIA, strVia.unsafeBuf()); strVia.clean(); } @@ -1465,7 +1465,7 @@ snprintf(bbuf, BBUF_SZ, "%s=\"Surrogate/1.0 ESI/1.0\"", Config.Accel.surrogate_id); strListAdd(&strSurrogate, bbuf, ','); - hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.buf()); + hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.unsafeBuf()); } #endif @@ -1495,7 +1495,7 @@ strFwd = orig_request->client_addr.NtoA(ntoabuf, MAX_IPSTRLEN); } if (strFwd.size() > 0) - hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.buf()); + hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.unsafeBuf()); } /** If set to DELETE - do not copy through. */ strFwd.clean(); @@ -1531,7 +1531,7 @@ const char *username = "-"; if (orig_request->extacl_user.size()) - username = orig_request->extacl_user.buf(); + username = orig_request->extacl_user.unsafeBuf(); else if (orig_request->auth_user_request) username = orig_request->auth_user_request->username(); @@ -1542,7 +1542,7 @@ } else if (strcmp(orig_request->peer_login, "PASS") == 0) { if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) { char loginbuf[256]; - snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf()); + snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.unsafeBuf(), orig_request->extacl_passwd.unsafeBuf()); httpHeaderPutStrf(hdr_out, HDR_PROXY_AUTHORIZATION, "Basic %s", base64_encode(loginbuf)); } @@ -1569,7 +1569,7 @@ hdr_out->putStr(HDR_AUTHORIZATION, auth); } else if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) { char loginbuf[256]; - snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf()); + snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.unsafeBuf(), orig_request->extacl_passwd.unsafeBuf()); httpHeaderPutStrf(hdr_out, HDR_AUTHORIZATION, "Basic %s", base64_encode(loginbuf)); } @@ -1581,7 +1581,7 @@ if (orig_request->auth_user_request) username = orig_request->auth_user_request->username(); else if (orig_request->extacl_user.size()) - username = orig_request->extacl_user.buf(); + username = orig_request->extacl_user.unsafeBuf(); snprintf(loginbuf, sizeof(loginbuf), "%s%s", username, orig_request->peer_login + 1); @@ -1613,7 +1613,7 @@ httpHdrCcSetMaxAge(cc, getMaxAge(url)); if (request->urlpath.size()) - assert(strstr(url, request->urlpath.buf())); + assert(strstr(url, request->urlpath.unsafeBuf())); } /* Enforce sibling relations */ @@ -1650,10 +1650,10 @@ void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, String strConnection, HttpRequest * request, HttpRequest * orig_request, HttpHeader * hdr_out, int we_do_ranges, http_state_flags flags) { - debugs(11, 5, "httpBuildRequestHeader: " << e->name.buf() << ": " << e->value.buf()); + debugs(11, 5, "httpBuildRequestHeader: " << e->name.unsafeBuf() << ": " << e->value.unsafeBuf()); if (!httpRequestHdrAllowed(e, &strConnection)) { - debugs(11, 2, "'" << e->name.buf() << "' header denied by anonymize_headers configuration"); + debugs(11, 2, "'" << e->name.unsafeBuf() << "' header denied by anonymize_headers configuration"); return; } @@ -1814,7 +1814,7 @@ HttpVersion httpver(1, 0); mb->Printf("%s %s HTTP/%d.%d\r\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.unsafeBuf() : "/", httpver.major,httpver.minor); /* build and pack headers */ { === modified file 'src/internal.cc' --- src/internal.cc 2009-01-21 03:47:47 +0000 +++ src/internal.cc 2009-01-29 14:50:26 +0000 @@ -51,7 +51,7 @@ internalStart(HttpRequest * request, StoreEntry * entry) { ErrorState *err; - const char *upath = request->urlpath.buf(); + const char *upath = request->urlpath.unsafeBuf(); debugs(76, 3, "internalStart: " << request->client_addr << " requesting '" << upath << "'"); if (0 == strcmp(upath, "/squid-internal-dynamic/netdb")) { === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2009-01-21 03:47:47 +0000 +++ src/peer_digest.cc 2009-01-29 14:50:26 +0000 @@ -231,7 +231,7 @@ { eventAdd("peerDigestCheck", peerDigestCheck, pd, (double) delay, 1); pd->times.next_check = squid_curtime + delay; - debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host.buf() << " in " << delay << " secs"); + debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host.unsafeBuf() << " in " << delay << " secs"); } /* @@ -241,10 +241,10 @@ peerDigestNotePeerGone(PeerDigest * pd) { if (pd->flags.requested) { - debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " gone, will destroy after fetch."); + debugs(72, 2, "peerDigest: peer " << pd->host.unsafeBuf() << " gone, will destroy after fetch."); /* do nothing now, the fetching chain will notice and take action */ } else { - debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " is gone, destroying now."); + debugs(72, 2, "peerDigest: peer " << pd->host.unsafeBuf() << " is gone, destroying now."); peerDigestDestroy(pd); } } @@ -279,7 +279,7 @@ /* per-peer limit */ if (req_time - pd->times.received < PeerDigestReqMinGap) { - debugs(72, 2, "peerDigestCheck: " << pd->host.buf() << + debugs(72, 2, "peerDigestCheck: " << pd->host.unsafeBuf() << ", avoiding close peer requests (" << (int) (req_time - pd->times.received) << " < " << (int) PeerDigestReqMinGap << " secs)."); @@ -289,7 +289,7 @@ /* global limit */ if (req_time - pd_last_req_time < GlobDigestReqMinGap) { - debugs(72, 2, "peerDigestCheck: " << pd->host.buf() << + debugs(72, 2, "peerDigestCheck: " << pd->host.unsafeBuf() << ", avoiding close requests (" << (int) (req_time - pd_last_req_time) << " < " << (int) GlobDigestReqMinGap << " secs)."); @@ -544,7 +544,7 @@ assert(reply); assert (reply->sline.status != 0); status = reply->sline.status; - debugs(72, 3, "peerDigestFetchReply: " << pd->host.buf() << " status: " << status << + debugs(72, 3, "peerDigestFetchReply: " << pd->host.unsafeBuf() << " status: " << status << ", expires: " << (long int) reply->expires << " (" << std::showpos << (int) (reply->expires - squid_curtime) << ")"); @@ -634,7 +634,7 @@ assert (fetch->entry->getReply()->sline.status != 0); if (fetch->entry->getReply()->sline.status != HTTP_OK) { - debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host.buf() << + debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host.unsafeBuf() << " status " << fetch->entry->getReply()->sline.status << " got cached!"); @@ -762,7 +762,7 @@ #endif else - host = pd->host.buf(); + host = pd->host.unsafeBuf(); } debugs(72, 6, step_name << ": peer " << host << ", offset: " << @@ -813,7 +813,7 @@ peerDigestFetchStop(DigestFetchState * fetch, char *buf, const char *reason) { assert(reason); - debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host.buf() << ", reason: " << reason); + debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host.unsafeBuf() << ", reason: " << reason); peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 0); } @@ -822,7 +822,7 @@ peerDigestFetchAbort(DigestFetchState * fetch, char *buf, const char *reason) { assert(reason); - debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host.buf() << ", reason: " << reason); + debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host.unsafeBuf() << ", reason: " << reason); peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 1); } @@ -872,7 +872,7 @@ peerDigestPDFinish(DigestFetchState * fetch, int pcb_valid, int err) { PeerDigest *pd = fetch->pd; - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); pd->times.received = squid_curtime; pd->times.req_delay = fetch->resp_time; @@ -986,7 +986,7 @@ { StoreDigestCBlock cblock; int freed_size = 0; - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); xmemcpy(&cblock, buf, sizeof(cblock)); /* network -> host conversions */ @@ -1080,7 +1080,7 @@ const int bit_util = cacheDigestBitUtil(pd->cd); if (bit_util > 65) { - debugs(72, 0, "Warning: " << pd->host.buf() << + debugs(72, 0, "Warning: " << pd->host.unsafeBuf() << " peer digest has too many bits on (" << bit_util << "%%)."); return 0; @@ -1106,7 +1106,7 @@ assert(pd); - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); storeAppendPrintf(e, "\npeer digest from %s\n", host); cacheDigestGuessStatsReport(&pd->stats.guess, e, host); === modified file 'src/redirect.cc' --- src/redirect.cc 2009-01-21 03:47:47 +0000 +++ src/redirect.cc 2009-01-29 14:50:26 +0000 @@ -137,8 +137,8 @@ if (http->request->auth_user_request) r->client_ident = http->request->auth_user_request->username(); - else if (http->request->extacl_user.buf() != NULL) { - r->client_ident = http->request->extacl_user.buf(); + else if (http->request->extacl_user.unsafeBuf() != NULL) { + r->client_ident = http->request->extacl_user.unsafeBuf(); } if (!r->client_ident && (conn != NULL && conn->rfc931[0])) === modified file 'src/stat.cc' --- src/stat.cc 2009-01-21 03:47:47 +0000 +++ src/stat.cc 2009-01-29 14:50:26 +0000 @@ -1653,8 +1653,8 @@ if (http->request->auth_user_request) p = http->request->auth_user_request->username(); - else if (http->request->extacl_user.buf() != NULL) { - p = http->request->extacl_user.buf(); + else if (http->request->extacl_user.unsafeBuf() != NULL) { + p = http->request->extacl_user.unsafeBuf(); } if (!p && (conn != NULL && conn->rfc931[0])) === modified file 'src/store.cc' --- src/store.cc 2009-01-21 03:47:47 +0000 +++ src/store.cc 2009-01-29 14:50:26 +0000 @@ -689,7 +689,7 @@ if (vary.size()) { /* Again, we own this structure layout */ - rep->header.putStr(HDR_VARY, vary.buf()); + rep->header.putStr(HDR_VARY, vary.unsafeBuf()); vary.clean(); } === modified file 'src/store_log.cc' --- src/store_log.cc 2009-01-21 03:47:47 +0000 +++ src/store_log.cc 2009-01-29 14:50:26 +0000 @@ -86,7 +86,7 @@ (int) reply->date, (int) reply->last_modified, (int) reply->expires, - reply->content_type.size() ? reply->content_type.buf() : "unknown", + reply->content_type.size() ? reply->content_type.unsafeBuf() : "unknown", reply->content_length, e->contentLen(), RequestMethodStr(mem->method), === modified file 'src/tests/testEvent.cc' --- src/tests/testEvent.cc 2008-10-10 08:02:53 +0000 +++ src/tests/testEvent.cc 2009-01-30 14:55:22 +0000 @@ -98,19 +98,19 @@ printf("Actual Text:\n"); /* TODO: these should really be just [] lookups, but String doesn't have those here yet. */ for ( int i = 0; i < anEntry->_appended_text.size(); i++) { - CPPUNIT_ASSERT( expect.buf()[i] ); - CPPUNIT_ASSERT( anEntry->_appended_text.buf()[i] ); + CPPUNIT_ASSERT( expect[i] ); + CPPUNIT_ASSERT( anEntry->_appended_text[i] ); /* slight hack to make special chars visible */ - switch (anEntry->_appended_text.buf()[i]) { + switch (anEntry->_appended_text[i]) { case '\t': printf("\\t"); break; default: - printf("%c", anEntry->_appended_text.buf()[i] ); + printf("%c", anEntry->_appended_text[i] ); } /* make this an int comparison, so that we can see the ASCII code at failure */ - CPPUNIT_ASSERT_EQUAL( (int)expect.buf()[i], (int)anEntry->_appended_text.buf()[i] ); + CPPUNIT_ASSERT_EQUAL( (int)(expect[i]), (int)anEntry->_appended_text[i] ); } printf("\n"); CPPUNIT_ASSERT_EQUAL( expect, anEntry->_appended_text); === modified file 'src/tests/testStoreController.cc' --- src/tests/testStoreController.cc 2008-08-10 05:49:14 +0000 +++ src/tests/testStoreController.cc 2009-01-30 14:55:22 +0000 @@ -111,7 +111,7 @@ EBIT_CLR(e->flags, KEY_PRIVATE); e->ping_status = PING_NONE; EBIT_CLR(e->flags, ENTRY_VALIDATED); - e->hashInsert((const cache_key *)name.buf()); /* do it after we clear KEY_PRIVATE */ + e->hashInsert((const cache_key *)name.termedBuf()); /* do it after we clear KEY_PRIVATE */ return e; } === modified file 'src/tests/testStoreHashIndex.cc' --- src/tests/testStoreHashIndex.cc 2008-08-10 05:49:14 +0000 +++ src/tests/testStoreHashIndex.cc 2009-01-30 14:55:22 +0000 @@ -92,7 +92,7 @@ EBIT_CLR(e->flags, KEY_PRIVATE); e->ping_status = PING_NONE; EBIT_CLR(e->flags, ENTRY_VALIDATED); - e->hashInsert((const cache_key *)name.buf()); /* do it after we clear KEY_PRIVATE */ + e->hashInsert((const cache_key *)name.termedBuf()); /* do it after we clear KEY_PRIVATE */ return e; } === modified file 'src/url.cc' --- src/url.cc 2009-01-21 03:47:47 +0000 +++ src/url.cc 2009-01-29 14:50:26 +0000 @@ -439,7 +439,7 @@ return request->canonical; if (request->protocol == PROTO_URN) { - snprintf(urlbuf, MAX_URL, "urn:%s", request->urlpath.buf()); + snprintf(urlbuf, MAX_URL, "urn:%s", request->urlpath.unsafeBuf()); } else { /// \todo AYJ: this could use "if..else and method == METHOD_CONNECT" easier. switch (request->method.id()) { @@ -460,7 +460,7 @@ *request->login ? "@" : null_string, request->GetHost(), portbuf, - request->urlpath.buf()); + request->urlpath.unsafeBuf()); break; } @@ -482,7 +482,7 @@ char *t; if (request->protocol == PROTO_URN) { - snprintf(buf, MAX_URL, "urn:%s", request->urlpath.buf()); + snprintf(buf, MAX_URL, "urn:%s", request->urlpath.unsafeBuf()); } else { /// \todo AYJ: this could use "if..else and method == METHOD_CONNECT" easier. switch (request->method.id()) { @@ -515,7 +515,7 @@ loginbuf, request->GetHost(), portbuf, - request->urlpath.buf()); + request->urlpath.unsafeBuf()); /* * strip arguments AFTER a question-mark */ @@ -584,7 +584,7 @@ char *urlbuf = (char *)xmalloc(MAX_URL * sizeof(char)); if (req->protocol == PROTO_URN) { - snprintf(urlbuf, MAX_URL, "urn:%s", req->urlpath.buf()); + snprintf(urlbuf, MAX_URL, "urn:%s", req->urlpath.unsafeBuf()); return (urlbuf); } @@ -610,7 +610,7 @@ if (relUrl[0] == '/') { strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1); } else { - const char *path = req->urlpath.buf(); + const char *path = req->urlpath.unsafeBuf(); const char *last_slash = strrchr(path, '/'); if (last_slash == NULL) { === modified file 'src/urn.cc' --- src/urn.cc 2009-01-21 03:47:47 +0000 +++ src/urn.cc 2009-01-29 14:50:26 +0000 @@ -174,10 +174,10 @@ if ((t = urlpath.pos(':')) != NULL) { urlpath.set(t, '\0'); - result = xstrdup(urlpath.buf()); + result = xstrdup(urlpath.unsafeBuf()); urlpath.set(t, ':'); } else { - result = xstrdup(urlpath.buf()); + result = xstrdup(urlpath.unsafeBuf()); } return result; @@ -186,7 +186,7 @@ bool UrnState::RequestNeedsMenu(HttpRequest *r) { - return strncasecmp(r->urlpath.buf(), "menu.", 5) == 0; + return strncasecmp(r->urlpath.unsafeBuf(), "menu.", 5) == 0; } void @@ -202,7 +202,7 @@ { LOCAL_ARRAY(char, local_urlres, 4096); char *host = getHost (uri); - snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.buf()); + snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.unsafeBuf()); safe_free (host); safe_free (urlres); urlres = xstrdup (local_urlres); @@ -213,7 +213,7 @@ UrnState::setUriResFromRequest(HttpRequest *r) { if (RequestNeedsMenu(r)) { - updateRequestURL(r, r->urlpath.buf() + 5); + updateRequestURL(r, r->urlpath.unsafeBuf() + 5); flags.force_menu = 1; } === modified file 'src/whois.cc' --- src/whois.cc 2009-01-21 03:47:47 +0000 +++ src/whois.cc 2009-01-29 14:50:26 +0000 @@ -98,7 +98,7 @@ buf = (char *)xmalloc(l); - snprintf(buf, l, "%s\r\n", p->request->urlpath.buf() + 1); + snprintf(buf, l, "%s\r\n", p->request->urlpath.unsafeBuf() + 1); comm_write(fd, buf, strlen(buf), whoisWriteComplete, p, NULL); comm_read(fd, p->buf, BUFSIZ, whoisReadReply, p); # Begin bundle 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