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/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