Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=xorgtesting.git;a=commitdiff;h=9bd33ceda55c3ad8a06cced03b899a991b9654d9

commit 9bd33ceda55c3ad8a06cced03b899a991b9654d9
Author: bouleetbil <bouleet...@frogdev.info>
Date:   Mon Jun 14 22:57:24 2010 +0000

xorg-server-1.8.1-3-i686
*added fix for FreeResource

diff --git a/source/x11/xorg-server/FixFreeResource.diff 
b/source/x11/xorg-server/FixFreeResource.diff
new file mode 100644
index 0000000..3a81a01
--- /dev/null
+++ b/source/x11/xorg-server/FixFreeResource.diff
@@ -0,0 +1,82 @@
+From 6d7ba5e0fcb5d1bce6bb213dec009f3a0f802d26 Mon Sep 17 00:00:00 2001
+From: Kristian Høgsberg <k...@bitplanet.net>
+Date: Sat, 01 May 2010 17:07:46 +0000
+Subject: dix: Update element count in FreeResource*()
+
+FreeResource() keeps clientTable[cid].elements up to date with the
+number of resources allocated to the client.  The other free
+resource functions (FreeResourceByType(),
+FreeClientNeverRetainResources() and FreeClientResources()) don't
+maintain this invariant.
+
+Typically, the only consequence is that the element count is too high
+and we end up allocating the hash table bigger than necessary.  However,
+FreeResource() also relies on the element count to restart the search if
+the list of resources has been changed during a resource destruction
+callback.  Since FreeResourceByType() doesn't update the count, if we call
+that from a resource destruction callback from FreeResource(), the
+loop isn't restarted and we end up following an invalid next pointer.
+
+Furthermore, LookupClientResourceComplex() and
+FreeClientNeverRetainResources() don't use the element count to detect
+if a callback deleted a resource and may end up following an invalid
+next pointer if the resource system is called into recursively.
+
+Signed-off-by: Kristian Høgsberg <k...@bitplanet.net>
+Reviewed-by: Keith Packard <kei...@keithp.com>
+---
+diff --git a/dix/resource.c b/dix/resource.c
+index 91d0cfb..ab3762e 100644
+--- a/dix/resource.c
++++ b/dix/resource.c
+@@ -589,6 +589,7 @@ FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
+                             res->value, TypeNameString(res->type));
+ #endif
+               *prev = res->next;
++              clientTable[cid].elements--;
+
+               CallResourceStateCallback(ResourceStateFreeing, res);
+
+@@ -734,12 +735,14 @@ FreeClientNeverRetainResources(ClientPtr client)
+     ResourcePtr *resources;
+     ResourcePtr this;
+     ResourcePtr *prev;
+-    int j;
++    int j, elements;
++    int *eltptr;
+
+     if (!client)
+       return;
+
+     resources = clientTable[client->index].resources;
++    eltptr = &clientTable[client->index].elements;
+     for (j=0; j < clientTable[client->index].buckets; j++)
+     {
+       prev = &resources[j];
+@@ -753,11 +756,15 @@ FreeClientNeverRetainResources(ClientPtr client)
+                             this->value, TypeNameString(this->type));
+ #endif
+               *prev = this->next;
++              clientTable[client->index].elements--;
+
+               CallResourceStateCallback(ResourceStateFreeing, this);
+
++              elements = *eltptr;
+               (*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
+               xfree(this);
++              if (*eltptr != elements)
++                  prev = &resources[j]; /* prev may no longer be valid */
+           }
+           else
+               prev = &this->next;
+@@ -804,6 +811,7 @@ FreeClientResources(ClientPtr client)
+                         this->value, TypeNameString(this->type));
+ #endif
+           *head = this->next;
++          clientTable[client->index].elements--;
+
+           CallResourceStateCallback(ResourceStateFreeing, this);
+
+--
+cgit v0.8.3-6-g21f6
+
diff --git a/source/x11/xorg-server/FrugalBuild 
b/source/x11/xorg-server/FrugalBuild
index b3e1649..cfdb09c 100644
--- a/source/x11/xorg-server/FrugalBuild
+++ b/source/x11/xorg-server/FrugalBuild
@@ -10,7 +10,7 @@ USE_MULTIBUFFER=${USE_MULTIBUFFER:-"n"}

pkgname=xorg-server
pkgver=1.8.1
-pkgrel=2
+pkgrel=3
pkgdesc="Modular X.Org X Server"
groups=('x11' 'xorg-core')
archs=('i686' 'x86_64' 'ppc')
@@ -36,12 +36,14 @@ backup=('etc/sysconfig/desktop' 
'etc/X11/xorg.conf.d/10-evdev.conf' \
'etc/X11/xorg.conf.d/20-synaptics.conf')
Finclude sourceforge xorg
source=(${sour...@]} \
-       desktop 10-evdev.conf 20-synaptics.conf)
+       desktop 10-evdev.conf 20-synaptics.conf \
+       FixFreeResource.diff)

sha1sums=('cba0d3b3d28696609a1f9b110d4d129cd066e133' \
'676c8ad10a362615ae54de825e37c18c1f69ae08' \
'75f196f82ae19a335b83971b6fbb0f49a9bf6a58' \
-          '6c0156d129ddd2fb5277b76af1738298c2d09d4d')
+          '6c0156d129ddd2fb5277b76af1738298c2d09d4d' \
+          '342389521fe270edbfc0c746db1da72169a3b0a9')

if Fuse $USE_DEVEL; then
pkgver=1.6.3.901.151.g120286a
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to