Module Name: xsrc
Committed By: martin
Date: Wed Feb 11 14:53:21 UTC 2015
Modified Files:
xsrc/external/mit/xorg-server/dist/xkb [netbsd-6-1]: xkb.c
xsrc/xfree/xc/programs/Xserver/xkb [netbsd-6-1]: xkb.c
Log Message:
Pull up following revision(s) (requested by mrg in ticket #1253):
external/mit/xorg-server/dist/xkb/xkb.c: revision 1.2
xfree/xc/programs/Xserver/xkb/xkb.c: revision 1.2
apply fixes for CVE-2015-0255:
Information leak in the XkbSetGeometry request of X servers
http://www.x.org/wiki/Development/Security/Advisory-2015-02-10/
ported to xorg-server 1.10 and xfree myself.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.6 -r1.1.1.6.6.1 \
xsrc/external/mit/xorg-server/dist/xkb/xkb.c
cvs rdiff -u -r1.1.1.6 -r1.1.1.6.32.1 \
xsrc/xfree/xc/programs/Xserver/xkb/xkb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/xorg-server/dist/xkb/xkb.c
diff -u xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.1.1.6 xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.1.1.6.6.1
--- xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.1.1.6 Tue Aug 2 06:57:06 2011
+++ xsrc/external/mit/xorg-server/dist/xkb/xkb.c Wed Feb 11 14:53:21 2015
@@ -4839,27 +4839,30 @@ ProcXkbGetGeometry(ClientPtr client)
/***====================================================================***/
-static char *
-_GetCountedString(char **wire_inout,Bool swap)
+static Status
+_GetCountedString(char **wire_inout, ClientPtr client, char **str)
{
-char * wire,*str;
-CARD16 len,*plen;
+ char *wire, *next;
+ CARD16 len;
- wire= *wire_inout;
- plen= (CARD16 *)wire;
- if (swap) {
- register int n;
- swaps(plen,n);
- }
- len= *plen;
- str= malloc(len+1);
- if (str) {
- memcpy(str,&wire[2],len);
- str[len]= '\0';
+ wire = *wire_inout;
+ len = *(CARD16 *) wire;
+ if (client->swapped) {
+ int n;
+ swaps(&len, n);
}
- wire+= XkbPaddedSize(len+2);
- *wire_inout= wire;
- return str;
+ next = wire + XkbPaddedSize(len + 2);
+ /* Check we're still within the size of the request */
+ if (client->req_len <
+ bytes_to_int32(next - (char *) client->requestBuffer))
+ return BadValue;
+ *str = malloc(len + 1);
+ if (!*str)
+ return BadAlloc;
+ memcpy(*str, &wire[2], len);
+ *(*str + len) = '\0';
+ *wire_inout = next;
+ return Success;
}
static Status
@@ -4871,6 +4874,7 @@ _CheckSetDoodad( char ** wire_inout,
char * wire;
xkbDoodadWireDesc * dWire;
XkbDoodadPtr doodad;
+ Status status;
dWire= (xkbDoodadWireDesc *)(*wire_inout);
wire= (char *)&dWire[1];
@@ -4920,8 +4924,14 @@ XkbDoodadPtr doodad;
doodad->text.width= dWire->text.width;
doodad->text.height= dWire->text.height;
doodad->text.color_ndx= dWire->text.colorNdx;
- doodad->text.text= _GetCountedString(&wire,client->swapped);
- doodad->text.font= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &doodad->text.text);
+ if (status != Success)
+ return status;
+ status = _GetCountedString(&wire, client, &doodad->text.font);
+ if (status != Success) {
+ free (doodad->text.text);
+ return status;
+ }
break;
case XkbIndicatorDoodad:
if (dWire->indicator.onColorNdx>=geom->num_colors) {
@@ -4956,7 +4966,9 @@ XkbDoodadPtr doodad;
}
doodad->logo.color_ndx= dWire->logo.colorNdx;
doodad->logo.shape_ndx= dWire->logo.shapeNdx;
- doodad->logo.logo_name= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &doodad->logo.logo_name);
+ if (status != Success)
+ return status;
break;
default:
client->errorValue= _XkbErrCode2(0x4F,dWire->any.type);
@@ -5191,17 +5203,20 @@ Status status;
char * wire;
wire= (char *)&req[1];
- geom->label_font= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &geom->label_font);
+ if (status != Success)
+ return status;
+
+ for (i = 0; i < req->nProperties; i++) {
+ char *name, *val;
- for (i=0;i<req->nProperties;i++) {
- char *name,*val;
- name= _GetCountedString(&wire,client->swapped);
- if (!name)
- return BadAlloc;
- val= _GetCountedString(&wire,client->swapped);
- if (!val) {
+ status = _GetCountedString(&wire, client, &name);
+ if (status != Success)
+ return status;
+ status = _GetCountedString(&wire, client, &val);
+ if (status != Success) {
free(name);
- return BadAlloc;
+ return status;
}
if (XkbAddGeomProperty(geom,name,val)==NULL) {
free(name);
@@ -5230,11 +5245,11 @@ char * wire;
return BadMatch;
}
- for (i=0;i<req->nColors;i++) {
+ for (i = 0; i < req->nColors; i++) {
char *name;
- name= _GetCountedString(&wire,client->swapped);
- if (!name)
- return BadAlloc;
+ status = _GetCountedString(&wire, client, &name);
+ if (status != Success)
+ return status;
if (!XkbAddGeomColor(geom,name,geom->num_colors)) {
free(name);
return BadAlloc;
Index: xsrc/xfree/xc/programs/Xserver/xkb/xkb.c
diff -u xsrc/xfree/xc/programs/Xserver/xkb/xkb.c:1.1.1.6 xsrc/xfree/xc/programs/Xserver/xkb/xkb.c:1.1.1.6.32.1
--- xsrc/xfree/xc/programs/Xserver/xkb/xkb.c:1.1.1.6 Fri Mar 5 14:29:44 2004
+++ xsrc/xfree/xc/programs/Xserver/xkb/xkb.c Wed Feb 11 14:53:21 2015
@@ -4434,27 +4434,30 @@ ProcXkbGetGeometry(ClientPtr client)
/***====================================================================***/
-static char *
-_GetCountedString(char **wire_inout,Bool swap)
+static Status
+_GetCountedString(char **wire_inout, ClientPtr client, char **str)
{
-char * wire,*str;
-CARD16 len,*plen;
+ char *wire, *next;
+ CARD16 len;
- wire= *wire_inout;
- plen= (CARD16 *)wire;
- if (swap) {
- register int n;
- swaps(plen,n);
- }
- len= *plen;
- str= (char *)_XkbAlloc(len+1);
- if (str) {
- memcpy(str,&wire[2],len);
- str[len]= '\0';
+ wire = *wire_inout;
+ len = *(CARD16 *) wire;
+ if (client->swapped) {
+ int n;
+ swaps(&len, n);
}
- wire+= XkbPaddedSize(len+2);
- *wire_inout= wire;
- return str;
+ next = wire + XkbPaddedSize(len + 2);
+ /* Check we're still within the size of the request */
+ if (client->req_len <
+ bytes_to_int32(next - (char *) client->requestBuffer))
+ return BadValue;
+ *str = malloc(len + 1);
+ if (!*str)
+ return BadAlloc;
+ memcpy(*str, &wire[2], len);
+ *(*str + len) = '\0';
+ *wire_inout = next;
+ return Success;
}
static Status
@@ -4466,6 +4469,7 @@ _CheckSetDoodad( char ** wire_inout,
char * wire;
xkbDoodadWireDesc * dWire;
XkbDoodadPtr doodad;
+ Status status;
dWire= (xkbDoodadWireDesc *)(*wire_inout);
wire= (char *)&dWire[1];
@@ -4515,8 +4519,14 @@ XkbDoodadPtr doodad;
doodad->text.width= dWire->text.width;
doodad->text.height= dWire->text.height;
doodad->text.color_ndx= dWire->text.colorNdx;
- doodad->text.text= _GetCountedString(&wire,client->swapped);
- doodad->text.font= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &doodad->text.text);
+ if (status != Success)
+ return status;
+ status = _GetCountedString(&wire, client, &doodad->text.font);
+ if (status != Success) {
+ free (doodad->text.text);
+ return status;
+ }
break;
case XkbIndicatorDoodad:
if (dWire->indicator.onColorNdx>=geom->num_colors) {
@@ -4551,7 +4561,9 @@ XkbDoodadPtr doodad;
}
doodad->logo.color_ndx= dWire->logo.colorNdx;
doodad->logo.shape_ndx= dWire->logo.shapeNdx;
- doodad->logo.logo_name= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &doodad->logo.logo_name);
+ if (status != Success)
+ return status;
break;
default:
client->errorValue= _XkbErrCode2(0x4F,dWire->any.type);
@@ -4786,14 +4798,26 @@ Status status;
char * wire;
wire= (char *)&req[1];
- geom->label_font= _GetCountedString(&wire,client->swapped);
+ status = _GetCountedString(&wire, client, &geom->label_font);
+ if (status != Success)
+ return status;
- for (i=0;i<req->nProperties;i++) {
+ for (i = 0; i < req->nProperties; i++) {
char *name,*val;
- name= _GetCountedString(&wire,client->swapped);
- val= _GetCountedString(&wire,client->swapped);
- if ((!name)||(!val)||(XkbAddGeomProperty(geom,name,val)==NULL))
+
+ status = _GetCountedString(&wire, client, &name);
+ if (status != Success)
+ return status;
+ status = _GetCountedString(&wire, client, &val);
+ if (status != Success) {
+ free(name);
+ return status;
+ }
+ if (XkbAddGeomProperty(geom,name,val)==NULL) {
+ free(val);
+ free(name);
return BadAlloc;
+ }
}
if (req->nColors<2) {
@@ -4814,11 +4838,15 @@ char * wire;
return BadMatch;
}
- for (i=0;i<req->nColors;i++) {
+ for (i = 0; i < req->nColors; i++) {
char *name;
- name= _GetCountedString(&wire,client->swapped);
- if ((!name)||(!XkbAddGeomColor(geom,name,geom->num_colors)))
+ status = _GetCountedString(&wire, client, &name);
+ if (status != Success)
+ return status;
+ if (!XkbAddGeomColor(geom,name,geom->num_colors)) {
+ free(name);
return BadAlloc;
+ }
}
if (req->nColors!=geom->num_colors) {
client->errorValue= _XkbErrCode3(0x05,req->nColors,geom->num_colors);