summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
Diffstat (limited to 'methods')
-rw-r--r--methods/ftp.cc1
-rw-r--r--methods/gpgv.cc1
-rw-r--r--methods/http.cc41
-rw-r--r--methods/rsh.cc2
4 files changed, 24 insertions, 21 deletions
diff --git a/methods/ftp.cc b/methods/ftp.cc
index d55ac1224..979adca62 100644
--- a/methods/ftp.cc
+++ b/methods/ftp.cc
@@ -436,6 +436,7 @@ bool FTPConn::WriteMsg(unsigned int &Ret,string &Text,const char *Fmt,...)
char S[400];
vsnprintf(S,sizeof(S) - 4,Fmt,args);
strcat(S,"\r\n");
+ va_end(args);
if (Debug == true)
cerr << "-> '" << QuoteString(S,"") << "'" << endl;
diff --git a/methods/gpgv.cc b/methods/gpgv.cc
index fe8bac6c9..ea8a26fd4 100644
--- a/methods/gpgv.cc
+++ b/methods/gpgv.cc
@@ -152,6 +152,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
}
}
fclose(pipein);
+ free(buffer);
int status;
waitpid(pid, &status, 0);
diff --git a/methods/http.cc b/methods/http.cc
index db1085a2d..278ddb290 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -682,28 +682,27 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
// Just in case.
if (Itm->Uri.length() >= sizeof(Buf))
abort();
-
- /* Build the request. We include a keep-alive header only for non-proxy
- requests. This is to tweak old http/1.0 servers that do support keep-alive
- but not HTTP/1.1 automatic keep-alive. Doing this with a proxy server
- will glitch HTTP/1.0 proxies because they do not filter it out and
- pass it on, HTTP/1.1 says the connection should default to keep alive
- and we expect the proxy to do this */
+
+ /* RFC 2616 ยง5.1.2 requires absolute URIs for requests to proxies,
+ but while its a must for all servers to accept absolute URIs,
+ it is assumed clients will sent an absolute path for non-proxies */
+ std::string requesturi;
if (Proxy.empty() == true || Proxy.Host.empty())
- {
- // see LP bugs #1003633 and #1086997. The "+" is encoded as a workaround
- // for a amazon S3 bug
- sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n",
- QuoteString(Uri.Path,"+~ ").c_str(),ProperHost.c_str());
- }
+ requesturi = Uri.Path;
else
- {
- /* Generate a cache control header if necessary. We place a max
- cache age on index files, optionally set a no-cache directive
- and a no-store directive for archives. */
- sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
- Itm->Uri.c_str(),ProperHost.c_str());
- }
+ requesturi = Itm->Uri;
+
+ // The "+" is encoded as a workaround for a amazon S3 bug
+ // see LP bugs #1003633 and #1086997.
+ requesturi = QuoteString(requesturi, "+~ ");
+
+ /* Build the request. No keep-alive is included as it is the default
+ in 1.1, can cause problems with proxies, and we are an HTTP/1.1
+ client anyway.
+ C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
+ sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
+ requesturi.c_str(),ProperHost.c_str());
+
// generate a cache control header (if needed)
if (_config->FindB("Acquire::http::No-Cache",false) == true)
{
@@ -1401,7 +1400,7 @@ bool HttpMethod::AutoDetectProxy()
char buf[512];
int InFd = Pipes[0];
close(Pipes[1]);
- int res = read(InFd, buf, sizeof(buf));
+ int res = read(InFd, buf, sizeof(buf)-1);
ExecWait(Process, "ProxyAutoDetect", true);
if (res < 0)
diff --git a/methods/rsh.cc b/methods/rsh.cc
index fb3782314..d76dca6ef 100644
--- a/methods/rsh.cc
+++ b/methods/rsh.cc
@@ -218,6 +218,8 @@ bool RSHConn::WriteMsg(std::string &Text,bool Sync,const char *Fmt,...)
// sprintf the description
char S[512];
vsnprintf(S,sizeof(S) - 4,Fmt,args);
+ va_end(args);
+
if (Sync == true)
strcat(S," 2> /dev/null || echo\n");
else