[Spice-devel] [PATCH vdagent-linux 1/6] move to GLib memory functions

Jakub Janků jjanku at redhat.com
Fri Sep 7 13:59:13 UTC 2018


Some older parts of the code currently use
memory functions defined in stdlib.h
and usually handle allocation errors.

On the other hand, newer parts of the code
and GLib/GTK+ functions themselves commonly use
wrappers provided by GLib that terminate
the program when there isn't enough memory.

So it doesn't make much sense to check for
ENOMEM somewhere, while the program can be
terminated at any time elsewhere.

Unify the code and use GLib wrappers only.

malloc --> g_malloc, g_new
calloc --> g_malloc0, g_new0
free   --> g_free

Use g_clear_pointer where possible
for simplification.

Replace subsequent alloc and memcpy calls
with single g_memdup where possible.

Note: this commit only partially touches
src/vdagent/x11.c as the clipboard-handling
code here should be removed in the future.

Signed-off-by: Jakub Janků <jjanku at redhat.com>
---
 src/udscs.c                  | 60 +++++++++----------------------
 src/vdagent/x11-randr.c      | 57 +++++++++---------------------
 src/vdagent/x11.c            | 15 +++-----
 src/vdagentd/console-kit.c   | 28 ++++++---------
 src/vdagentd/systemd-login.c | 19 ++++------
 src/vdagentd/uinput.c        |  9 ++---
 src/vdagentd/vdagentd.c      | 68 +++++++++---------------------------
 src/vdagentd/virtio-port.c   | 42 +++++++---------------
 8 files changed, 88 insertions(+), 210 deletions(-)

diff --git a/src/udscs.c b/src/udscs.c
index a77da99..31643e9 100644
--- a/src/udscs.c
+++ b/src/udscs.c
@@ -87,10 +87,7 @@ struct udscs_connection *udscs_connect(const char *socketname,
     struct sockaddr_un address;
     struct udscs_connection *conn;
 
-    conn = calloc(1, sizeof(*conn));
-    if (!conn)
-        return NULL;
-
+    conn = g_new0(struct udscs_connection, 1);
     conn->type_to_string = type_to_string;
     conn->no_types = no_types;
     conn->debug = debug;
@@ -98,7 +95,7 @@ struct udscs_connection *udscs_connect(const char *socketname,
     conn->fd = socket(PF_UNIX, SOCK_STREAM, 0);
     if (conn->fd == -1) {
         syslog(LOG_ERR, "creating unix domain socket: %m");
-        free(conn);
+        g_free(conn);
         return NULL;
     }
 
@@ -109,7 +106,7 @@ struct udscs_connection *udscs_connect(const char *socketname,
         if (conn->debug) {
             syslog(LOG_DEBUG, "connect %s: %m", socketname);
         }
-        free(conn);
+        g_free(conn);
         return NULL;
     }
 
@@ -147,13 +144,12 @@ void udscs_destroy_connection(struct udscs_connection **connp)
     wbuf = conn->write_buf;
     while (wbuf) {
         next_wbuf = wbuf->next;
-        free(wbuf->buf);
-        free(wbuf);
+        g_free(wbuf->buf);
+        g_free(wbuf);
         wbuf = next_wbuf;
     }
 
-    free(conn->data.buf);
-    conn->data.buf = NULL;
+    g_clear_pointer(&conn->data.buf, g_free);
 
     if (conn->next)
         conn->next->prev = conn->prev;
@@ -171,8 +167,7 @@ void udscs_destroy_connection(struct udscs_connection **connp)
     if (conn->debug)
         syslog(LOG_DEBUG, "%p disconnected", conn);
 
-    free(conn);
-    *connp = NULL;
+    g_clear_pointer(connp, g_free);
 }
 
 void udscs_set_user_data(struct udscs_connection *conn, void *data)
@@ -194,18 +189,11 @@ int udscs_write(struct udscs_connection *conn, uint32_t type, uint32_t arg1,
     struct udscs_buf *wbuf, *new_wbuf;
     struct udscs_message_header header;
 
-    new_wbuf = malloc(sizeof(*new_wbuf));
-    if (!new_wbuf)
-        return -1;
-
+    new_wbuf = g_new(struct udscs_buf, 1);
     new_wbuf->pos = 0;
     new_wbuf->size = sizeof(header) + size;
     new_wbuf->next = NULL;
-    new_wbuf->buf = malloc(new_wbuf->size);
-    if (!new_wbuf->buf) {
-        free(new_wbuf);
-        return -1;
-    }
+    new_wbuf->buf = g_malloc(new_wbuf->size);
 
     header.type = type;
     header.arg1 = arg1;
@@ -271,7 +259,7 @@ static void udscs_read_complete(struct udscs_connection **connp)
             return;
     }
 
-    free(conn->data.buf);
+    g_free(conn->data.buf);
     memset(&conn->data, 0, sizeof(conn->data)); /* data.buf = NULL */
     conn->header_read = 0;
 }
