Oliver Falk wrote: > Hi list! > > For reference: https://bugzilla.redhat.com/show_bug.cgi?id=464760 > > While trying to compile NM-1:0.7.0-0.11.svn4022.2 on alpha, I ran into a > compile error: > > """ > nm-serial-device.c: In function 'nm_serial_device_open': > nm-serial-device.c:348: error: array subscript is above array bounds > nm-serial-device.c:349: error: array subscript is above array bounds > """ > > After analysing the problem, I found out that stdbuf is defined as "struct > termio". Take a look at termio.h: > """ > [oliver kriek ~]$ cat /usr/include/termio.h > /* Compatible <termio.h> for old `struct termio' ioctl interface. > This is obsolete; use the POSIX.1 `struct termios' interface > defined in <termios.h> instead. */ > > #include <termios.h> > #include <sys/ioctl.h> > """ > > A simple fix - at least for alpha - is to use "struct termios" instead (I'll > include a patch!). However, I have not tested this on x86 or any other > platform - this is up to you! :-) > I've attached a more complete patch (based on the NM-0_7 branch), which replaces the struct termio ioctl calls completely. The 0.7.1 package now builds fine again on alpha [1]. Please review and apply. Cheers, Michael [1] https://buildd.debian.org/fetch.cgi?pkg=network-manager;ver=0.7.1-1;arch=alpha;stamp=1239931427 -- Why is it that all of the instruments seeking intelligent life in the universe are pointed away from Earth?
From e7f09bb883f91b2af0f135559208dc0f6a437201 Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl debian org>
Date: Fri, 17 Apr 2009 01:52:01 +0200
Subject: [PATCH] Use struct termios interface
Use the POSIX.1 struct termios interface instead of the obsolete struct
termio ioctl interface.
---
src/nm-serial-device.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/nm-serial-device.c b/src/nm-serial-device.c
index 1cba1ca..afdc6a6 100644
--- a/src/nm-serial-device.c
+++ b/src/nm-serial-device.c
@@ -21,13 +21,12 @@
#define _GNU_SOURCE /* for strcasestr() */
-#include <termio.h>
+#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
-#include <sys/ioctl.h>
#include <string.h>
#include <stdlib.h>
#include <glib.h>
@@ -346,7 +345,7 @@ static gboolean
config_fd (NMSerialDevice *device, NMSettingSerial *setting)
{
NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
- struct termio stbuf;
+ struct termios stbuf;
int speed;
int bits;
int parity;
@@ -357,7 +356,7 @@ config_fd (NMSerialDevice *device, NMSettingSerial *setting)
parity = parse_parity (nm_setting_serial_get_parity (setting));
stopbits = parse_stopbits (nm_setting_serial_get_stopbits (setting));
- ioctl (priv->fd, TCGETA, &stbuf);
+ tcgetattr (priv->fd, &stbuf);
stbuf.c_iflag &= ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | IGNPAR );
stbuf.c_oflag &= ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
@@ -370,7 +369,7 @@ config_fd (NMSerialDevice *device, NMSettingSerial *setting)
stbuf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB);
stbuf.c_cflag |= (speed | bits | CREAD | 0 | parity | stopbits);
- if (ioctl (priv->fd, TCSETA, &stbuf) < 0) {
+ if (tcgetattr (priv->fd, &stbuf) < 0) {
nm_warning ("(%s) cannot control device (errno %d)",
nm_device_get_iface (NM_DEVICE (device)), errno);
return FALSE;
@@ -404,7 +403,7 @@ nm_serial_device_open (NMSerialDevice *device,
return FALSE;
}
- if (ioctl (priv->fd, TCGETA, &priv->old_t) < 0) {
+ if (tcgetattr (priv->fd, &priv->old_t) < 0) {
nm_warning ("(%s) cannot control device (errno %d)", iface, errno);
close (priv->fd);
return FALSE;
@@ -447,7 +446,7 @@ nm_serial_device_close (NMSerialDevice *device)
priv->channel = NULL;
}
- ioctl (priv->fd, TCSETA, &priv->old_t);
+ tcsetattr (priv->fd, TCSANOW, &priv->old_t);
close (priv->fd);
priv->fd = 0;
}
--
1.6.2.3
Attachment:
signature.asc
Description: OpenPGP digital signature