From a54af40e14bbddbe836aecff0f9308a01c477ca2 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 26 Feb 2011 09:44:38 +0200 Subject: [PATCH] Fix the MS-Windows build after 2011-02-26T05:54:36Z!eggert@cs.ucla.edu. emacsclient.c (xstrdup) [WINDOWSNT]: Function added back. (w32_getenv): Use xstrdup to return all values in malloc'ed storage. --- lib-src/ChangeLog | 6 ++++++ lib-src/emacsclient.c | 29 +++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index ba77a92cf17..b330a447d54 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,9 @@ +2011-02-26 Eli Zaretskii + + * emacsclient.c (xstrdup) [WINDOWSNT]: Function added back. + (w32_getenv): Use xstrdup to return all values in malloc'ed + storage. + 2011-02-26 Paul Eggert * ebrowse.c (parse_qualified_param_ident_or_type): Make it clear diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 251f35873e3..836891ae6aa 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -293,6 +293,20 @@ get_current_dir_name (void) #ifdef WINDOWSNT +/* Like strdup but get a fatal error if memory is exhausted. */ + +char * +xstrdup (const char *s) +{ + char *result = strdup (s); + if (result == NULL) + { + perror ("strdup"); + exit (EXIT_FAILURE); + } + return result; +} + #define REG_ROOT "SOFTWARE\\GNU\\Emacs" /* Retrieve an environment variable from the Emacs subkeys of the registry. @@ -328,9 +342,11 @@ w32_get_resource (HKEY predefined, char *key, LPDWORD type) /* getenv wrapper for Windows - This is needed to duplicate Emacs's behavior, which is to look for environment - variables in the registry if they don't appear in the environment. -*/ + Value is allocated on the heap, and can be free'd. + + This is needed to duplicate Emacs's behavior, which is to look for + environment variables in the registry if they don't appear in the + environment. */ char * w32_getenv (char *envvar) { @@ -338,15 +354,16 @@ w32_getenv (char *envvar) DWORD dwType; if (value = getenv (envvar)) - /* Found in the environment. */ - return value; + /* Found in the environment. strdup it, because values returned + by getenv cannot be free'd. */ + return xstrdup (value); if (! (value = w32_get_resource (HKEY_CURRENT_USER, envvar, &dwType)) && ! (value = w32_get_resource (HKEY_LOCAL_MACHINE, envvar, &dwType))) { /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */ if (strcmp (envvar, "TERM") == 0) - return "w32console"; + return xstrdup ("w32console"); /* Found neither in the environment nor in the registry. */ return NULL; } -- 2.39.2