@@ -312,12 +300,7 @@ static void udscs_do_read(struct udscs_connection **connp)
             }
             conn->data.pos = 0;
             conn->data.size = conn->header.size;
-            conn->data.buf = malloc(conn->data.size);
-            if (!conn->data.buf) {
-                syslog(LOG_ERR, "out of memory, disconnecting %p", conn);
-                udscs_destroy_connection(connp);
-                return;
-            }
+            conn->data.buf = g_malloc(conn->data.size);
         }
     } else {
         conn->data.pos += n;
@@ -354,8 +337,8 @@ static void udscs_do_write(struct udscs_connection **connp)
     wbuf->pos += n;
     if (wbuf->pos == wbuf->size) {
         conn->write_buf = wbuf->next;
-        free(wbuf->buf);
-        free(wbuf);
+        g_free(wbuf->buf);
+        g_free(wbuf);
     }
 }
 
@@ -414,10 +397,7 @@ struct udscs_server *udscs_create_server_for_fd(int fd,
         return NULL;
     }
 
-    server = calloc(1, sizeof(*server));
-    if (!server)
-        return NULL;
-
+    server = g_new0(struct udscs_server, 1);
     server->type_to_string = type_to_string;
     server->no_types = no_types;
     server->debug = debug;
@@ -487,7 +467,7 @@ void udscs_destroy_server(struct udscs_server *server)
         conn = next_conn;
     }
     close(server->fd);
-    free(server);
+    g_free(server);
 }
 
 int udscs_get_peer_pid(struct udscs_connection *conn)
@@ -509,13 +489,7 @@ static void udscs_server_accept(struct udscs_server *server) {
         return;
     }
 
-    new_conn = calloc(1, sizeof(*conn));
-    if (!new_conn) {
-        syslog(LOG_ERR, "out of memory, disconnecting new client");
-        close(fd);
-        return;
-    }
-
+    new_conn = g_new0(struct udscs_connection, 1);
     new_conn->fd = fd;
     new_conn->type_to_string = server->type_to_string;
     new_conn->no_types = server->no_types;
@@ -528,7 +502,7 @@ static void udscs_server_accept(struct udscs_server *server) {
     if (r != 0) {
         syslog(LOG_ERR, "Could not get peercred, disconnecting new client");
         close(fd);
-        free(new_conn);
+        g_free(new_conn);
         return;
     }
 
diff --git a/src/vdagent/x11-randr.c b/src/vdagent/x11-randr.c
index bfa1a02..c5fba51 100644
--- a/src/vdagent/x11-randr.c
+++ b/src/vdagent/x11-randr.c
@@ -81,18 +81,15 @@ static void free_randr_resources(struct vdagent_x11 *x11)
         for (i = 0 ; i < x11->randr.res->noutput; ++i) {
             XRRFreeOutputInfo(x11->randr.outputs[i]);
         }
-        free(x11->randr.outputs);
+        g_clear_pointer(&x11->randr.outputs, g_free);
     }
     if (x11->randr.crtcs != NULL) {
         for (i = 0 ; i < x11->randr.res->ncrtc; ++i) {
             XRRFreeCrtcInfo(x11->randr.crtcs[i]);
         }
-        free(x11->randr.crtcs);
+        g_clear_pointer(&x11->randr.crtcs, g_free);
     }
