aboutsummaryrefslogtreecommitdiffstats
path: root/src/filelock.c
diff options
context:
space:
mode:
authorPaul Eggert2013-03-02 13:05:52 -0800
committerPaul Eggert2013-03-02 13:05:52 -0800
commit2db41375423b6a48a55df2c5922bb2813319f06f (patch)
tree50c68274acb327e04705554b5828201ed63732f9 /src/filelock.c
parentb5029e230d10ea412e4ff1d4867a0c884d130039 (diff)
downloademacs-2db41375423b6a48a55df2c5922bb2813319f06f.tar.gz
emacs-2db41375423b6a48a55df2c5922bb2813319f06f.zip
* filelock.c (lock_file): Don't access freed storage.
Diffstat (limited to 'src/filelock.c')
-rw-r--r--src/filelock.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/src/filelock.c b/src/filelock.c
index d52e9faeb44..14b9d4aaca5 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -597,11 +597,9 @@ lock_if_free (lock_info_type *clasher, register char *lfname)
597void 597void
598lock_file (Lisp_Object fn) 598lock_file (Lisp_Object fn)
599{ 599{
600 register Lisp_Object attack, orig_fn, encoded_fn; 600 Lisp_Object orig_fn, encoded_fn;
601 register char *lfname, *locker; 601 char *lfname;
602 ptrdiff_t locker_size;
603 lock_info_type lock_info; 602 lock_info_type lock_info;
604 printmax_t pid;
605 struct gcpro gcpro1; 603 struct gcpro gcpro1;
606 USE_SAFE_ALLOCA; 604 USE_SAFE_ALLOCA;
607 605
@@ -642,32 +640,29 @@ lock_file (Lisp_Object fn)
642 call1 (intern ("ask-user-about-supersession-threat"), fn); 640 call1 (intern ("ask-user-about-supersession-threat"), fn);
643 641
644 } 642 }
645 UNGCPRO;
646
647 /* Try to lock the lock. */
648 if (lock_if_free (&lock_info, lfname) <= 0)
649 /* Return now if we have locked it, or if lock creation failed */
650 return;
651 643
652 /* Else consider breaking the lock */ 644 /* Try to lock the lock. */
653 locker_size = (strlen (lock_info.user) + strlen (lock_info.host) 645 if (0 < lock_if_free (&lock_info, lfname))
654 + INT_STRLEN_BOUND (printmax_t)
655 + sizeof "@ (pid )");
656 locker = SAFE_ALLOCA (locker_size);
657 pid = lock_info.pid;
658 esprintf (locker, "%s@%s (pid %"pMd")",
659 lock_info.user, lock_info.host, pid);
660 FREE_LOCK_INFO (lock_info);
661
662 attack = call2 (intern ("ask-user-about-lock"), fn, build_string (locker));
663 SAFE_FREE ();
664 if (!NILP (attack))
665 /* User says take the lock */
666 { 646 {
667 lock_file_1 (lfname, 1); 647 /* Someone else has the lock. Consider breaking it. */
668 return; 648 ptrdiff_t locker_size = (strlen (lock_info.user) + strlen (lock_info.host)
649 + INT_STRLEN_BOUND (printmax_t)
650 + sizeof "@ (pid )");
651 char *locker = SAFE_ALLOCA (locker_size);
652 printmax_t pid = lock_info.pid;
653 Lisp_Object attack;
654 esprintf (locker, "%s@%s (pid %"pMd")",
655 lock_info.user, lock_info.host, pid);
656 FREE_LOCK_INFO (lock_info);
657
658 attack = call2 (intern ("ask-user-about-lock"), fn, build_string (locker));
659 /* Take the lock if the user said so. */
660 if (!NILP (attack))
661 lock_file_1 (lfname, 1);
669 } 662 }
670 /* User says ignore the lock */ 663
664 UNGCPRO;
665 SAFE_FREE ();
671} 666}
672 667
673void 668void