diff --git a/libproxy-trunk.patch b/libproxy-trunk.patch new file mode 100644 index 0000000..14a7bf3 --- /dev/null +++ b/libproxy-trunk.patch @@ -0,0 +1,307 @@ +diff -ur libproxy-0.4.6/libproxy/cmake/modules/pacrunner_mozjs.cmk libproxy-trunk/libproxy/cmake/modules/pacrunner_mozjs.cmk +--- libproxy-0.4.6/libproxy/cmake/modules/pacrunner_mozjs.cmk 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/cmake/modules/pacrunner_mozjs.cmk 2011-03-29 12:12:09.833395003 +0200 +@@ -7,16 +7,19 @@ + include_directories("${MOZJS_INCLUDE_DIR}") + endif() + elseif(NOT APPLE) +- set(MOZJS_SEARCH_ORDER "xulrunner-js;firefox-js;mozilla-js;seamonkey-js" CACHE STRING "MozJS search order") ++ set(MOZJS_SEARCH_ORDER "mozilla-js;xulrunner-js;firefox-js;seamonkey-js" CACHE STRING "MozJS search order") + option(WITH_MOZJS "Search for MOZJS package" ON) + if (WITH_MOZJS) +- pkg_search_module(MOZJS ${MOZJS_SEARCH_ORDER}) +- if(MOZJS_FOUND) +- include_directories(${MOZJS_INCLUDE_DIRS}) +- link_directories(${MOZJS_LIBRARY_DIRS}) +- else() +- set(MOZJS_FOUND 0) +- endif() ++ foreach(MOZJSLIB ${MOZJS_SEARCH_ORDER}) ++ pkg_search_module(MOZJS ${MOZJSLIB}>=2.0) ++ if(MOZJS_FOUND) ++ include_directories(${MOZJS_INCLUDE_DIRS}) ++ link_directories(${MOZJS_LIBRARY_DIRS}) ++ break() ++ else() ++ set(MOZJS_FOUND 0) ++ endif() ++ endforeach() + else() + set(MOZJS_FOUND 0) + endif() +diff -ur libproxy-0.4.6/libproxy/cmake/modules.cmk libproxy-trunk/libproxy/cmake/modules.cmk +--- libproxy-0.4.6/libproxy/cmake/modules.cmk 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/cmake/modules.cmk 2011-03-29 12:12:09.856395005 +0200 +@@ -14,11 +14,12 @@ + include(cmake/modules/config_macosx.cmk) + include(cmake/modules/network_networkmanager.cmk) + include(cmake/modules/pacrunner_mozjs.cmk) ++include(cmake/modules/pacrunner_natus.cmk) + include(cmake/modules/pacrunner_webkit.cmk) + + # Build the pacrunner into libproxy unless we are building for multiple engines + set(BIPR 1) +-if(MOZJS_FOUND AND WEBKIT_FOUND) ++if((MOZJS_FOUND AND WEBKIT_FOUND) OR (MOZJS_FOUND AND NATUS_FOUND) OR (WEBKIT_FOUND AND NATUS_FOUND)) + set(BIPR 0) + endif() + +@@ -36,6 +37,7 @@ + px_module(ignore_ip 1 1) + px_module(network_networkmanager "${NM_FOUND}" 0 ${NM_LIBRARIES}) + px_module(pacrunner_mozjs "${MOZJS_FOUND}" ${BIPR} ${MOZJS_LIBRARIES}) ++px_module(pacrunner_natus "${NATUS_FOUND}" ${BIPR} ${NATUS_LIBRARIES}) + px_module(pacrunner_webkit "${WEBKIT_FOUND}" ${BIPR} ${WEBKIT_LIBRARIES}) + px_module(wpad_dns_alias 1 1) + message("") +diff -ur libproxy-0.4.6/libproxy/libproxy-1.0.pc.in libproxy-trunk/libproxy/libproxy-1.0.pc.in +--- libproxy-0.4.6/libproxy/libproxy-1.0.pc.in 2011-03-29 15:28:19.781395005 +0200 ++++ libproxy-trunk/libproxy/libproxy-1.0.pc.in 2011-03-29 12:12:11.029395005 +0200 +@@ -4,6 +4,6 @@ + + Name: libproxy-1.0 + Description: Proxy Configuration Library +-Version: 0.4.6 ++Version: @PROJECT_VERSION@ + Libs: -L${libdir} -lproxy + Cflags: -I${includedir} +diff -ur libproxy-0.4.6/libproxy/modules/config_gnome.cpp libproxy-trunk/libproxy/modules/config_gnome.cpp +--- libproxy-0.4.6/libproxy/modules/config_gnome.cpp 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/modules/config_gnome.cpp 2011-03-29 12:12:10.920395004 +0200 +@@ -102,10 +102,8 @@ + 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 @@ + 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) +diff -ur libproxy-0.4.6/libproxy/modules/pacrunner_mozjs.cpp libproxy-trunk/libproxy/modules/pacrunner_mozjs.cpp +--- libproxy-0.4.6/libproxy/modules/pacrunner_mozjs.cpp 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/modules/pacrunner_mozjs.cpp 2011-03-29 12:12:10.915395005 +0200 +@@ -42,12 +42,12 @@ + #define INET6_ADDRSTRLEN 46 + #endif + +-static JSBool dnsResolve(JSContext *cx, JSObject * /*obj*/, uintN /*argc*/, jsval *argv, jsval *rval) { ++static JSBool dnsResolve_(JSContext *cx, jsval hostname, jsval *vp) { + // Get hostname argument +- char *tmp = JS_strdup(cx, JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); ++ char *tmp = JS_EncodeString(cx, JS_ValueToString(cx, hostname)); + + // Set the default return value +- *rval = JSVAL_NULL; ++ JS_SET_RVAL(cx, vp, JSVAL_NULL); + + // Look it up + struct addrinfo *info = NULL; +@@ -66,7 +66,7 @@ + NI_NUMERICHOST)) goto out; + + // We succeeded +- *rval = STRING_TO_JSVAL(JS_NewString(cx, tmp, strlen(tmp))); ++ JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, tmp, strlen(tmp)))); + tmp = NULL; + + out: +@@ -75,15 +75,20 @@ + return true; + } + +-static JSBool myIpAddress(JSContext *cx, JSObject *obj, uintN /*argc*/, jsval * /*argv*/, jsval *rval) { ++static JSBool dnsResolve(JSContext *cx, uintN /*argc*/, jsval *vp) { ++ jsval *argv = JS_ARGV(cx, vp); ++ return dnsResolve_(cx, argv[0], vp); ++} ++ ++static JSBool myIpAddress(JSContext *cx, uintN /*argc*/, jsval *vp) { + char *hostname = (char *) JS_malloc(cx, 1024); + if (!gethostname(hostname, 1023)) { +- JSString *myhost = JS_NewString(cx, hostname, strlen(hostname)); ++ JSString *myhost = JS_NewStringCopyN(cx, hostname, strlen(hostname)); + jsval arg = STRING_TO_JSVAL(myhost); +- return dnsResolve(cx, obj, 1, &arg, rval); ++ return dnsResolve_(cx, 1, &arg); + } + JS_free(cx, hostname); +- *rval = JSVAL_NULL; ++ JS_SET_RVAL(cx, vp, JSVAL_NULL); + return true; + } + +@@ -91,7 +96,7 @@ + // This MUST be a static global + static JSClass cls = { + "global", JSCLASS_GLOBAL_FLAGS, +- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, ++ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + }; +@@ -111,7 +116,7 @@ + //JS_SetOptions(this->jsctx, JSOPTION_VAROBJFIX); + //JS_SetVersion(this->jsctx, JSVERSION_LATEST); + //JS_SetErrorReporter(cx, reportError); +- if (!(this->jsglb = JS_NewObject(this->jsctx, &cls, NULL, NULL))) goto error; ++ if (!(this->jsglb = JS_NewCompartmentAndGlobalObject(this->jsctx, &cls, NULL))) goto error; + if (!JS_InitStandardClasses(this->jsctx, this->jsglb)) goto error; + + // Define Javascript functions +@@ -147,15 +152,19 @@ + throw bad_alloc(); + } + jsval args[2] = { +- STRING_TO_JSVAL(JS_NewString(this->jsctx, tmpurl, strlen(tmpurl))), +- STRING_TO_JSVAL(JS_NewString(this->jsctx, tmphost, strlen(tmphost))) ++ STRING_TO_JSVAL(JS_NewStringCopyN(this->jsctx, tmpurl, strlen(tmpurl))), ++ STRING_TO_JSVAL(JS_NewStringCopyN(this->jsctx, tmphost, strlen(tmphost))) + }; + + // Find the proxy (call FindProxyForURL()) + jsval rval; + JSBool result = JS_CallFunctionName(this->jsctx, this->jsglb, "FindProxyForURL", 2, args, &rval); + if (!result) return ""; +- string answer = string(JS_GetStringBytes(JS_ValueToString(this->jsctx, rval))); ++ ++ char * tmpanswer = JS_EncodeString(this->jsctx, JS_ValueToString(this->jsctx, rval)); ++ string answer = string(tmpanswer); ++ JS_free(this->jsctx, tmpanswer); ++ + if (answer == "undefined") return ""; + return answer; + } +diff -ur libproxy-0.4.6/libproxy/url.cpp libproxy-trunk/libproxy/url.cpp +--- libproxy-0.4.6/libproxy/url.cpp 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/url.cpp 2011-03-29 12:12:11.023395004 +0200 +@@ -36,12 +36,9 @@ + + #ifdef WIN32 + #include +-#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 @@ + // 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 @@ + + 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 @@ + 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 @@ + /* 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 @@ + 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; + } + } +diff -ur libproxy-0.4.6/libproxy/url.hpp libproxy-trunk/libproxy/url.hpp +--- libproxy-0.4.6/libproxy/url.hpp 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/libproxy/url.hpp 2011-03-29 12:12:11.024395005 +0200 +@@ -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 @@ + + 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 = ""); + +diff -ur libproxy-0.4.6/NEWS libproxy-trunk/NEWS +--- libproxy-0.4.6/NEWS 2010-09-01 22:23:34.000000000 +0200 ++++ libproxy-trunk/NEWS 2011-03-29 12:12:11.303395004 +0200 +@@ -1,3 +1,7 @@ ++New in version 0.4.7 ++============================== ++* Support/require xulrunner 2.0+ ++ + New in version 0.4.6 + ============================== + * Fixed a crash in the URL parser diff --git a/libproxy.spec b/libproxy.spec index e97b2b6..2f9bf38 100644 --- a/libproxy.spec +++ b/libproxy.spec @@ -3,10 +3,10 @@ #0 to bootstrap libproxy circle dependencies - 1 normal case %if 1 %if 0%{?fedora} < 15 -%global gecko_version 1.9.2 -%global _with_mozjs 1 %global _with_webkit 1 %endif +%global gecko_version 2.0 +%global _with_mozjs 1 %global _with_gnome 1 %global _with_kde 1 %global _with_networkmanager 1 @@ -15,7 +15,7 @@ Name: libproxy Version: 0.4.6 -Release: 3%{?dist} +Release: 4%{?dist} Summary: A library handling all the details of proxy configuration Group: System Environment/Libraries @@ -23,10 +23,11 @@ License: LGPLv2+ URL: http://code.google.com/p/libproxy/ Source0: http://libproxy.googlecode.com/files/libproxy-%{version}.tar.gz Patch0: libproxy-0.4.6-python_noarch.patch +Patch1: libproxy-trunk.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %{?_with_python:BuildRequires: python-devel} -BuildRequires: libmodman-devel >= 2.0.0 +BuildRequires: libmodman-devel >= 2.0.1 BuildRequires: cmake >= 2.6.0 # gnome @@ -35,7 +36,7 @@ BuildRequires: GConf2-devel BuildRequires: libXmu-devel } # mozjs -%{?_with_mozjs:BuildRequires: gecko-devel} +%{?_with_mozjs:BuildRequires: gecko-devel >= %{gecko_version}} # NetworkManager %{?_with_networkmanager: BuildRequires: NetworkManager-devel @@ -161,9 +162,7 @@ developing applications that use %{name}. %prep %setup -q %patch0 -p1 -b.pynoarch - -#Fix version field in pkg-config -sed -i -e 's|@PROJECT_VERSION@|%{version}|' libproxy/libproxy-1.0.pc.in +%patch1 -p1 -b .trunk %build @@ -252,6 +251,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Tue Mar 29 2011 Nicolas Chauvet - 0.4.6-4 +- Add support for xulrunner 2.0 from trunk + * Wed Nov 24 2010 Nicolas Chauvet - 0.4.6-3 - Fix mozjs/webkit obsoletion - rhbz#656849 - Workaround unreliable Version field in pkg-config - rhbz#656484