-    XRRFreeScreenResources(x11->randr.res);
-    x11->randr.res = NULL;
-    x11->randr.outputs = NULL;
-    x11->randr.crtcs = NULL;
+    g_clear_pointer(&x11->randr.res, XRRFreeScreenResources);
     x11->randr.num_monitors = 0;
 }
 
@@ -105,8 +102,8 @@ static void update_randr_res(struct vdagent_x11 *x11, int poll)
         x11->randr.res = XRRGetScreenResources(x11->display, x11->root_window[0]);
     else
         x11->randr.res = XRRGetScreenResourcesCurrent(x11->display, x11->root_window[0]);
-    x11->randr.outputs = malloc(x11->randr.res->noutput * sizeof(*x11->randr.outputs));
-    x11->randr.crtcs = malloc(x11->randr.res->ncrtc * sizeof(*x11->randr.crtcs));
+    x11->randr.outputs = g_new(XRROutputInfo *, x11->randr.res->noutput);
+    x11->randr.crtcs = g_new(XRRCrtcInfo *, x11->randr.res->ncrtc);
     for (i = 0 ; i < x11->randr.res->noutput; ++i) {
         x11->randr.outputs[i] = XRRGetOutputInfo(x11->display, x11->randr.res,
                                                  x11->randr.res->outputs[i]);
@@ -659,11 +656,7 @@ static VDAgentMonitorsConfig *get_current_mon_config(struct vdagent_x11 *x11)
     XRRScreenResources *res = x11->randr.res;
     VDAgentMonitorsConfig *mon_config;
 
-    mon_config = calloc(1, config_size(res->noutput));
-    if (!mon_config) {
-        syslog(LOG_ERR, "out of memory allocating current monitor config");
-        return NULL;
-    }
+    mon_config = g_malloc0(config_size(res->noutput));
 
     for (i = 0 ; i < res->noutput; i++) {
         int j;
@@ -696,7 +689,7 @@ static VDAgentMonitorsConfig *get_current_mon_config(struct vdagent_x11 *x11)
 
 error:
     syslog(LOG_ERR, "error: inconsistent or stale data from X");
-    free(mon_config);
+    g_free(mon_config);
     return NULL;
 }
 
@@ -843,15 +836,12 @@ void vdagent_x11_set_monitor_config(struct vdagent_x11 *x11,
             if (!fallback) {
                 syslog(LOG_WARNING, "Restoring previous config");
                 vdagent_x11_set_monitor_config(x11, curr, 1);
-                free(curr);
+                g_free(curr);
                 /* Remember this config failed, if the client is maximized or
                    fullscreen it will keep sending the failing config. */
-                free(x11->randr.failed_conf);
+                g_free(x11->randr.failed_conf);
                 x11->randr.failed_conf =
-                    malloc(config_size(mon_config->num_of_monitors));
-                if (x11->randr.failed_conf)
-                    memcpy(x11->randr.failed_conf, mon_config,
-                           config_size(mon_config->num_of_monitors));
+                    g_memdup(mon_config, config_size(mon_config->num_of_monitors));
                 return;
             }
         }
@@ -900,7 +890,7 @@ exit:
 
     /* Flush output buffers and consume any pending events */
     vdagent_x11_do_read(x11);
-    free(curr);
+    g_free(curr);
 }
 
 void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
@@ -919,11 +909,7 @@ void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
             goto no_info;
 
         screen_count = curr->num_of_monitors;
-        res = malloc(screen_count * sizeof(*res));
-        if (!res) {
-            free(curr);
-            goto no_mem;
-        }
+        res = g_new(struct vdagentd_guest_xorg_resolution, screen_count);
 
         for (i = 0; i < screen_count; i++) {
             res[i].width  = curr->monitors[i].width;
@@ -931,7 +917,7 @@ void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
             res[i].x = curr->monitors[i].x;
             res[i].y = curr->monitors[i].y;
         }
