File libproxy-backports.patch of Package libproxy

Index: libproxy/url.cpp
===================================================================
--- libproxy/url.cpp.orig
+++ libproxy/url.cpp
@@ -36,12 +36,9 @@
 
 #ifdef WIN32
 #include <io.h>
-#define pfsize(st) (st.st_size)
 #define close _close
 #define read _read
 #define SHUT_RDWR SD_BOTH
-#else
-#define pfsize(st) (st.st_blksize * st.st_blocks)
 #endif
 
 #include "url.hpp"
@@ -56,13 +53,6 @@ using namespace std;
 // This is the maximum pac size (to avoid memory attacks)
 #define PAC_MAX_SIZE 102400
 
-const string url::GENERIC_DELIMITERS(":/?#[]@");
-const string url::SUBCOMPONENT_DELIMITERS("!$&'()*+,;=");
-const string url::ALLOWED_IN_USERINFO_ELEMENT(url::SUBCOMPONENT_DELIMITERS);
-const string url::ALLOWED_IN_USERINFO(url::ALLOWED_IN_USERINFO_ELEMENT + ":");
-const string url::ALLOWED_IN_PATH_ELEMENT(url::SUBCOMPONENT_DELIMITERS + ":@");
-const string url::ALLOWED_IN_PATH(url::ALLOWED_IN_PATH_ELEMENT + "/");
-
 static inline int get_default_port(string scheme) {
 	struct servent *serv;
 	size_t plus = scheme.find('+');
@@ -109,8 +99,8 @@ bool url::is_valid(const string url_) {
 
 string url::encode(const string &data, const string &valid_reserved) {
 	ostringstream encoded;
-	for (int i=0; data[i]; i++) {
-		if (isalnum(data[i])
+	for (unsigned int i=0; i < data.size(); i++) {
+		if (isalnum((unsigned char)data[i])
 				|| valid_reserved.find(data[i]) != string::npos
 				|| string("-._~").find(data[i]) != string::npos)
 			encoded << data[i];
@@ -211,7 +201,8 @@ url::url(const string &url) throw(parse_
 			host_start = userinfo_end + 1;
 
 		/* Check for IPv6 IP */
-		if (hier_part[host_start] == '[') {
+		if (host_start < hier_part.size()
+                    && hier_part[host_start] == '[') {
 			host_end = hier_part.find(']', host_start);
 			if (host_end == string::npos)
 				throw parse_error("Invalid URL: " + url);
@@ -232,7 +223,7 @@ url::url(const string &url) throw(parse_
 		/* Get port */
 		m_port = get_default_port(m_scheme);
 
-		if (host_end != hier_part.size()
+		if (host_end < hier_part.size()
 			&& hier_part[host_end] == ':') {
 			size_t port_start = host_end + 1;
 			m_port = atoi(hier_part.c_str() + port_start);
@@ -400,10 +391,12 @@ char* url::get_pac() {
 		struct stat st;
 		if ((sock = ::open(m_path.c_str(), O_RDONLY)) < 0)
 			return NULL;
-		if (!fstat(sock, &st) && pfsize(st) < PAC_MAX_SIZE) {
-			buffer = new char[pfsize(st)+1];
-			if (read(sock, buffer, pfsize(st)) == 0) {
-				delete buffer;
+
+		if (!fstat(sock, &st) && st.st_size < PAC_MAX_SIZE) {
+			buffer = new char[st.st_size+1];
+			memset(buffer, 0, st.st_size+1);
+			if (read(sock, buffer, st.st_size) == 0) {
+				delete[] buffer;
 				buffer = NULL;
 			}
 		}
Index: libproxy/modules/config_gnome.cpp
===================================================================
--- libproxy/modules/config_gnome.cpp.orig
+++ libproxy/modules/config_gnome.cpp
@@ -102,10 +102,8 @@ static int popen2(const char *program, F
 		if (dup2(rpipe[1], STDOUT_FILENO) != STDOUT_FILENO) _exit(2);
 
 		// Close unneeded fds
-		close(rpipe[0]);
-		close(rpipe[1]);
-		close(wpipe[0]);
-		close(wpipe[1]);
+		for (int i = 3; i < sysconf(_SC_OPEN_MAX); i++)
+			close(i);
 
 		// Exec
 		execl("/bin/sh", "sh", "-c", program, (char*) NULL);
@@ -194,8 +192,8 @@ public:
 		else if (this->data[PROXY_MODE] == "manual") {
 			string type, host, port;
 			bool       auth = this->data[PROXY_USE_AUTHENTICATION] == "true";
-			string username = url::encode(this->data[PROXY_AUTH_USER], url::ALLOWED_IN_USERINFO_ELEMENT);
-			string password = url::encode(this->data[PROXY_AUTH_PASSWORD], url::ALLOWED_IN_USERINFO_ELEMENT);
+			string username = url::encode(this->data[PROXY_AUTH_USER], URL_ALLOWED_IN_USERINFO_ELEMENT);
+			string password = url::encode(this->data[PROXY_AUTH_PASSWORD], URL_ALLOWED_IN_USERINFO_ELEMENT);
 			bool same_proxy = this->data[PROXY_SAME_FOR_ALL] == "true"; 
 
 			// If socks is set use it (except when same_proxy is set)
Index: libproxy/proxy.cpp
===================================================================
--- libproxy/proxy.cpp.orig
+++ libproxy/proxy.cpp
@@ -164,7 +164,7 @@ proxy_factory::proxy_factory() {
 proxy_factory::~proxy_factory() {
 	lock();
 
-	if (this->pac) delete this->pac;
+	if (this->pac) delete[] this->pac;
 	if (this->pacurl) delete this->pacurl;
 	
 	unlock();
Index: libproxy/url.hpp
===================================================================
--- libproxy/url.hpp.orig
+++ libproxy/url.hpp
@@ -27,6 +27,13 @@
 
 #include "config.hpp"
 
+#define URL_GENERIC_DELIMITERS          ":/?#[]@"
+#define URL_SUBCOMPONENT_DELIMITERS     "!$&'()*+,;="
+#define URL_ALLOWED_IN_USERINFO_ELEMENT URL_SUBCOMPONENT_DELIMITERS
+#define URL_ALLOWED_IN_USERINFO         URL_ALLOWED_IN_USERINFO_ELEMENT ":"
+#define URL_ALLOWED_IN_PATH_ELEMENT     URL_SUBCOMPONENT_DELIMITERS ":@"
+#define URL_ALLOWED_IN_PATH             URL_ALLOWED_IN_PATH_ELEMENT "/"
+
 namespace libproxy {
 
 using namespace std;
@@ -38,13 +45,6 @@ public:
 
 class DLL_PUBLIC url {
 public:
-	static const string ALLOWED_IN_PATH;
-	static const string ALLOWED_IN_PATH_ELEMENT;
-	static const string ALLOWED_IN_USERINFO;
-	static const string ALLOWED_IN_USERINFO_ELEMENT;
-	static const string GENERIC_DELIMITERS;
-	static const string SUBCOMPONENT_DELIMITERS;
-
 	static bool is_valid(const string url);
 	static string encode(const string &data, const string &valid_reserved = "");
 
openSUSE Build Service is sponsored by