X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a57471f93507c55b55ee9e28c493ba78b46796e3..ec5098562a018551a4ec9652fa7658304b1bbe59:/src/xsmfns.c diff --git a/src/xsmfns.c b/src/xsmfns.c index c199036587..cb7122202d 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c @@ -1,7 +1,7 @@ /* Session management module for systems which understand the X Session management protocol. -Copyright (C) 2002-2011 Free Software Foundation, Inc. +Copyright (C) 2002-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -29,14 +29,12 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include #include "lisp.h" #include "systime.h" #include "sysselect.h" #include "frame.h" #include "termhooks.h" -#include "termopts.h" #include "xterm.h" #include "process.h" #include "keyboard.h" @@ -97,7 +95,7 @@ ice_connection_closed (void) open to a session manager, just return. */ static void -x_session_check_input (int fd, void *data, int for_read) +x_session_check_input (int fd, void *data) { int ret; @@ -190,7 +188,7 @@ smc_save_yourself_CB (SmcConn smcConn, props[props_idx]->type = xstrdup (SmARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; - props[props_idx]->vals[0].length = strlen (SSDATA (Vinvocation_name)); + props[props_idx]->vals[0].length = SBYTES (Vinvocation_name); props[props_idx]->vals[0].value = SDATA (Vinvocation_name); ++props_idx; @@ -200,7 +198,7 @@ smc_save_yourself_CB (SmcConn smcConn, props[props_idx]->type = xstrdup (SmARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; - props[props_idx]->vals[0].length = strlen (SSDATA (Vuser_login_name)); + props[props_idx]->vals[0].length = SBYTES (Vuser_login_name); props[props_idx]->vals[0].value = SDATA (Vuser_login_name); ++props_idx; @@ -223,9 +221,11 @@ smc_save_yourself_CB (SmcConn smcConn, props[props_idx]->name = xstrdup (SmRestartCommand); props[props_idx]->type = xstrdup (SmLISTofARRAY8); /* /path/to/emacs, --smid=xxx --no-splash --chdir=dir ... */ + if (INT_MAX - 3 < initial_argc) + memory_full (SIZE_MAX); i = 3 + initial_argc; props[props_idx]->num_vals = i; - vp = (SmPropValue *) xmalloc (i * sizeof(*vp)); + vp = xnmalloc (i, sizeof *vp); props[props_idx]->vals = vp; props[props_idx]->vals[vp_idx].length = strlen (emacs_program); props[props_idx]->vals[vp_idx++].value = emacs_program; @@ -398,7 +398,7 @@ x_session_initialize (struct x_display_info *dpyinfo) char errorstring[SM_ERRORSTRING_LEN]; char* previous_id = NULL; SmcCallbacks callbacks; - int name_len = 0; + ptrdiff_t name_len = 0; ice_fd = -1; doing_interact = False; @@ -410,8 +410,8 @@ x_session_initialize (struct x_display_info *dpyinfo) /* Construct the path to the Emacs program. */ if (! EQ (Vinvocation_directory, Qnil)) - name_len += strlen (SSDATA (Vinvocation_directory)); - name_len += strlen (SSDATA (Vinvocation_name)); + name_len += SBYTES (Vinvocation_directory); + name_len += SBYTES (Vinvocation_name); /* This malloc will not be freed, but it is only done once, and hopefully not very large */ @@ -457,10 +457,10 @@ x_session_initialize (struct x_display_info *dpyinfo) if (smc_conn != 0) { - Vx_session_id = make_string (client_id, strlen (client_id)); + Vx_session_id = build_string (client_id); #ifdef USE_GTK - /* GTK creats a leader window by itself, but we need to tell + /* GTK creates a leader window by itself, but we need to tell it about our client_id. */ gdk_x11_set_sm_client_id (client_id); #else @@ -514,9 +514,11 @@ Do not call this function yourself. */) prevent. Fix this in next version. */ Fkill_emacs (Qnil); +#if 0 /* This will not be reached, but we want kill-emacs-hook to be run. */ SmcCloseConnection (smc_conn, 0, 0); ice_connection_closed (); +#endif } return Qnil;