-        free(curr);
+        g_free(curr);
         width  = x11->width[0];
         height = x11->height[0];
     } else if (x11->has_xinerama) {
@@ -940,17 +926,13 @@ void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
         screen_info = XineramaQueryScreens(x11->display, &screen_count);
         if (!screen_info)
             goto no_info;
-        res = malloc(screen_count * sizeof(*res));
-        if (!res) {
-            XFree(screen_info);
-            goto no_mem;
-        }
+        res = g_new(struct vdagentd_guest_xorg_resolution, screen_count);
         for (i = 0; i < screen_count; i++) {
             if (screen_info[i].screen_number >= screen_count) {
                 syslog(LOG_ERR, "Invalid screen number in xinerama screen info (%d >= %d)",
                        screen_info[i].screen_number, screen_count);
                 XFree(screen_info);
-                free(res);
+                g_free(res);
                 return;
             }
             res[screen_info[i].screen_number].width = screen_info[i].width;
@@ -964,9 +946,7 @@ void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
     } else {
 no_info:
         screen_count = x11->screen_count;
-        res = malloc(screen_count * sizeof(*res));
-        if (!res)
-            goto no_mem;
+        res = g_new(struct vdagentd_guest_xorg_resolution, screen_count);
         for (i = 0; i < screen_count; i++) {
             res[i].width  = x11->width[i];
             res[i].height = x11->height[i];
@@ -989,8 +969,5 @@ no_info:
 
     udscs_write(x11->vdagentd, VDAGENTD_GUEST_XORG_RESOLUTION, width, height,
                 (uint8_t *)res, screen_count * sizeof(*res));
-    free(res);
-    return;
-no_mem:
-    syslog(LOG_ERR, "out of memory while trying to send resolutions, not sending resolutions.");
+    g_free(res);
 }
diff --git a/src/vdagent/x11.c b/src/vdagent/x11.c
index 0ea5668..c3c7a65 100644
--- a/src/vdagent/x11.c
+++ b/src/vdagent/x11.c
@@ -210,19 +210,14 @@ struct vdagent_x11 *vdagent_x11_create(struct udscs_connection *vdagentd,
 #endif
     gchar *net_wm_name = NULL;
 
-    x11 = calloc(1, sizeof(*x11));
-    if (!x11) {
-        syslog(LOG_ERR, "out of memory allocating vdagent_x11 struct");
-        return NULL;
-    }
-
+    x11 = g_new0(struct vdagent_x11, 1);
     x11->vdagentd = vdagentd;
     x11->debug = debug;
 
     x11->display = XOpenDisplay(NULL);
     if (!x11->display) {
         syslog(LOG_ERR, "could not connect to X-server");
-        free(x11);
+        g_free(x11);
         return NULL;
     }
 
@@ -231,7 +226,7 @@ struct vdagent_x11 *vdagent_x11_create(struct udscs_connection *vdagentd,
         syslog(LOG_ERR, "Error too much screens: %d > %d",
                x11->screen_count, MAX_SCREENS);
         XCloseDisplay(x11->display);
-        free(x11);
+        g_free(x11);
         return NULL;
     }
 
@@ -345,8 +340,8 @@ void vdagent_x11_destroy(struct vdagent_x11 *x11, int vdagentd_disconnected)
 #endif
 
     XCloseDisplay(x11->display);
-    free(x11->randr.failed_conf);
-    free(x11);
+    g_free(x11->randr.failed_conf);
+    g_free(x11);
 }
 
 int vdagent_x11_get_fd(struct vdagent_x11 *x11)
diff --git a/src/vdagentd/console-kit.c b/src/vdagentd/console-kit.c
index 381b97e..c9da0b9 100644
--- a/src/vdagentd/console-kit.c
+++ b/src/vdagentd/console-kit.c
@@ -71,8 +71,7 @@ static void si_dbus_match_remove(struct session_info *info)
         if (info->verbose)
             syslog(LOG_DEBUG, "(console-kit) seat match removed: %s",
                    info->match_seat_signals);
-        g_free(info->match_seat_signals);
-        info->match_seat_signals = NULL;
+        g_clear_pointer(&info->match_seat_signals, g_free);
     }
 
     if (info->match_session_signals != NULL) {
@@ -84,8 +83,7 @@ static void si_dbus_match_remove(struct session_info *info)
         if (info->verbose)
             syslog(LOG_DEBUG, "(console-kit) session match removed: %s",
                    info->match_session_signals);
-        g_free(info->match_session_signals);
-        info->match_session_signals = NULL;
+        g_clear_pointer(&info->match_session_signals, g_free);
     }
 }
 
