unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Ken Brown <kbrown@cornell.edu>
To: 11508@debbugs.gnu.org
Subject: bug#11508: 24.1.50; Off-by-one error in xg_select?
Date: Fri, 18 May 2012 09:13:41 -0400	[thread overview]
Message-ID: <4FB64B05.6020709@cornell.edu> (raw)

I apologize in advance for the noise if I'm misunderstanding something,
but it seems to me that there is an error in the calculation of the
first argument in the call to select in xgselect.c:105. (Line numbers
refer to the current trunk; xgselect.c was last changed in bzr revno
108249.)

The parameter "max_fds" in xg_select, in spite of its name, is initially
1 higher than the maximal file descriptor in the fd_sets in the other
parameters.  If max_fds doesn't get increased in line 78 or 83, then
line 104 does the wrong thing, causing the first argument to select in
line 105 to be 1 higher than it should be.

I think the following patch fixes this.  It also renames "max_fds" to
"fds_lim" to more accurately reflect what it represents.

=== modified file 'src/xgselect.c'
--- src/xgselect.c	2012-05-16 02:22:53 +0000
+++ src/xgselect.c	2012-05-18 12:28:27 +0000
@@ -32,7 +32,7 @@
 static ptrdiff_t gfds_size;
 
 int
-xg_select (int max_fds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
+xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
 	   EMACS_TIME *timeout)
 {
   SELECT_TYPE all_rfds, all_wfds;
@@ -41,10 +41,10 @@
   GMainContext *context;
   int have_wfds = wfds != NULL;
   int n_gfds = 0, our_tmo = 0, retval = 0, our_fds = 0;
-  int i, nfds, fds_lim, tmo_in_millisec;
+  int i, nfds, tmo_in_millisec;
 
   if (inhibit_window_system || !display_arg)
-    return select (max_fds, rfds, wfds, efds, timeout);
+    return select (fds_lim, rfds, wfds, efds, timeout);
 
   if (rfds) memcpy (&all_rfds, rfds, sizeof (all_rfds));
   else FD_ZERO (&all_rfds);
@@ -75,12 +75,12 @@
       if (gfds[i].events & G_IO_IN)
         {
           FD_SET (gfds[i].fd, &all_rfds);
-          if (gfds[i].fd > max_fds) max_fds = gfds[i].fd;
+          if (gfds[i].fd >= fds_lim) fds_lim = gfds[i].fd + 1;
         }
       if (gfds[i].events & G_IO_OUT)
         {
           FD_SET (gfds[i].fd, &all_wfds);
-          if (gfds[i].fd > max_fds) max_fds = gfds[i].fd;
+          if (gfds[i].fd >= fds_lim) fds_lim = gfds[i].fd + 1;
           have_wfds = 1;
         }
     }
@@ -101,7 +101,6 @@
       if (our_tmo) tmop = &tmo;
     }
 
-  fds_lim = max_fds + 1;
   nfds = select (fds_lim, &all_rfds, have_wfds ? &all_wfds : NULL, efds, tmop);
 
   if (nfds < 0)







             reply	other threads:[~2012-05-18 13:13 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18 13:13 Ken Brown [this message]
2012-05-19  8:05 ` bug#11508: 24.1.50; Off-by-one error in xg_select? Jan Djärv
2012-05-19  8:29   ` Jan Djärv
2012-05-19  9:52     ` Andreas Schwab
2012-05-20 22:44       ` Ken Brown
2012-05-21  5:30         ` Jan Djärv
2012-05-21 13:38           ` Ken Brown

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FB64B05.6020709@cornell.edu \
    --to=kbrown@cornell.edu \
    --cc=11508@debbugs.gnu.org \
    /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 public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).