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);