@@ -117,8 +115,7 @@ static void si_dbus_match_rule_update(struct session_info *info)
             syslog(LOG_WARNING, "Unable to add dbus rule match: %s",
                    error.message);
             dbus_error_free(&error);
-            g_free(info->match_seat_signals);
-            info->match_seat_signals = NULL;
+            g_clear_pointer(&info->match_seat_signals, g_free);
         }
     }
 
@@ -140,8 +137,7 @@ static void si_dbus_match_rule_update(struct session_info *info)
             syslog(LOG_WARNING, "Unable to add dbus rule match: %s",
                    error.message);
             dbus_error_free(&error);
-            g_free(info->match_session_signals);
-            info->match_session_signals = NULL;
+            g_clear_pointer(&info->match_session_signals, g_free);
         }
     }
 }
@@ -162,8 +158,7 @@ si_dbus_read_signals(struct session_info *info)
             gint type;
             gchar *session;
 
-            free(info->active_session);
-            info->active_session = NULL;
+            g_clear_pointer(&info->active_session, g_free);
 
             dbus_message_iter_init(message, &iter);
             type = dbus_message_iter_get_arg_type(&iter);
@@ -222,10 +217,7 @@ struct session_info *session_info_create(int verbose)
     struct session_info *info;
     DBusError error;
 
-    info = calloc(1, sizeof(*info));
-    if (!info)
-        return NULL;
-
+    info = g_new0(struct session_info, 1);
     info->verbose = verbose;
     info->session_is_locked = FALSE;
     info->session_idle_hint = FALSE;
@@ -239,7 +231,7 @@ struct session_info *session_info_create(int verbose)
              dbus_error_free(&error);
         } else
              syslog(LOG_ERR, "Unable to connect to system bus");
-        free(info);
+        g_free(info);
         return NULL;
     }
 
@@ -265,9 +257,9 @@ void session_info_destroy(struct session_info *info)
 
     si_dbus_match_remove(info);
     dbus_connection_close(info->connection);
-    free(info->seat);
-    free(info->active_session);
-    free(info);
+    g_free(info->seat);
+    g_free(info->active_session);
+    g_free(info);
 }
 
 int session_info_get_fd(struct session_info *info)
diff --git a/src/vdagentd/systemd-login.c b/src/vdagentd/systemd-login.c
index 9719c0b..a20cd58 100644
--- a/src/vdagentd/systemd-login.c
+++ b/src/vdagentd/systemd-login.c
@@ -83,8 +83,7 @@ static void si_dbus_match_remove(struct session_info *si)
                           si->dbus.match_session_signals,
                           &error);
 
-    g_free(si->dbus.match_session_signals);
-    si->dbus.match_session_signals = NULL;
+    g_clear_pointer(&si->dbus.match_session_signals, g_free);
 }
 
 static void si_dbus_match_rule_update(struct session_info *si)
@@ -113,8 +112,7 @@ static void si_dbus_match_rule_update(struct session_info *si)
         syslog(LOG_WARNING, "Unable to add dbus rule match: %s",
                error.message);
         dbus_error_free(&error);
-        g_free(si->dbus.match_session_signals);
-        si->dbus.match_session_signals = NULL;
+        g_clear_pointer(&si->dbus.match_session_signals, g_free);
     }
 }
 
@@ -230,17 +228,14 @@ struct session_info *session_info_create(int verbose)
     struct session_info *si;
     int r;
 
-    si = calloc(1, sizeof(*si));
-    if (!si)
-        return NULL;
-
+    si = g_new0(struct session_info, 1);
     si->verbose = verbose;
     si->session_is_locked = FALSE;
 
     r = sd_login_monitor_new("session", &si->mon);
     if (r < 0) {
         syslog(LOG_ERR, "Error creating login monitor: %s", strerror(-r));
-        free(si);
+        g_free(si);
         return NULL;
     }
 
