[Evolution-hackers] Deadlock in camel-gpg-context.c



Hi!

In camel/camel-gpg-context.c (evo 1.3 cvs) there is a problem:

In gpg_ctx_op_step the file descriptors stdout_fd, stderr_fd and
status_fd are polled for input.

But stdout_fd is not read when there is no gpg->ostream to get the data
(if (FD_ISSET (gpg->stdout_fd, &rdset) && gpg->ostream)).

So the end of file state cannot be detected and thus gpg->seen_eof1
won't be set.

If that happens gpg_ctx_op_complete fails to detect when gpg has
finished and the users of these functions run in an endless loop.

The following (ugly) patch fixes the problem for me:

--- camel-gpg-context.c.orig    Mon Apr 21 14:38:57 2003
+++ camel-gpg-context.c Mon Apr 21 14:44:37 2003
@@ -969,11 +969,15 @@
  
  retry:
        FD_ZERO (&rdset);
-       FD_SET (gpg->stdout_fd, &rdset);
+       if (gpg->ostream)
+               FD_SET (gpg->stdout_fd, &rdset);
        FD_SET (gpg->stderr_fd, &rdset);
        FD_SET (gpg->status_fd, &rdset);
  
-       maxfd = MAX (gpg->stdout_fd, gpg->stderr_fd);
+       if (gpg->ostream)
+               maxfd = MAX (gpg->stdout_fd, gpg->stderr_fd);
+       else
+               maxfd = gpg->stderr_fd;
        maxfd = MAX (maxfd, gpg->status_fd);
  
        if (gpg->stdin_fd != -1 || gpg->passwd_fd != -1) {
@@ -1181,7 +1185,7 @@
 static gboolean
 gpg_ctx_op_complete (struct _GpgCtx *gpg)
 {
-       return gpg->complete && gpg->seen_eof1 && gpg->seen_eof2;
+       return gpg->complete && (gpg->seen_eof1 || !gpg->ostream) &&
gpg->seen_eof2;
 }
  
 static gboolean

-- 
Christophe Saout <christophe saout de>

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]