]> jfr.im git - irc/hexchat/hexchat.git/commitdiff
Avoid direct use of libproxy
authorMichael Catanzaro <redacted>
Mon, 12 Jul 2021 13:38:02 +0000 (08:38 -0500)
committerPatrick <redacted>
Mon, 12 Jul 2021 16:29:15 +0000 (11:29 -0500)
Since hexchat already depends on GLib, it's better to use GProxyResolver
instead. This might use libproxy, or not, as appropriate.

P.S. This removes a memory safety issue because proxy_list is allocated
using malloc(), not g_malloc(), and therefore using g_strfreev() is
incorrect. The proper way to free the proxy list returned by libproxy
is to use px_proxy_factory_free_proxies() (but nobody does that because
it was added in libproxy 0.4.16, which is somewhat recent).

meson.build
meson_options.txt
src/common/hexchat.c
src/common/meson.build
src/common/server.c
src/fe-gtk/setup.c

index 9b33574b6d95ece8f4793f6523fd26162da763cc..0f5faca87ef00332bdb407459c0c30587523e801 100644 (file)
@@ -33,7 +33,6 @@ config_h.set10('ENABLE_NLS', true)
 
 # Optional features
 config_h.set('USE_OPENSSL', get_option('with-ssl'))
-config_h.set('USE_LIBPROXY', get_option('with-libproxy'))
 config_h.set('USE_LIBCANBERRA', get_option('with-libcanberra'))
 config_h.set('USE_DBUS', get_option('with-dbus'))
 config_h.set('USE_PLUGIN', get_option('with-plugin'))
index 100a5ee72ad721504624af4d697c7ec14038fc3c..ad03d6bc58ef1a638160961b4a5c20344b5c6c3d 100644 (file)
@@ -13,9 +13,6 @@ option('with-plugin', type: 'boolean',
 option('with-dbus', type: 'boolean',
   description: 'Support used for single-instance and scripting interface, Unix only'
 )
-option('with-libproxy', type: 'boolean',
-  description: 'Support for getting proxy information, Unix only'
-)
 option('with-libnotify', type: 'boolean',
   description: 'Support for freedesktop notifications, Unix only'
 )
index 8702c63d07db8f5138eb0e4f5d409de87f5d5c98..3ba7ed6d5567937e7a448a8391000785c1aa1eb1 100644 (file)
 #include <glib-object.h>                       /* for g_type_init() */
 #endif
 
-#ifdef USE_LIBPROXY
-#include <proxy.h>
-#endif
-
 GSList *popup_list = 0;
 GSList *button_list = 0;
 GSList *dlgbutton_list = 0;
@@ -111,10 +107,6 @@ struct session *current_tab;
 struct session *current_sess = 0;
 struct hexchatprefs prefs;
 
-#ifdef USE_LIBPROXY
-pxProxyFactory *libproxy_factory;
-#endif
-
 /*
  * Update the priority queue of the "interesting sessions"
  * (sess_list_by_lastact).
@@ -1102,10 +1094,6 @@ main (int argc, char *argv[])
        hexchat_remote ();
 #endif
 
-#ifdef USE_LIBPROXY
-       libproxy_factory = px_proxy_factory_new ();
-#endif
-
 #ifdef WIN32
        coinit_result = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
        if (SUCCEEDED (coinit_result))
@@ -1148,10 +1136,6 @@ main (int argc, char *argv[])
        }
 #endif
 
-#ifdef USE_LIBPROXY
-       px_proxy_factory_free (libproxy_factory);
-#endif
-
 #ifdef WIN32
        WSACleanup ();
 #endif
index 492227b222594f9402adbe3c7262e01297feb220..09491e841780c7e3644edf82e163a82015bc1bac 100644 (file)
@@ -77,10 +77,6 @@ if get_option('with-ssl')
   common_deps += libssl_dep
 endif
 
-if get_option('with-libproxy')
-  common_deps += dependency('libproxy-1.0')
-endif
-
 if get_option('with-libcanberra')
   common_deps += dependency('libcanberra', version: '>= 0.22')
 endif
index 5c645eb583beac7caf8251f85a24fe9d32952a94..4f809fa8f9c28ec544c202eb6416c2393f9b16db 100644 (file)
 #include "ssl.h"
 #endif
 
-#ifdef USE_LIBPROXY
-#include <proxy.h>
-#endif
-
 #ifdef USE_OPENSSL
 /* local variables */
 static struct session *g_sess = NULL;
@@ -78,9 +74,15 @@ static void server_disconnect (session * sess, int sendquit, int err);
 static int server_cleanup (server * serv);
 static void server_connect (server *serv, char *hostname, int port, int no_login);
 
-#ifdef USE_LIBPROXY
-extern pxProxyFactory *libproxy_factory;
-#endif
+static void
+write_error (char *message, GError **error)
+{
+       if (error == NULL || *error == NULL) {
+               return;
+       }
+       g_printerr ("%s: %s\n", message, (*error)->message);
+       g_clear_error (error);
+}
 
 /* actually send to the socket. This might do a character translation or
    send via SSL. server/dcc both use this function. */
@@ -1392,14 +1394,16 @@ server_child (server * serv)
 
        if (!serv->dont_use_proxy) /* blocked in serverlist? */
        {
-#ifdef USE_LIBPROXY
                if (prefs.hex_net_proxy_type == 5)
                {
                        char **proxy_list;
                        char *url, *proxy;
+                       GProxyResolver *resolver;
+                       GError *error = NULL;
 
+                       resolver = g_proxy_resolver_get_default ();
                        url = g_strdup_printf ("irc://%s:%d", hostname, port);
-                       proxy_list = px_proxy_factory_get_proxies (libproxy_factory, url);
+                       proxy_list = g_proxy_resolver_lookup (resolver, url, NULL, &error);
 
                        if (proxy_list) {
                                /* can use only one */
@@ -1412,6 +1416,8 @@ server_child (server * serv)
                                        proxy_type = 3;
                                else if (!strncmp (proxy, "socks", 5))
                                        proxy_type = 2;
+                       } else {
+                               write_error ("Failed to lookup proxy", &error);
                        }
 
                        if (proxy_type) {
@@ -1426,7 +1432,7 @@ server_child (server * serv)
                        g_strfreev (proxy_list);
                        g_free (url);
                }
-#endif
+
                if (prefs.hex_net_proxy_host[0] &&
                           prefs.hex_net_proxy_type > 0 &&
                           prefs.hex_net_proxy_use != 2) /* proxy is NOT dcc-only */
index 3d003eefc77621661df45b5e3fbc3572b9442cf5..a7e3a15cac52f25b672a37d7c378221a972762f4 100644 (file)
@@ -614,9 +614,7 @@ static const char *const proxytypes[] =
        N_("SOCKS4"),
        N_("SOCKS5"),
        N_("HTTP"),
-#ifdef USE_LIBPROXY
        N_("Auto"),
-#endif
        NULL
 };