2011-04-15 Paul Eggert <eggert@cs.ucla.edu>
- * sysdep.c (MAX_RW_COUNT): New macro, to work around kernel bugs.
- (emacs_read, emacs_write): Use it.
-
- * process.c (send_process): Count partial writes as successes.
- See http://lists.gnu.org/archive/html/emacs-devel/2011-04/msg00483.html
-
- emacs_write: Return size_t, not ssize_t, to avoid overflow issues.
- * gnutls.c, gnutls.h (emacs_gnutls_write): Return size_t, not ssize_t.
- * sysdep.c, lisp.h (emacs_write): Likewise.
- Without the above change, emacs_gnutls_write and emacs_write had
- undefined behavior and would typically mistakenly report an error
- when writing a buffer whose size exceeds SSIZE_MAX.
+ emacs_write: Accept and return EMACS_INT for sizes.
+ See http://lists.gnu.org/archive/html/emacs-devel/2011-04/msg00514.html
+ et seq.
+ * gnutls.c, gnutls.h (emacs_gnutls_read, emacs_gnutls_write):
+ Accept and return EMACS_INT.
+ (emacs_gnutls_write): Return the number of bytes written on
+ partial writes.
+ * sysdep.c, lisp.h (emacs_read, emacs_write): Likewise.
(emacs_read, emacs_write): Remove check for negative size, as the
Emacs source code has been audited now.
- (emacs_write): Adjust to new signature, making the code look more
- like that of emacs_gnutls_write.
+ * sysdep.c (MAX_RW_COUNT): New macro, to work around kernel bugs.
+ (emacs_read, emacs_write): Use it.
* process.c (send_process): Adjust to the new signatures of
emacs_write and emacs_gnutls_write. Do not attempt to store
a byte offset into an 'int'; it might overflow.
+ See http://lists.gnu.org/archive/html/emacs-devel/2011-04/msg00483.html
* sound.c: Don't assume sizes fit in 'int'.
(struct sound_device.period_size, alsa_period_size):
}
}
-size_t
+EMACS_INT
emacs_gnutls_write (int fildes, struct Lisp_Process *proc, const char *buf,
- size_t nbyte)
+ EMACS_INT nbyte)
{
ssize_t rtnval;
- size_t bytes_written;
+ EMACS_INT bytes_written;
gnutls_session_t state = proc->gnutls_state;
if (proc->gnutls_initstage != GNUTLS_STAGE_READY) {
return (bytes_written);
}
-ssize_t
+EMACS_INT
emacs_gnutls_read (int fildes, struct Lisp_Process *proc, char *buf,
- size_t nbyte)
+ EMACS_INT nbyte)
{
ssize_t rtnval;
gnutls_session_t state = proc->gnutls_state;
#define GNUTLS_LOG2(level, max, string, extra) if (level <= max) { gnutls_log_function2 (level, "(Emacs) " string, extra); }
-size_t
+EMACS_INT
emacs_gnutls_write (int fildes, struct Lisp_Process *proc, const char *buf,
- size_t nbyte);
-ssize_t
+ EMACS_INT nbyte);
+EMACS_INT
emacs_gnutls_read (int fildes, struct Lisp_Process *proc, char *buf,
- size_t nbyte);
+ EMACS_INT nbyte);
extern void syms_of_gnutls (void);
extern void seed_random (long);
extern int emacs_open (const char *, int, int);
extern int emacs_close (int);
-extern ssize_t emacs_read (int, char *, size_t);
-extern size_t emacs_write (int, const char *, size_t);
+extern EMACS_INT emacs_read (int, char *, EMACS_INT);
+extern EMACS_INT emacs_write (int, const char *, EMACS_INT);
enum { READLINK_BUFSIZE = 1024 };
extern char *emacs_readlink (const char *, char [READLINK_BUFSIZE]);
#ifndef HAVE_MEMSET
/* Read from FILEDESC to a buffer BUF with size NBYTE, retrying if interrupted.
Return the number of bytes read, which might be less than NBYTE.
On error, set errno and return -1. */
-ssize_t
-emacs_read (int fildes, char *buf, size_t nbyte)
+EMACS_INT
+emacs_read (int fildes, char *buf, EMACS_INT nbyte)
{
register ssize_t rtnval;
/* Write to FILEDES from a buffer BUF with size NBYTE, retrying if interrupted
or if a partial write occurs. Return the number of bytes written, setting
errno if this is less than NBYTE. */
-size_t
-emacs_write (int fildes, const char *buf, size_t nbyte)
+EMACS_INT
+emacs_write (int fildes, const char *buf, EMACS_INT nbyte)
{
ssize_t rtnval;
- size_t bytes_written;
+ EMACS_INT bytes_written;
bytes_written = 0;