diff options
| author | Paul Eggert | 2013-03-02 13:05:52 -0800 |
|---|---|---|
| committer | Paul Eggert | 2013-03-02 13:05:52 -0800 |
| commit | 2db41375423b6a48a55df2c5922bb2813319f06f (patch) | |
| tree | 50c68274acb327e04705554b5828201ed63732f9 /src/filelock.c | |
| parent | b5029e230d10ea412e4ff1d4867a0c884d130039 (diff) | |
| download | emacs-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.c | 49 |
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) | |||
| 597 | void | 597 | void |
| 598 | lock_file (Lisp_Object fn) | 598 | lock_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 | ||
| 673 | void | 668 | void |