1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-04 11:00:45 -08:00

* filelock.c (lock_file): Don't access freed storage.

This commit is contained in:
Paul Eggert 2013-03-02 13:05:52 -08:00
parent b5029e230d
commit 2db4137542
2 changed files with 23 additions and 27 deletions

View file

@ -27,6 +27,7 @@
that's not portable.
(lock_file): Document that this function can return if lock
creation fails.
(lock_file): Don't access freed storage.
2013-03-02 Andreas Schwab <schwab@linux-m68k.org>

View file

@ -597,11 +597,9 @@ lock_if_free (lock_info_type *clasher, register char *lfname)
void
lock_file (Lisp_Object fn)
{
register Lisp_Object attack, orig_fn, encoded_fn;
register char *lfname, *locker;
ptrdiff_t locker_size;
Lisp_Object orig_fn, encoded_fn;
char *lfname;
lock_info_type lock_info;
printmax_t pid;
struct gcpro gcpro1;
USE_SAFE_ALLOCA;
@ -642,32 +640,29 @@ lock_file (Lisp_Object fn)
call1 (intern ("ask-user-about-supersession-threat"), fn);
}
UNGCPRO;
/* Try to lock the lock. */
if (lock_if_free (&lock_info, lfname) <= 0)
/* Return now if we have locked it, or if lock creation failed */
return;
/* Else consider breaking the lock */
locker_size = (strlen (lock_info.user) + strlen (lock_info.host)
+ INT_STRLEN_BOUND (printmax_t)
+ sizeof "@ (pid )");
locker = SAFE_ALLOCA (locker_size);
pid = lock_info.pid;
esprintf (locker, "%s@%s (pid %"pMd")",
lock_info.user, lock_info.host, pid);
FREE_LOCK_INFO (lock_info);
attack = call2 (intern ("ask-user-about-lock"), fn, build_string (locker));
SAFE_FREE ();
if (!NILP (attack))
/* User says take the lock */
/* Try to lock the lock. */
if (0 < lock_if_free (&lock_info, lfname))
{
lock_file_1 (lfname, 1);
return;
/* Someone else has the lock. Consider breaking it. */
ptrdiff_t locker_size = (strlen (lock_info.user) + strlen (lock_info.host)
+ INT_STRLEN_BOUND (printmax_t)
+ sizeof "@ (pid )");
char *locker = SAFE_ALLOCA (locker_size);
printmax_t pid = lock_info.pid;
Lisp_Object attack;
esprintf (locker, "%s@%s (pid %"pMd")",
lock_info.user, lock_info.host, pid);
FREE_LOCK_INFO (lock_info);
attack = call2 (intern ("ask-user-about-lock"), fn, build_string (locker));
/* Take the lock if the user said so. */
if (!NILP (attack))
lock_file_1 (lfname, 1);
}
/* User says ignore the lock */
UNGCPRO;
SAFE_FREE ();
}
void