aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysdep.c
diff options
context:
space:
mode:
authorPaul Eggert2020-12-25 01:38:31 -0800
committerPaul Eggert2020-12-25 01:40:39 -0800
commitec8a17e938c3ef213709ea6b6b3e565333a9c508 (patch)
tree1558c79f3c269d9ae1b068bb7c66fce04707b32c /src/sysdep.c
parentb8b17038e140fe215a76f2e899c00b9b95614886 (diff)
downloademacs-ec8a17e938c3ef213709ea6b6b3e565333a9c508.tar.gz
emacs-ec8a17e938c3ef213709ea6b6b3e565333a9c508.zip
Adjust to recent Gnulib changes
The latest Gnulib merge brought in free-posix, which causes 'free' to preserve errno. This lets us simplify some Emacs code that calls 'free'. * admin/merge-gnulib (GNULIB_MODULES): Add free-posix. This module is pulled in by canonicalize-lgpl anyway, so we might as well rely on it. * lib-src/emacsclient.c (get_current_dir_name): Sync better with src/sysdep.c. * lib-src/etags.c (process_file_name, etags_mktmp): * lib-src/update-game-score.c (unlock_file): * src/fileio.c (file_accessible_directory_p): * src/sysdep.c (get_current_dir_name_or_unreachable): Simplify by assuming that 'free' preserves errno. * src/alloc.c (malloc_unblock_input): Preserve errno, so that xfree preserves errno. * src/sysdep.c (get_current_dir_name_or_unreachable): Simplify by using strdup instead of malloc+memcpy. No need for realloc (and the old code leaked memory anyway on failure); just use free+malloc.
Diffstat (limited to 'src/sysdep.c')
-rw-r--r--src/sysdep.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/src/sysdep.c b/src/sysdep.c
index 29c88f5308e..eeb9d184940 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -314,33 +314,21 @@ get_current_dir_name_or_unreachable (void)
314 && emacs_fstatat (AT_FDCWD, ".", &dotstat, 0) == 0 314 && emacs_fstatat (AT_FDCWD, ".", &dotstat, 0) == 0
315 && dotstat.st_ino == pwdstat.st_ino 315 && dotstat.st_ino == pwdstat.st_ino
316 && dotstat.st_dev == pwdstat.st_dev) 316 && dotstat.st_dev == pwdstat.st_dev)
317 { 317 return strdup (pwd);
318 char *buf = malloc (pwdlen + 1);
319 if (!buf)
320 return NULL;
321 return memcpy (buf, pwd, pwdlen + 1);
322 }
323 else 318 else
324 { 319 {
325 ptrdiff_t buf_size = min (bufsize_max, 1024); 320 ptrdiff_t buf_size = min (bufsize_max, 1024);
326 char *buf = malloc (buf_size);
327 if (!buf)
328 return NULL;
329 for (;;) 321 for (;;)
330 { 322 {
323 char *buf = malloc (buf_size);
324 if (!buf)
325 return NULL;
331 if (getcwd (buf, buf_size) == buf) 326 if (getcwd (buf, buf_size) == buf)
332 return buf; 327 return buf;
333 int getcwd_errno = errno; 328 free (buf);
334 if (getcwd_errno != ERANGE || buf_size == bufsize_max) 329 if (errno != ERANGE || buf_size == bufsize_max)
335 { 330 return NULL;
336 free (buf);
337 errno = getcwd_errno;
338 return NULL;
339 }
340 buf_size = buf_size <= bufsize_max / 2 ? 2 * buf_size : bufsize_max; 331 buf_size = buf_size <= bufsize_max / 2 ? 2 * buf_size : bufsize_max;
341 buf = realloc (buf, buf_size);
342 if (!buf)
343 return NULL;
344 } 332 }
345 } 333 }
346} 334}