@@ -256,8 +251,8 @@ void session_info_destroy(struct session_info *si)
     si_dbus_match_remove(si);
     dbus_connection_close(si->dbus.system_connection);
     sd_login_monitor_unref(si->mon);
-    free(si->session);
-    free(si);
+    g_free(si->session);
+    g_free(si);
 }
 
 int session_info_get_fd(struct session_info *si)
@@ -282,7 +277,7 @@ const char *session_info_get_active_session(struct session_info *si)
         syslog(LOG_INFO, "Active session: %s", si->session);
 
     sd_login_monitor_flush(si->mon);
-    free(old_session);
+    g_free(old_session);
 
     si_dbus_match_rule_update(si);
     return si->session;
diff --git a/src/vdagentd/uinput.c b/src/vdagentd/uinput.c
index 6d04322..3172891 100644
--- a/src/vdagentd/uinput.c
+++ b/src/vdagentd/uinput.c
@@ -31,6 +31,7 @@
 #include <linux/input.h>
 #include <linux/uinput.h>
 #include <spice/vd_agent.h>
+#include <glib.h>
 #include "uinput.h"
 
 struct vdagentd_uinput {
@@ -52,10 +53,7 @@ struct vdagentd_uinput *vdagentd_uinput_create(const char *devname,
 {
     struct vdagentd_uinput *uinput;
 
-    uinput = calloc(1, sizeof(*uinput));
-    if (!uinput)
-        return NULL;
-
+    uinput = g_new0(struct vdagentd_uinput, 1);
     uinput->devname = devname;
     uinput->fd      = -1; /* Gets opened by vdagentd_uinput_update_size() */
     uinput->debug   = debug;
@@ -76,8 +74,7 @@ void vdagentd_uinput_destroy(struct vdagentd_uinput **uinputp)
 
     if (uinput->fd != -1)
         close(uinput->fd);
-    free(uinput);
-    *uinputp = NULL;
+    g_clear_pointer(uinputp, g_free);
 }
 
 void vdagentd_uinput_update_size(struct vdagentd_uinput **uinputp,
diff --git a/src/vdagentd/vdagentd.c b/src/vdagentd/vdagentd.c
index adfaf39..f7c2a08 100644
--- a/src/vdagentd/vdagentd.c
+++ b/src/vdagentd/vdagentd.c
@@ -124,12 +124,7 @@ static void send_capabilities(struct vdagent_virtio_port *vport,
     uint32_t size;
 
     size = sizeof(*caps) + VD_AGENT_CAPS_BYTES;
-    caps = calloc(1, size);
-    if (!caps) {
-        syslog(LOG_ERR, "out of memory allocating capabilities array (write)");
-        return;
-    }
-
+    caps = g_malloc0(size);
     caps->request = request;
     VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MOUSE_STATE);
     VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MONITORS_CONFIG);
@@ -145,7 +140,7 @@ static void send_capabilities(struct vdagent_virtio_port *vport,
     vdagent_virtio_port_write(vport, VDP_CLIENT_PORT,
                               VD_AGENT_ANNOUNCE_CAPABILITIES, 0,
                               (uint8_t *)caps, size);
-    free(caps);
+    g_free(caps);
 }
 
 static void do_client_disconnect(void)
@@ -196,16 +191,8 @@ static void do_client_monitors(struct vdagent_virtio_port *vport, int port_nr,
 
     vdagentd_write_xorg_conf(new_monitors);
 
-    if (!mon_config ||
-            mon_config->num_of_monitors != new_monitors->num_of_monitors) {
-        free(mon_config);
-        mon_config = malloc(size);
-        if (!mon_config) {
-            syslog(LOG_ERR, "out of memory allocating monitors config");
-            return;
-        }
-    }
-    memcpy(mon_config, new_monitors, size);
+    g_free(mon_config);
+    mon_config = g_memdup(new_monitors, size);
 
     /* Send monitor config to currently active agent */
     if (active_session_conn)
@@ -236,19 +223,10 @@ static void do_client_capabilities(struct vdagent_virtio_port *vport,
     VDAgentMessage *message_header,
     VDAgentAnnounceCapabilities *caps)
 {
-    int new_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(message_header->size);
-
-    if (capabilities_size != new_size) {
-        capabilities_size = new_size;
-        free(capabilities);
-        capabilities = malloc(capabilities_size * sizeof(uint32_t));
-        if (!capabilities) {
-            syslog(LOG_ERR, "oom allocating capabilities array (read)");
-            capabilities_size = 0;
-            return;
-        }
-    }
-    memcpy(capabilities, caps->caps, capabilities_size * sizeof(uint32_t));
+    capabilities_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(message_header->size);
+    g_free(capabilities);
+    capabilities = g_memdup(caps->caps, capabilities_size * sizeof(uint32_t));
+
     if (caps->request) {
         /* Report the previous client has disconnected. */
         do_client_disconnect();
@@ -328,7 +306,7 @@ static void send_file_xfer_status(struct vdagent_virtio_port *vport,
         data_size = 0;
     }
 
-    status = malloc(sizeof(*status) + data_size);
+    status = g_malloc(sizeof(*status) + data_size);
     status->id = GUINT32_TO_LE(id);
     status->result = GUINT32_TO_LE(xfer_status);
     if (data)
@@ -342,7 +320,7 @@ static void send_file_xfer_status(struct vdagent_virtio_port *vport,
                                   VD_AGENT_FILE_XFER_STATUS, 0,
                                   (uint8_t *)status, sizeof(*status) + data_size);
 
-    free(status);
+    g_free(status);
 }
 
 static void do_client_file_xfer(struct vdagent_virtio_port *vport,
@@ -849,13 +827,7 @@ static gboolean remove_active_xfers(gpointer key, gpointer value, gpointer conn)
 static void agent_connect(struct udscs_connection *conn)
 {
     struct agent_data *agent_data;
-
-    agent_data = calloc(1, sizeof(*agent_data));
-    if (!agent_data) {
-        syslog(LOG_ERR, "Out of memory allocating agent data, disconnecting");
-        udscs_destroy_connection(&conn);
-        return;
-    }
+    agent_data = g_new0(struct agent_data, 1);
 
     if (session_info) {
         uint32_t pid = udscs_get_peer_pid(conn);
@@ -874,12 +846,11 @@ static void agent_disconnect(struct udscs_connection *conn)
 
     g_hash_table_foreach_remove(active_xfers, remove_active_xfers, conn);
 
-    free(agent_data->session);
-    agent_data->session = NULL;
+    g_clear_pointer(&agent_data->session, g_free);
     update_active_session_connection(NULL);
 
-    free(agent_data->screen_info);
-    free(agent_data);
+    g_free(agent_data->screen_info);
+    g_free(agent_data);
 }
 
 static void agent_read_complete(struct udscs_connection **connp,
@@ -908,13 +879,8 @@ static void agent_read_complete(struct udscs_connection **connp,
             return;
         }
 
-        free(agent_data->screen_info);
-        res = malloc(n * sizeof(*res));
-        if (!res) {
-            syslog(LOG_ERR, "out of memory allocating screen info");
-            n = 0;
-        }
-        memcpy(res, data, n * sizeof(*res));
+        g_free(agent_data->screen_info);
+        res = g_memdup(data, n * sizeof(*res));
         agent_data->width  = header->arg1;
         agent_data->height = header->arg2;
         agent_data->screen_info  = res;
@@ -1177,8 +1143,6 @@ int main(int argc, char *argv[])
         if (errno == EADDRINUSE) {
             syslog(LOG_CRIT, "Fatal the server socket %s exists already. Delete it?",
                    vdagentd_socket);
-        } else if (errno == ENOMEM) {
-            syslog(LOG_CRIT, "Fatal could not allocate memory for udscs server");
         } else {
             syslog(LOG_CRIT, "Fatal could not create the server socket %s: %m",
                    vdagentd_socket);
diff --git a/src/vdagentd/virtio-port.c b/src/vdagentd/virtio-port.c
index 3dc6f44..1fac1db 100644
--- a/src/vdagentd/virtio-port.c
+++ b/src/vdagentd/virtio-port.c
@@ -85,9 +85,7 @@ struct vdagent_virtio_port *vdagent_virtio_port_create(const char *portname,
     struct sockaddr_un address;
     int c;
 
-    vport = calloc(1, sizeof(*vport));
-    if (!vport)
-        return 0;
+    vport = g_new0(struct vdagent_virtio_port, 1);
 
     vport->fd = open(portname, O_RDWR);
     if (vport->fd == -1) {
@@ -118,7 +116,7 @@ error:
     if (vport->fd != -1) {
         close(vport->fd);
     }
-    free(vport);
+    g_free(vport);
     return NULL;
 }
 
@@ -137,18 +135,17 @@ void vdagent_virtio_port_destroy(struct vdagent_virtio_port **vportp)
     wbuf = vport->write_buf;
     while (wbuf) {
         next_wbuf = wbuf->next;
-        free(wbuf->buf);
-        free(wbuf);
+        g_free(wbuf->buf);
+        g_free(wbuf);
         wbuf = next_wbuf;
     }
 
     for (i = 0; i < VDP_END_PORT; i++) {
-        free(vport->port_data[i].message_data);
+        g_free(vport->port_data[i].message_data);
     }
 
     close(vport->fd);
-    free(vport);
-    *vportp = NULL;
+    g_clear_pointer(vportp, g_free);
 }
 
 int vdagent_virtio_port_fill_fds(struct vdagent_virtio_port *vport,
@@ -203,19 +200,12 @@ int vdagent_virtio_port_write_start(
     VDIChunkHeader chunk_header;
     VDAgentMessage message_header;
 
-    new_wbuf = malloc(sizeof(*new_wbuf));
-    if (!new_wbuf)
-        return -1;
-
+    new_wbuf = g_new(struct vdagent_virtio_port_buf, 1);
     new_wbuf->pos = 0;
     new_wbuf->write_pos = 0;
     new_wbuf->size = sizeof(chunk_header) + sizeof(message_header) + data_size;
     new_wbuf->next = NULL;
-    new_wbuf->buf = malloc(new_wbuf->size);
-    if (!new_wbuf->buf) {
-        free(new_wbuf);
-        return -1;
-    }
+    new_wbuf->buf = g_malloc(new_wbuf->size);
 
     chunk_header.port = GUINT32_TO_LE(port_nr);
     chunk_header.size = GUINT32_TO_LE(sizeof(message_header) + data_size);
@@ -291,7 +281,7 @@ void vdagent_virtio_port_reset(struct vdagent_virtio_port *vport, int port)
         syslog(LOG_ERR, "vdagent_virtio_port_reset port out of range");
         return;
     }
-    free(vport->port_data[port].message_data);
+    g_free(vport->port_data[port].message_data);
     memset(&vport->port_data[port], 0, sizeof(vport->port_data[0]));
 }
 
@@ -318,12 +308,7 @@ static void vdagent_virtio_port_do_chunk(struct vdagent_virtio_port **vportp)
             port->message_header.size = GUINT32_FROM_LE(port->message_header.size);
 
             if (port->message_header.size) {
-                port->message_data = malloc(port->message_header.size);
-                if (!port->message_data) {
-                    syslog(LOG_ERR, "out of memory, disconnecting virtio");
-                    vdagent_virtio_port_destroy(vportp);
-                    return;
-                }
+                port->message_data = g_malloc(port->message_header.size);
             }
         }
         pos = read;
@@ -359,8 +344,7 @@ static void vdagent_virtio_port_do_chunk(struct vdagent_virtio_port **vportp)
             }
             port->message_header_read = 0;
             port->message_data_pos = 0;
-            free(port->message_data);
-            port->message_data = NULL;
+            g_clear_pointer(&port->message_data, g_free);
         }
     }
 }
@@ -496,7 +480,7 @@ static void vdagent_virtio_port_do_write(struct vdagent_virtio_port **vportp)
     wbuf->pos += n;
     if (wbuf->pos == wbuf->size) {
         vport->write_buf = wbuf->next;
-        free(wbuf->buf);
-        free(wbuf);
+        g_free(wbuf->buf);
+        g_free(wbuf);
     }
 }
-- 
2.17.1



More information about the Spice-devel mailing list