Module Name:    xsrc
Committed By:   mrg
Date:           Sun Mar  9 05:27:57 UTC 2025

Modified Files:
        xsrc/external/mit/libXrender/dist/src: Xrender.c

Log Message:
merge libXrender 0.9.12.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/libXrender/dist/src/Xrender.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/libXrender/dist/src/Xrender.c
diff -u xsrc/external/mit/libXrender/dist/src/Xrender.c:1.5 xsrc/external/mit/libXrender/dist/src/Xrender.c:1.6
--- xsrc/external/mit/libXrender/dist/src/Xrender.c:1.5	Sat Oct 29 21:02:04 2022
+++ xsrc/external/mit/libXrender/dist/src/Xrender.c	Sun Mar  9 05:27:57 2025
@@ -294,11 +294,21 @@ XRenderFindDisplay (Display *dpy)
     return dpyinfo;
 }
 
+static void
+XRenderFreeXRenderInfo (XRenderInfo *xri)
+{
+    Xfree(xri->format);
+    Xfree(xri->screen);
+    Xfree(xri->depth);
+    Xfree(xri->visual);
+    Xfree(xri);
+}
+
 static int
 XRenderCloseDisplay (Display *dpy, XExtCodes *codes _X_UNUSED)
 {
     XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy);
-    if (info && info->info) XFree (info->info);
+    if (info && info->info) XRenderFreeXRenderInfo (info->info);
 
     return XRenderExtRemoveDisplay (&XRenderExtensionInfo, dpy);
 }
@@ -469,11 +479,8 @@ XRenderQueryFormats (Display *dpy)
 	(rep.numVisuals < ((INT_MAX / 4) / sizeof (XRenderVisual))) &&
 	(rep.numSubpixel < ((INT_MAX / 4) / 4)) &&
 	(rep.length < (INT_MAX >> 2)) ) {
-	xri = Xmalloc (sizeof (XRenderInfo) +
-		       (rep.numFormats * sizeof (XRenderPictFormat)) +
-		       (rep.numScreens * sizeof (XRenderScreen)) +
-		       (rep.numDepths * sizeof (XRenderDepth)) +
-		       (rep.numVisuals * sizeof (XRenderVisual)));
+        /* Zero-initialize so that pointers are NULL if there is a failure. */
+	xri = Xcalloc (1, sizeof (XRenderInfo));
 	rlength = ((rep.numFormats * sizeof (xPictFormInfo)) +
 		   (rep.numScreens * sizeof (xPictScreen)) +
 		   (rep.numDepths * sizeof (xPictDepth)) +
@@ -498,14 +505,23 @@ XRenderQueryFormats (Display *dpy)
     }
     xri->major_version = async_state.major_version;
     xri->minor_version = async_state.minor_version;
-    xri->format = (XRenderPictFormat *) (xri + 1);
+    xri->format = Xcalloc(rep.numFormats, sizeof(XRenderPictFormat));
     xri->nformat = (int) rep.numFormats;
-    xri->screen = (XRenderScreen *) (xri->format + rep.numFormats);
+    xri->screen = Xcalloc(rep.numScreens, sizeof(XRenderScreen));
     xri->nscreen = (int) rep.numScreens;
-    xri->depth = (XRenderDepth *) (xri->screen + rep.numScreens);
+    xri->depth = Xcalloc(rep.numDepths, sizeof(XRenderDepth));
     xri->ndepth = (int) rep.numDepths;
-    xri->visual = (XRenderVisual *) (xri->depth + rep.numDepths);
+    xri->visual = Xcalloc(rep.numVisuals, sizeof(XRenderVisual));
     xri->nvisual = (int) rep.numVisuals;
+    if (!xri->format || !xri->screen || !xri->depth || !xri->visual)
+    {
+	XRenderFreeXRenderInfo(xri);
+	Xfree (xData);
+	_XEatDataWords (dpy, rep.length);
+	UnlockDisplay (dpy);
+	SyncHandle ();
+	return 0;
+    }
     _XRead (dpy, (char *) xData, (long) rlength);
     format = xri->format;
     xFormat = (xPictFormInfo *) xData;
@@ -538,7 +554,7 @@ XRenderQueryFormats (Display *dpy)
 	screen->subpixel = SubPixelUnknown;
 	xPDepth = (xPictDepth *) (xScreen + 1);
 	if (screen->ndepths > rep.numDepths) {
-	    Xfree (xri);
+	    XRenderFreeXRenderInfo(xri);
 	    Xfree (xData);
 	    _XEatDataWords (dpy, rep.length);
 	    UnlockDisplay (dpy);
@@ -555,7 +571,7 @@ XRenderQueryFormats (Display *dpy)
 	    depth->visuals = visual;
 	    xVisual = (xPictVisual *) (xPDepth + 1);
 	    if (depth->nvisuals > rep.numVisuals) {
-		Xfree (xri);
+		XRenderFreeXRenderInfo (xri);
 		Xfree (xData);
 		_XEatDataWords (dpy, rep.length);
 		UnlockDisplay (dpy);

Reply via email to