rpms/wireless-tools/devel wireless-tools-28-alignment-64bit.patch, NONE, 1.1 wireless-tools.spec, 1.34, 1.35
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Mon Apr 30 19:26:38 UTC 2007
Author: caillon
Update of /cvs/dist/rpms/wireless-tools/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv23261
Modified Files:
wireless-tools.spec
Added Files:
wireless-tools-28-alignment-64bit.patch
Log Message:
* Mon Apr 30 2007 Christopher Aillon <caillon at redhat.com> - 1:28-2
- Backport a few 64bit alignment fixes from the latest betas.
wireless-tools-28-alignment-64bit.patch:
iwlib.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++-----------------
iwlib.h | 13 ++++++++++
2 files changed, 73 insertions(+), 21 deletions(-)
--- NEW FILE wireless-tools-28-alignment-64bit.patch ---
--- wireless_tools.28/iwlib.h.alignment-64bit 2007-04-30 15:15:03.000000000 -0400
+++ wireless_tools.28/iwlib.h 2007-04-30 15:15:33.000000000 -0400
@@ -153,6 +153,19 @@
#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */
#endif /* ARPHRD_IEEE80211 */
+#ifndef IW_EV_LCP_PK_LEN
+/* Size of the Event prefix when packed in stream */
+#define IW_EV_LCP_PK_LEN (4)
+/* Size of the various events when packed in stream */
+#define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ)
+#define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(__u32))
+#define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq))
+#define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param))
+#define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr))
+#define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality))
+#define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4)
+#endif /* IW_EV_LCP_PK_LEN */
+
/****************************** TYPES ******************************/
/* Shortcuts */
--- wireless_tools.28/iwlib.c.alignment-64bit 2007-04-30 15:14:57.000000000 -0400
+++ wireless_tools.28/iwlib.c 2007-04-30 15:15:33.000000000 -0400
@@ -2560,17 +2560,17 @@
/* Size (in bytes) of various events */
static const int event_type_size[] = {
- IW_EV_LCP_LEN, /* IW_HEADER_TYPE_NULL */
+ IW_EV_LCP_PK_LEN, /* IW_HEADER_TYPE_NULL */
0,
- IW_EV_CHAR_LEN, /* IW_HEADER_TYPE_CHAR */
+ IW_EV_CHAR_PK_LEN, /* IW_HEADER_TYPE_CHAR */
0,
- IW_EV_UINT_LEN, /* IW_HEADER_TYPE_UINT */
- IW_EV_FREQ_LEN, /* IW_HEADER_TYPE_FREQ */
- IW_EV_ADDR_LEN, /* IW_HEADER_TYPE_ADDR */
+ IW_EV_UINT_PK_LEN, /* IW_HEADER_TYPE_UINT */
+ IW_EV_FREQ_PK_LEN, /* IW_HEADER_TYPE_FREQ */
+ IW_EV_ADDR_PK_LEN, /* IW_HEADER_TYPE_ADDR */
0,
- IW_EV_POINT_LEN, /* Without variable payload */
- IW_EV_PARAM_LEN, /* IW_HEADER_TYPE_PARAM */
- IW_EV_QUAL_LEN, /* IW_HEADER_TYPE_QUAL */
+ IW_EV_POINT_PK_LEN, /* Without variable payload */
+ IW_EV_PARAM_PK_LEN, /* IW_HEADER_TYPE_PARAM */
+ IW_EV_QUAL_PK_LEN, /* IW_HEADER_TYPE_QUAL */
};
/*------------------------------------------------------------------*/
@@ -2607,11 +2607,8 @@
/* Don't "optimise" the following variable, it will crash */
unsigned cmd_index; /* *MUST* be unsigned */
- /* Unused for now. Will be later on... */
- we_version = we_version;
-
/* Check for end of stream */
- if((stream->current + IW_EV_LCP_LEN) > stream->end)
+ if((stream->current + IW_EV_LCP_PK_LEN) > stream->end)
return(0);
#if DEBUG
@@ -2621,7 +2618,7 @@
/* Extract the event header (to get the event id).
* Note : the event may be unaligned, therefore copy... */
- memcpy((char *) iwe, stream->current, IW_EV_LCP_LEN);
+ memcpy((char *) iwe, stream->current, IW_EV_LCP_PK_LEN);
#if DEBUG
printf("DBG - iwe->cmd = 0x%X, iwe->len = %d\n",
@@ -2629,7 +2626,7 @@
#endif
/* Check invalid events */
- if(iwe->len <= IW_EV_LCP_LEN)
+ if(iwe->len <= IW_EV_LCP_PK_LEN)
return(-1);
/* Get the type and length of that event */
@@ -2647,26 +2644,26 @@
}
if(descr != NULL)
event_type = descr->header_type;
- /* Unknown events -> event_type=0 => IW_EV_LCP_LEN */
+ /* Unknown events -> event_type=0 => IW_EV_LCP_PK_LEN */
event_len = event_type_size[event_type];
/* Fixup for earlier version of WE */
if((we_version <= 18) && (event_type == IW_HEADER_TYPE_POINT))
event_len += IW_EV_POINT_OFF;
/* Check if we know about this event */
- if(event_len <= IW_EV_LCP_LEN)
+ if(event_len <= IW_EV_LCP_PK_LEN)
{
/* Skip to next event */
stream->current += iwe->len;
return(2);
}
- event_len -= IW_EV_LCP_LEN;
+ event_len -= IW_EV_LCP_PK_LEN;
/* Set pointer on data */
if(stream->value != NULL)
pointer = stream->value; /* Next value in event */
else
- pointer = stream->current + IW_EV_LCP_LEN; /* First value in event */
+ pointer = stream->current + IW_EV_LCP_PK_LEN; /* First value in event */
#if DEBUG
printf("DBG - event_type = %d, event_len = %d, pointer = %p\n",
@@ -2682,10 +2679,10 @@
}
/* Fixup for WE-19 and later : pointer no longer in the stream */
if((we_version > 18) && (event_type == IW_HEADER_TYPE_POINT))
- memcpy((char *) iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ memcpy((char *) iwe + IW_EV_LCP_PK_LEN + IW_EV_POINT_OFF,
pointer, event_len);
else
- memcpy((char *) iwe + IW_EV_LCP_LEN, pointer, event_len);
+ memcpy((char *) iwe + IW_EV_LCP_PK_LEN, pointer, event_len);
/* Skip event in the stream */
pointer += event_len;
@@ -2694,7 +2691,7 @@
if(event_type == IW_HEADER_TYPE_POINT)
{
/* Check the length of the payload */
- unsigned int extra_len = iwe->len - (event_len + IW_EV_LCP_LEN);
+ unsigned int extra_len = iwe->len - (event_len + IW_EV_LCP_PK_LEN);
if(extra_len > 0)
{
/* Set pointer on variable part (warning : non aligned) */
@@ -2712,6 +2709,31 @@
/* Discard bogus events which advertise more tokens than
* what they carry... */
unsigned int token_len = iwe->u.data.length * descr->token_size;
+
+ /* Ugly fixup for alignement issues.
+ * If the kernel is 64 bits and userspace 32 bits,
+ * we have an extra 4+4 bytes.
+ * Fixing that in the kernel would break 64 bits userspace. */
+ if((token_len != extra_len) && (extra_len >= 4))
+ {
+ __u16 alt_dlen = *((__u16 *) pointer);
+ unsigned int alt_token_len = alt_dlen * descr->token_size;
+ if((alt_token_len + 8) == extra_len)
+ {
+#if DEBUG
+ printf("DBG - alt_token_len = %d\n", alt_token_len);
+#endif
+ /* Ok, let's redo everything */
+ pointer -= event_len;
+ pointer += 4;
+ memcpy((char *) iwe + IW_EV_LCP_PK_LEN + IW_EV_POINT_OFF,
+ pointer, event_len);
+ pointer += event_len + 4;
+ iwe->u.data.pointer = pointer;
+ token_len = alt_token_len;
+ }
+ }
+
if(token_len > extra_len)
iwe->u.data.pointer = NULL; /* Discard paylod */
/* Check that the advertised token size is not going to
@@ -2737,6 +2759,23 @@
}
else
{
+ /* Ugly fixup for alignement issues.
+ * If the kernel is 64 bits and userspace 32 bits,
+ * we have an extra 4 bytes.
+ * Fixing that in the kernel would break 64 bits userspace. */
+ if((stream->value == NULL)
+ && ((((iwe->len - IW_EV_LCP_PK_LEN) % event_len) == 4)
+ || ((event_type == IW_HEADER_TYPE_UINT) && (iwe->len == 12))))
+ {
+#if DEBUG
+ printf("DBG - alt iwe->len = %d\n", iwe->len - 4);
+#endif
+ pointer -= event_len;
+ pointer += 4;
+ memcpy((char *) iwe + IW_EV_LCP_PK_LEN, pointer, event_len);
+ pointer += event_len;
+ }
+
/* Is there more value in the event ? */
if((pointer + event_len) <= (stream->current + iwe->len))
/* Go to next value */
Index: wireless-tools.spec
===================================================================
RCS file: /cvs/dist/rpms/wireless-tools/devel/wireless-tools.spec,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- wireless-tools.spec 29 Aug 2006 23:20:20 -0000 1.34
+++ wireless-tools.spec 30 Apr 2007 19:26:36 -0000 1.35
@@ -8,11 +8,12 @@
License: GPL
Name: wireless-tools
Version: 28
-Release: 1%{?pre_version}%{?dist}
+Release: 2%{?pre_version}%{?dist}
Epoch: 1
URL: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
Source: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.%{version}%{?pre_version}.tar.gz
Patch1: wireless-tools-28-makefile.patch
+Patch2: wireless-tools-28-alignment-64bit.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
ExcludeArch: s390 s390x
@@ -41,6 +42,7 @@
%setup -n wireless_tools.%{version}
%patch1 -p1 -b .makefile
+%patch2 -p1 -b .alignment-64bit
%build
make clean
@@ -78,6 +80,9 @@
%changelog
+* Mon Apr 30 2007 Christopher Aillon <caillon at redhat.com> - 1:28-2
+- Backport a few 64bit alignment fixes from the latest betas.
+
* Tue Aug 29 2006 Christopher Aillon <caillon at redhat.com> - 1:28-1
- Update to the latest stable release
- Create -devel subpackage for headers
More information about the fedora-cvs-commits
mailing list