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