SOURCES: xorg-xserver-server-xkb.patch (NEW) - new

arekm arekm at pld-linux.org
Thu Nov 23 13:56:48 CET 2006


Author: arekm                        Date: Thu Nov 23 12:56:48 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- new

---- Files affected:
SOURCES:
   xorg-xserver-server-xkb.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/xorg-xserver-server-xkb.patch
diff -u /dev/null SOURCES/xorg-xserver-server-xkb.patch:1.1
--- /dev/null	Thu Nov 23 13:56:48 2006
+++ SOURCES/xorg-xserver-server-xkb.patch	Thu Nov 23 13:56:43 2006
@@ -0,0 +1,194 @@
+From: Daniel Stone <daniel at fooishbar.org>
+Date: Sun, 5 Nov 2006 00:47:59 +0000 (+0200)
+Subject: XkbCopyKeymap: don't iterate broken types, or dereference null pointers
+X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/xserver.git;a=commitdiff;h=389275d240e4ba19d62fda0f138a45c7ecb245ff
+
+XkbCopyKeymap: don't iterate broken types, or dereference null pointers
+
+Don't iterate invalid destination types (>= num_types) when coping key
+types.
+Don't free key_aliases if it's NULL (theoretical, but sure).
+Make sure dst's label_font gets allocated if it's NULL.
+(Thanks, Chris Lee.)
+---
+
+--- a/xkb/xkbUtils.c
++++ b/xkb/xkbUtils.c
+@@ -1047,34 +1047,40 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+             }
+         }
+ 
+-        if (src->map->types) {
+-            if (src->map->size_types > dst->map->size_types) {
+-                if (dst->map->types) {
++        if (src->map->types && src->map->num_types) {
++            if (src->map->num_types > dst->map->size_types ||
++                !dst->map->types || !dst->map->size_types) {
++                if (dst->map->types && dst->map->size_types) {
+                     tmp = xrealloc(dst->map->types,
+-                                   src->map->size_types * sizeof(XkbKeyTypeRec));
++                                   src->map->num_types * sizeof(XkbKeyTypeRec));
+                     if (!tmp)
+                         return FALSE;
+                     dst->map->types = tmp;
+                     bzero(dst->map->types +
+-                            (dst->map->size_types * sizeof(XkbKeyTypeRec)),
+-                          (src->map->size_types - dst->map->size_types) *
++                            (dst->map->num_types * sizeof(XkbKeyTypeRec)),
++                          (src->map->num_types - dst->map->size_types) *
+                             sizeof(XkbKeyTypeRec));
+                 }
+                 else {
+-                    tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec));
++                    tmp = xcalloc(src->map->num_types, sizeof(XkbKeyTypeRec));
+                     if (!tmp)
+                         return FALSE;
+                     dst->map->types = tmp;
+                 }
+             }
+-            else if (src->map->size_types < dst->map->size_types) {
+-                if (dst->map->types) {
+-                    for (i = src->map->num_types, dtype = (dst->map->types + i);
+-                         i < dst->map->size_types; i++, dtype++) {
+-                        if (dtype->level_names)
+-                            xfree(dtype->level_names);
+-                        dtype->level_names = NULL;
+-                        dtype->num_levels = 0;
++            else if (src->map->num_types < dst->map->num_types &&
++                     dst->map->types) {
++                for (i = src->map->num_types, dtype = (dst->map->types + i);
++                     i < dst->map->num_types; i++, dtype++) {
++                    if (dtype->level_names)
++                        xfree(dtype->level_names);
++                    dtype->level_names = NULL;
++                    dtype->num_levels = 0;
++                    if (dtype->map_count) {
++                        if (dtype->map)
++                            xfree(dtype->map);
++                        if (dtype->preserve)
++                            xfree(dtype->preserve);
+                     }
+                 }
+             }
+@@ -1082,16 +1088,18 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+             stype = src->map->types;
+             dtype = dst->map->types;
+             for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
+-                if (stype->num_levels) {
++                if (stype->num_levels && stype->level_names) {
+                     if (stype->num_levels != dtype->num_levels &&
+-                        dtype->num_levels && dtype->level_names) {
++                        dtype->num_levels && dtype->level_names &&
++                        i < dst->map->num_types) {
+                         tmp = xrealloc(dtype->level_names,
+                                        stype->num_levels * sizeof(Atom));
+                         if (!tmp)
+                             continue;
+                         dtype->level_names = tmp;
+                     }
+-                    else if (!dtype->num_levels || !dtype->level_names) {
++                    else if (!dtype->num_levels || !dtype->level_names ||
++                             i >= dst->map->num_types) {
+                         tmp = xalloc(stype->num_levels * sizeof(Atom));
+                         if (!tmp)
+                             continue;
+@@ -1102,7 +1110,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+                            stype->num_levels * sizeof(Atom));
+                 }
+                 else {
+-                    if (dtype->num_levels && dtype->level_names)
++                    if (dtype->num_levels && dtype->level_names &&
++                        i < dst->map->num_types)
+                         xfree(dtype->level_names);
+                     dtype->num_levels = 0;
+                     dtype->level_names = NULL;
+@@ -1114,15 +1123,17 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+                 if (stype->map_count) {
+                     if (stype->map) {
+                         if (stype->map_count != dtype->map_count &&
+-                            dtype->map_count && dtype->map) {
++                            dtype->map_count && dtype->map &&
++                            i < dst->map->num_types) {
+                             tmp = xrealloc(dtype->map,
+                                            stype->map_count *
+                                              sizeof(XkbKTMapEntryRec));
+                             if (!tmp)
+                                 return FALSE;
+                             dtype->map = tmp;
+-                       }
+-                        else if (!dtype->map_count || !dtype->map) {
++                        }
++                        else if (!dtype->map_count || !dtype->map ||
++                                 i >= dst->map->num_types) {
+                             tmp = xalloc(stype->map_count *
+                                            sizeof(XkbKTMapEntryRec));
+                             if (!tmp)
+@@ -1136,7 +1147,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+ 
+                     if (stype->preserve) {
+                         if (stype->map_count != dtype->map_count &&
+-                            dtype->map_count && dtype->preserve) {
++                            dtype->map_count && dtype->preserve &&
++                            i < dst->map->num_types) {
+                             tmp = xrealloc(dtype->preserve,
+                                            stype->map_count *
+                                              sizeof(XkbModsRec));
+@@ -1144,7 +1156,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+                                 return FALSE;
+                             dtype->preserve = tmp;
+                         }
+-                        else if (!dtype->preserve || !dtype->map_count) {
++                        else if (!dtype->preserve || !dtype->map_count ||
++                                 i >= dst->map->num_types) {
+                             tmp = xalloc(stype->map_count *
+                                          sizeof(XkbModsRec));
+                             if (!tmp)
+@@ -1179,14 +1192,14 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+                         xfree(dtype->level_names);
+                     if (dtype->map && dtype->map_count)
+                         xfree(dtype->map);
+-                    if (dtype->preserve && dtype->preserve)
++                    if (dtype->preserve && dtype->map_count)
+                         xfree(dtype->preserve);
+                 }
+                 xfree(dst->map->types);
+                 dst->map->types = NULL;
+             }
+         }
+-        dst->map->size_types = src->map->size_types;
++        dst->map->size_types = src->map->num_types;
+         dst->map->num_types = src->map->num_types;
+ 
+         if (src->map->modmap) {
+@@ -1957,7 +1970,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+             dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
+         }
+         else {
+-            if (dst->geom->sz_key_aliases) {
++            if (dst->geom->sz_key_aliases && dst->geom->key_aliases) {
+                 xfree(dst->geom->key_aliases);
+                 dst->geom->key_aliases = NULL;
+             }
+@@ -1967,13 +1980,16 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
+         
+         /* font */
+         if (src->geom->label_font) {
+-            if (strlen(src->geom->label_font) !=
++            if (!dst->geom->label_font) {
++                tmp = xalloc(strlen(src->geom->label_font));
++                if (!tmp)
++                    return FALSE;
++                dst->geom->label_font = tmp;
++            }
++            else if (strlen(src->geom->label_font) !=
+                 strlen(dst->geom->label_font)) {
+-                if (dst->geom->label_font)
+-                    tmp = xrealloc(dst->geom->label_font,
+-                                   strlen(src->geom->label_font));
+-                else
+-                    tmp = xalloc(strlen(src->geom->label_font));
++                tmp = xrealloc(dst->geom->label_font,
++                               strlen(src->geom->label_font));
+                 if (!tmp)
+                     return FALSE;
+                 dst->geom->label_font = tmp;
================================================================


More information about the pld-cvs-commit mailing list