From: "ken manheimer" <ken.manheimer@gmail.com>
To: "Thien-Thi Nguyen" <ttn@gnuvola.org>
Cc: wilde@sha-bang.de, emacs-pretest-bug@gnu.org, ueno@unixuser.org,
emacs-devel <emacs-devel@gnu.org>
Subject: Re: pgg-gpg.el - pgg-gpg-process-region timing problem
Date: Mon, 23 Jun 2008 13:44:52 -0400 [thread overview]
Message-ID: <2cd46e7f0806231044w6410b825s9611ba713e9ac353@mail.gmail.com> (raw)
In-Reply-To: <873an4b898.fsf@ambire.localdomain>
hi, thi. thanks for the responses - i'm glad to see investigation into this.
i've tried both the patches, and both hang for me on the pggprob.el
test. the hang is interruptable with Ctl-G keyboard quit. i tried
stepping through the second patched version with edebug (including
disabling the '(inhibit-redisplay t)' let-binding, which thwarts
edebug stepping), and found the hang happens at the first
'(accept-process-output process)'. (it hangs at the second one if i
don't provide a passphrase.)
i'm not sure what's happening. in case it helps, gpg 1.4.6 is what's
running on my system.
--
ken
http://myriadicity.net
On Mon, Jun 23, 2008 at 9:17 AM, Thien-Thi Nguyen <ttn@gnuvola.org> wrote:
> Delving into this, i got a little carried away... full func below.
> This adds GOOD_PASSPHRASE checking (necessary for GNUPG 1.4.6, at
> least) and some other coding-system related finessing, but removes
> the sentinel proposed in the first attempt. In its place, we zonk
> the baleful `process-adaptive-read-buffering' and remove timeout
> parameters from `accept-process-output' calls.
>
> With this func things seem to work fine for `pgg-sign' on a small
> buffer, and mostly for large buffers (270KB), but sometimes (~10%)
> with large buffers, i see a "file error: bad address *GnuPG*". Hmmm...
>
> thi
>
> ______________________________________________________________________
> (defun pgg-gpg-process-region (start end passphrase program args)
> (let* ((use-agent (and (null passphrase) (pgg-gpg-use-agent-p)))
> (output-file-name (pgg-make-temp-file "pgg-output"))
> (args
> `("--status-fd" "2"
> ,@(if use-agent '("--use-agent")
> (if passphrase '("--passphrase-fd" "0")))
> "--yes" ; overwrite
> "--output" ,output-file-name
> ,@pgg-gpg-extra-args ,@args))
> (output-buffer pgg-output-buffer)
> (errors-buffer pgg-errors-buffer)
> (orig-mode (default-file-modes))
> (inhibit-redisplay t))
> (with-current-buffer (get-buffer-create errors-buffer)
> (buffer-disable-undo)
> (erase-buffer))
> (unwind-protect
> (let* ((coding-system-for-write 'binary)
> ;; GNUPG 1.4.6 does not terminate on bad passphrase, eg:
> ;; [GNUPG:] BAD_PASSPHRASE (long hex # here)
> ;; gpg: skipped "ttn": bad passphrase
> ;; gpg: [stdin]: clearsign failed: bad passphrase
> ;; so we need to check that condition ourselves and bail out.
> ;;
> ;; To check if the passphrase is accepted, we need to parse the
> ;; errors-buffer, but `process-adaptive-read-buffering' non-nil
> ;; sometimes prevents it from filling. So turn it off.
> (process-adaptive-read-buffering (not passphrase))
> (process (progn
> (set-default-file-modes 448)
> (apply #'start-process "*GnuPG*"
> errors-buffer program args)))
> (status (process-status process))
>
> exit-status)
> (set-process-sentinel process nil)
> (when passphrase
> (let ((coding-system-for-write (or pgg-passphrase-coding-system
> 'binary)))
> (process-send-string process passphrase))
> (process-send-string process "\n")
> ;; Bail out if passphrase is not accepted.
> ;; MAINTAIN ME: Tested against GNUPG 1.4.6.
> (let (result)
> (while (not result)
> (accept-process-output process)
> (with-current-buffer errors-buffer
> (save-excursion
> (goto-char (point-min))
> (when (re-search-forward
> ;; BGM: BAD, GOOD, MISSING.
> "^.GNUPG:. \\([BGM][A-Z]+\\)_PASSPHRASE"
> nil t)
> (setq result (match-string 1))))))
> (unless (string= "GOOD" result)
> (error "Passphrase no good"))))
> (process-send-region process start end)
> (process-send-eof process)
> ;; TODO: Re-enable `process-adaptive-read-buffering' here.
> (while (eq 'run (setq status (process-status process)))
> (accept-process-output process))
> (delete-process process)
> (setq exit-status (process-exit-status process))
> (with-current-buffer (get-buffer-create output-buffer)
> (buffer-disable-undo)
> (erase-buffer)
> (if (file-exists-p output-file-name)
> (let ((coding-system-for-read (if pgg-text-mode
> 'raw-text
> 'binary)))
> (insert-file-contents output-file-name)))
> (set-buffer errors-buffer)
> (if (memq status '(stop signal))
> (error "%s exited abnormally: '%s'" program exit-status))
> (if (= 127 exit-status)
> (error "%s could not be found" program))))
> (if (file-exists-p output-file-name)
> (delete-file output-file-name))
> (when (get-process "*GnuPG*")
> (kill-process "*GnuPG*"))
> (set-default-file-modes orig-mode))))
next prev parent reply other threads:[~2008-06-23 17:44 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <873aln2q1d.fsf@stupidchicken.com>
2008-06-22 17:37 ` pgg-gpg.el - pgg-gpg-process-region timing problem ken manheimer
2008-06-23 8:17 ` Thien-Thi Nguyen
2008-06-23 8:43 ` Thien-Thi Nguyen
2008-06-23 13:17 ` bug#471: " Thien-Thi Nguyen
2008-06-23 13:17 ` Thien-Thi Nguyen
2008-06-23 17:44 ` bug#472: " ken manheimer
2008-06-23 17:44 ` ken manheimer [this message]
2008-06-24 10:42 ` bug#474: " Thien-Thi Nguyen
2008-06-24 10:42 ` Thien-Thi Nguyen
2008-06-24 12:30 ` Stefan Monnier
2008-08-02 19:15 ` bug#476: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-06-24 12:30 ` bug#476: pgg-gpg.el - pgg-gpg-process-region timing problem Stefan Monnier
2008-08-02 19:15 ` bug#474: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-08-02 19:15 ` bug#472: " Emacs bug Tracking System
2008-06-24 1:59 ` pgg-gpg.el - pgg-gpg-process-region timing problem Daiki Ueno
2008-06-24 9:09 ` Thien-Thi Nguyen
2008-06-25 11:27 ` Daiki Ueno
2008-08-02 19:15 ` bug#471: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-08-02 19:15 ` bug#469: " Emacs bug Tracking System
2008-06-23 8:43 ` bug#469: pgg-gpg.el - pgg-gpg-process-region timing problem Thien-Thi Nguyen
2008-08-02 19:15 ` bug#470: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-06-23 8:17 ` bug#470: pgg-gpg.el - pgg-gpg-process-region timing problem Thien-Thi Nguyen
2008-06-26 16:16 ` ken manheimer
2008-06-26 16:32 ` Chong Yidong
2008-06-27 14:01 ` ken manheimer
2008-06-27 14:24 ` Miles Bader
2008-06-27 14:39 ` ken manheimer
2008-06-27 16:21 ` Stefan Monnier
2008-06-27 17:33 ` ken manheimer
2008-08-02 19:15 ` bug#487: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-06-26 16:32 ` bug#487: pgg-gpg.el - pgg-gpg-process-region timing problem Chong Yidong
2008-08-02 19:15 ` bug#486: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
2008-06-26 16:16 ` bug#486: pgg-gpg.el - pgg-gpg-process-region timing problem ken manheimer
2008-08-02 19:15 ` bug#465: marked as done (pgg-gpg.el - pgg-gpg-process-region timing problem) Emacs bug Tracking System
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2cd46e7f0806231044w6410b825s9611ba713e9ac353@mail.gmail.com \
--to=ken.manheimer@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=emacs-pretest-bug@gnu.org \
--cc=ttn@gnuvola.org \
--cc=ueno@unixuser.org \
--cc=wilde@sha-bang.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.