From: Paul Eggert <eggert@cs.ucla.edu>
To: 8277@debbugs.gnu.org
Subject: bug#8277: Emacs should use socklen_t for socket lengths
Date: Thu, 17 Mar 2011 21:40:28 -0700 [thread overview]
Message-ID: <4D82E23C.3010604@cs.ucla.edu> (raw)
[-- Attachment #1: Type: text/plain, Size: 4647 bytes --]
In several places in the Emacs trunk src/process.c, the type
'int' is used where POSIX says socklen_t should be used.
The two types are typically the same, or at least the same
size, but on some platforms (e.g., 64-bit HP-UX) they
have different sizes and pointers to them can't be safely
interchanged.
I plan to install the following patch, which uses the gnulib
socklen module to provide a definition of socklen_t
on platforms that do not already define it, and then
substitutes 'socklen_t' for the relevant occurrences of 'int' in
src/process.c. MS-DOS and MS-Windows ports may be affected by
this, since it adds an "#undef socklen_t" to src/config.in.
The patch below contains just the hand-maintained source files;
the full patch (including autogenerated files) is attached.
=== modified file 'ChangeLog'
--- ChangeLog 2011-03-13 17:39:04 +0000
+++ ChangeLog 2011-03-18 03:30:24 +0000
@@ -1,3 +1,9 @@
+2011-03-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * Makefile.in (GNULIB_MODULES): Add socklen.
+ * configure.in: Do not check for sys/socket.h, since socklen does that.
+ * m4/socklen.m4: New automatically-generated file, from gnulib.
+
2011-03-13 Paul Eggert <eggert@cs.ucla.edu>
Update for gnulib.
=== modified file 'Makefile.in'
--- Makefile.in 2011-03-13 17:39:04 +0000
+++ Makefile.in 2011-03-18 03:30:24 +0000
@@ -332,7 +332,7 @@
# as per $(gnulib_srcdir)/DEPENDENCIES.
GNULIB_MODULES = \
crypto/md5 dtoastr filemode getloadavg getopt-gnu \
- ignore-value intprops lstat mktime readlink strftime symlink sys_stat
+ ignore-value intprops lstat mktime readlink socklen strftime symlink sys_stat
GNULIB_TOOL_FLAGS = \
--import --no-changelog --no-vc-files --makefile-name=gnulib.mk
sync-from-gnulib: $(gnulib_srcdir)
=== modified file 'configure.in'
--- configure.in 2011-03-12 19:19:47 +0000
+++ configure.in 2011-03-18 03:30:24 +0000
@@ -1265,7 +1265,6 @@
AC_DEFINE(NO_MATHERR, 1, [Define to 1 if you don't have struct exception in math.h.])
fi
-AC_CHECK_HEADERS(sys/socket.h)
AC_CHECK_HEADERS(net/if.h, , , [AC_INCLUDES_DEFAULT
#if HAVE_SYS_SOCKET_H
#include <sys/socket.h>
=== modified file 'src/ChangeLog'
--- src/ChangeLog 2011-03-17 16:51:42 +0000
+++ src/ChangeLog 2011-03-18 03:30:24 +0000
@@ -1,3 +1,13 @@
+2011-03-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * process.c (Fmake_network_process): Use socklen_t, not int,
+ where POSIX says socklen_t is required in portable programs.
+ This fixes a porting bug on hosts like 64-bit HP-UX, where
+ socklen_t is wider than int.
+ (Fmake_network_process, server_accept_connection):
+ (wait_reading_process_output, read_process_output):
+ Likewise.
+
2011-03-17 Paul Eggert <eggert@cs.ucla.edu>
Fix more problems found by GCC 4.5.2's static checks.
=== modified file 'src/process.c'
--- src/process.c 2011-03-17 05:18:33 +0000
+++ src/process.c 2011-03-18 03:30:24 +0000
@@ -3467,7 +3467,7 @@
if (EQ (service, Qt))
{
struct sockaddr_in sa1;
- int len1 = sizeof (sa1);
+ socklen_t len1 = sizeof (sa1);
if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
{
((struct sockaddr_in *)(lres->ai_addr))->sin_port = sa1.sin_port;
@@ -3514,7 +3514,8 @@
/* Unlike most other syscalls connect() cannot be called
again. (That would return EALREADY.) The proper way to
wait for completion is select(). */
- int sc, len;
+ int sc;
+ socklen_t len;
SELECT_TYPE fdset;
retry_select:
FD_ZERO (&fdset);
@@ -3587,7 +3588,7 @@
if (!is_server)
{
struct sockaddr_in sa1;
- int len1 = sizeof (sa1);
+ socklen_t len1 = sizeof (sa1);
if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
contact = Fplist_put (contact, QClocal,
conv_sockaddr_to_lisp ((struct sockaddr *)&sa1, len1));
@@ -4192,7 +4193,7 @@
struct sockaddr_un un;
#endif
} saddr;
- int len = sizeof saddr;
+ socklen_t len = sizeof saddr;
s = accept (channel, &saddr.sa, &len);
@@ -5059,7 +5060,7 @@
/* getsockopt(,,SO_ERROR,,) is said to hang on some systems.
So only use it on systems where it is known to work. */
{
- int xlen = sizeof (xerrno);
+ socklen_t xlen = sizeof (xerrno);
if (getsockopt (channel, SOL_SOCKET, SO_ERROR, &xerrno, &xlen))
xerrno = errno;
}
@@ -5171,7 +5172,7 @@
/* We have a working select, so proc_buffered_char is always -1. */
if (DATAGRAM_CHAN_P (channel))
{
- int len = datagram_address[channel].len;
+ socklen_t len = datagram_address[channel].len;
nbytes = recvfrom (channel, chars + carryover, readmax,
0, datagram_address[channel].sa, &len);
}
[-- Attachment #2: patch.txt.gz --]
[-- Type: application/x-gzip, Size: 4537 bytes --]
next reply other threads:[~2011-03-18 4:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-18 4:40 Paul Eggert [this message]
2011-03-20 16:38 ` bug#8277: Emacs should use socklen_t for socket lengths Paul Eggert
2011-03-20 18:08 ` Eli Zaretskii
2011-03-20 18:34 ` Paul Eggert
2011-03-20 18:45 ` Eli Zaretskii
2011-03-20 18:53 ` Paul Eggert
2011-03-20 19:22 ` Eli Zaretskii
2011-03-20 19:40 ` Paul Eggert
2011-03-20 20:36 ` 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D82E23C.3010604@cs.ucla.edu \
--to=eggert@cs.ucla.edu \
--cc=8277@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 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.