]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 2633 fix: Ecap::HeaderRep::value(name) fails when there is no named header
authorAlex Rousskov <rousskov@measurement-factory.com>
Sun, 23 May 2010 16:43:46 +0000 (10:43 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Sun, 23 May 2010 16:43:46 +0000 (10:43 -0600)
field

Calling Adaptation::Ecap::HeaderRep::value(const Name &name) with names
of header fields that do not exist leads to

    ICAP/AsyncJob.cc(218) dial: AsyncJob::noteStart threw exception:
    basic_string::_S_construct NULL not valid

I suspect this is a combination of
 - std::string constructor incapable of handling a nil char* pointer.
 - String::termedBuf() returning an nil pointer when the string is empty.

When there is no specified header field in the message, the value()
wrapper in Squid gets an empty String for the header value, which is
then used to create std::string, which fails or leads to failure.

I think it is wrong for termedBuf to return nil (because nil is not
0-terminated). I have not tried to fix that because we will have a new
String class soon.

src/adaptation/ecap/MessageRep.cc

index bb568034060918118c6d4132f86ec80984800092..5481983de0fd672300ef349b96d73c682a8cc1aa 100644 (file)
@@ -38,7 +38,8 @@ Adaptation::Ecap::HeaderRep::value(const Name &name) const
     const String value = squidId == HDR_OTHER ?
                          theHeader.getByName(name.image().c_str()) :
                          theHeader.getStrOrList(squidId);
-    return Value::FromTempString(value.termedBuf());
+    return value.defined() ?
+        Value::FromTempString(value.termedBuf()) : Value();
 }
 
 void