[PATCH] randr: stop clients from deleting immutable output properties
Daniel Stone
daniel at fooishbar.org
Wed Aug 10 05:44:57 PDT 2011
On Wed, Aug 10, 2011 at 01:06:33PM +0200, Luc Verhaegen wrote:
> Immutable in randr means that clients are not able to alter the
> property itself, they are only allowed to alter the property value.
> This logically means that the property then should not be deleted
> by the client either.
Instead of inlining RRDeleteOutputProperty here, you could do something
like this.
Cheers,
Daniel
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index c2814d4..481cabb 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -2920,7 +2920,7 @@ xf86OutputSetEDIDProperty (xf86OutputPtr output, void *data, int data_len)
RRChangeOutputProperty(output->randr_output, edid_atom, XA_INTEGER, 8,
PropModeReplace, data_len, data, FALSE, TRUE);
} else {
- RRDeleteOutputProperty(output->randr_output, edid_atom);
+ RRDeleteOutputProperty(output->randr_output, edid_atom, TRUE);
}
}
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 80aed68..504aacf 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -860,8 +860,8 @@ RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending);
extern RRPropertyPtr
RRQueryOutputProperty (RROutputPtr output, Atom property);
-extern void
-RRDeleteOutputProperty (RROutputPtr output, Atom property);
+extern int
+RRDeleteOutputProperty (RROutputPtr output, Atom property, Bool force);
extern Bool
RRPostPendingProperties (RROutputPtr output);
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index ba04c16..0805d28 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -118,16 +118,27 @@ RRCreateOutputProperty (Atom property)
return prop;
}
-void
-RRDeleteOutputProperty(RROutputPtr output, Atom property)
+/**
+ * Deletes a property on the specified output.
+ *
+ * @param force If TRUE, will also delete immutable properties.
+ * @ret Success, or an X error code.
+ */
+int
+RRDeleteOutputProperty(RROutputPtr output, Atom property, Bool force)
{
RRPropertyRec *prop, **prev;
+ if (!ValidAtom(property))
+ return BadAtom;
+
for (prev = &output->properties; (prop = *prev); prev = &(prop->next))
if (prop->propertyName == property) {
*prev = prop->next;
+ if (prop->immutable && !force)
+ return BadAccess;
RRDeleteProperty(output, prop);
- return;
+ return Success;
}
}
@@ -552,20 +563,16 @@ ProcRRDeleteOutputProperty (ClientPtr client)
{
REQUEST(xRRDeleteOutputPropertyReq);
RROutputPtr output;
-
+ int ret;
+
REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
UpdateCurrentTime();
VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
-
- if (!ValidAtom(stuff->property))
- {
- client->errorValue = stuff->property;
- return BadAtom;
- }
-
- RRDeleteOutputProperty(output, stuff->property);
- return Success;
+ ret = RRDeleteOutputProperty(output, stuff->property, FALSE);
+ if (ret != Success)
+ client->errorValue = stuff->property;
+ return ret;
}
int
More information about the xorg-devel
mailing list