From 8731afa88abd72b4c3b6185be9266f131c98efe1 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 23 Feb 2022 16:35:15 -0500 Subject: [PATCH] Enable hardened build --- .xorg-x11-drv-fbdev.metadata | 1 + 0001-mustard-Enable-linking-with-z-now.patch | 409 +++++++++++++++++++ BGNoneRoot.patch | 2 +- xorg-x11-drv-fbdev.spec | 10 +- 4 files changed, 418 insertions(+), 4 deletions(-) create mode 100644 .xorg-x11-drv-fbdev.metadata create mode 100644 0001-mustard-Enable-linking-with-z-now.patch diff --git a/.xorg-x11-drv-fbdev.metadata b/.xorg-x11-drv-fbdev.metadata new file mode 100644 index 0000000..743dfe9 --- /dev/null +++ b/.xorg-x11-drv-fbdev.metadata @@ -0,0 +1 @@ +8d79ec615cb54436ff96dc94b74775db6dc47aff xf86-video-fbdev-0.5.0.tar.bz2 diff --git a/0001-mustard-Enable-linking-with-z-now.patch b/0001-mustard-Enable-linking-with-z-now.patch new file mode 100644 index 0000000..a11fa20 --- /dev/null +++ b/0001-mustard-Enable-linking-with-z-now.patch @@ -0,0 +1,409 @@ +From 9a151d87fb084a914ad76f77be78f720448fa201 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 25 Jan 2022 13:37:14 -0500 +Subject: [PATCH xf86-video-fbdev] mustard: Enable linking with -z now + +The xfree86 design loads the fb, fbdev, and shadow modules _after_ the +driver is loaded, which means we need to dlsym^WLoaderSymbol for the API +we need ourselves. +--- + src/fbdev.c | 152 ++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 113 insertions(+), 39 deletions(-) + +diff --git a/src/fbdev.c b/src/fbdev.c +index e4f66a2..ee3a716 100644 +--- a/src/fbdev.c ++++ b/src/fbdev.c +@@ -77,6 +77,75 @@ static Bool FBDevDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, + + enum { FBDEV_ROTATE_NONE=0, FBDEV_ROTATE_CW=270, FBDEV_ROTATE_UD=180, FBDEV_ROTATE_CCW=90 }; + ++static typeof(fbdevHWAdjustFrame) *my_fbdevHWAdjustFrame; ++static typeof(fbdevHWDPMSSet) *my_fbdevHWDPMSSet; ++static typeof(fbdevHWEnterVT) *my_fbdevHWEnterVT; ++static typeof(fbdevHWGetDepth) *my_fbdevHWGetDepth; ++static typeof(fbdevHWGetLineLength) *my_fbdevHWGetLineLength; ++static typeof(fbdevHWGetName) *my_fbdevHWGetName; ++static typeof(fbdevHWGetType) *my_fbdevHWGetType; ++static typeof(fbdevHWGetVidmem) *my_fbdevHWGetVidmem; ++static typeof(fbdevHWInit) *my_fbdevHWInit; ++static typeof(fbdevHWLeaveVT) *my_fbdevHWLeaveVT; ++static typeof(fbdevHWLinearOffset) *my_fbdevHWLinearOffset; ++static typeof(fbdevHWLoadPalette) *my_fbdevHWLoadPalette; ++static typeof(fbdevHWMapVidmem) *my_fbdevHWMapVidmem; ++static typeof(fbdevHWModeInit) *my_fbdevHWModeInit; ++static typeof(fbdevHWProbe) *my_fbdevHWProbe; ++static typeof(fbdevHWRestore) *my_fbdevHWRestore; ++static typeof(fbdevHWSave) *my_fbdevHWSave; ++static typeof(fbdevHWSaveScreen) *my_fbdevHWSaveScreen; ++static typeof(fbdevHWSetVideoModes) *my_fbdevHWSetVideoModes; ++static typeof(fbdevHWSwitchMode) *my_fbdevHWSwitchMode; ++static typeof(fbdevHWUnmapVidmem) *my_fbdevHWUnmapVidmem; ++static typeof(fbdevHWUseBuildinMode) *my_fbdevHWUseBuildinMode; ++static typeof(fbdevHWValidMode) *my_fbdevHWValidMode; ++ ++static void ++bind_fbdevhw(void) ++{ ++ my_fbdevHWAdjustFrame = LoaderSymbol("fbdevHWAdjustFrame"); ++ my_fbdevHWDPMSSet = LoaderSymbol("fbdevHWDPMSSet"); ++ my_fbdevHWEnterVT = LoaderSymbol("fbdevHWEnterVT"); ++ my_fbdevHWGetDepth = LoaderSymbol("fbdevHWGetDepth"); ++ my_fbdevHWGetLineLength = LoaderSymbol("fbdevHWGetLineLength"); ++ my_fbdevHWGetName = LoaderSymbol("fbdevHWGetName"); ++ my_fbdevHWGetType = LoaderSymbol("fbdevHWGetType"); ++ my_fbdevHWGetVidmem = LoaderSymbol("fbdevHWGetVidmem"); ++ my_fbdevHWInit = LoaderSymbol("fbdevHWInit"); ++ my_fbdevHWLeaveVT = LoaderSymbol("fbdevHWLeaveVT"); ++ my_fbdevHWLinearOffset = LoaderSymbol("fbdevHWLinearOffset"); ++ my_fbdevHWLoadPalette = LoaderSymbol("fbdevHWLoadPalette"); ++ my_fbdevHWMapVidmem = LoaderSymbol("fbdevHWMapVidmem"); ++ my_fbdevHWModeInit = LoaderSymbol("fbdevHWModeInit"); ++ my_fbdevHWProbe = LoaderSymbol("fbdevHWProbe"); ++ my_fbdevHWRestore = LoaderSymbol("fbdevHWRestore"); ++ my_fbdevHWSave = LoaderSymbol("fbdevHWSave"); ++ my_fbdevHWSaveScreen = LoaderSymbol("fbdevHWSaveScreen"); ++ my_fbdevHWSetVideoModes = LoaderSymbol("fbdevHWSetVideoModes"); ++ my_fbdevHWSwitchMode = LoaderSymbol("fbdevHWSwitchMode"); ++ my_fbdevHWUnmapVidmem = LoaderSymbol("fbdevHWUnmapVidmem"); ++ my_fbdevHWUseBuildinMode = LoaderSymbol("fbdevHWUseBuildinMode"); ++ my_fbdevHWValidMode = LoaderSymbol("fbdevHWValidMode"); ++} ++ ++static typeof(shadowAdd) *my_shadowAdd; ++static typeof(shadowRemove) *my_shadowRemove; ++static typeof(shadowSetup) *my_shadowSetup; ++static typeof(shadowUpdate32to24) *my_shadowUpdate32to24; ++static typeof(shadowUpdatePacked) *my_shadowUpdatePacked; ++static typeof(shadowUpdateRotatePacked) *my_shadowUpdateRotatePacked; ++ ++static void ++bind_shadow(void) ++{ ++ my_shadowAdd = LoaderSymbol("shadowAdd"); ++ my_shadowRemove = LoaderSymbol("shadowRemove"); ++ my_shadowSetup = LoaderSymbol("shadowSetup"); ++ my_shadowUpdate32to24 = LoaderSymbol("shadowUpdate32to24"); ++ my_shadowUpdatePacked = LoaderSymbol("shadowUpdatePacked"); ++ my_shadowUpdateRotatePacked = LoaderSymbol("shadowUpdateRotatePacked"); ++} + + /* -------------------------------------------------------------------- */ + +@@ -235,31 +304,31 @@ FBDevIdentify(int flags) + static Bool + fbdevSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode) + { +- return fbdevHWSwitchMode(pScrn, mode); ++ return my_fbdevHWSwitchMode(pScrn, mode); + } + + static void + fbdevAdjustFrame(ScrnInfoPtr pScrn, int x, int y) + { +- fbdevHWAdjustFrame(pScrn, x, y); ++ my_fbdevHWAdjustFrame(pScrn, x, y); + } + + static Bool + fbdevEnterVT(ScrnInfoPtr pScrn) + { +- return fbdevHWEnterVT(pScrn); ++ return my_fbdevHWEnterVT(pScrn); + } + + static void + fbdevLeaveVT(ScrnInfoPtr pScrn) + { +- fbdevHWLeaveVT(pScrn); ++ my_fbdevHWLeaveVT(pScrn); + } + + static ModeStatus + fbdevValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool verbose, int flags) + { +- return fbdevHWValidMode(pScrn, mode, verbose, flags); ++ return my_fbdevHWValidMode(pScrn, mode, verbose, flags); + } + + #ifdef XSERVER_LIBPCIACCESS +@@ -270,6 +339,7 @@ static Bool FBDevPciProbe(DriverPtr drv, int entity_num, + + if (!xf86LoadDrvSubModule(drv, "fbdevhw")) + return FALSE; ++ bind_fbdevhw(); + + pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, NULL, + NULL, NULL, NULL, NULL); +@@ -279,7 +349,7 @@ static Bool FBDevPciProbe(DriverPtr drv, int entity_num, + pScrn->entityInstanceList[0]); + + device = xf86FindOptionValue(devSection->options, "fbdev"); +- if (fbdevHWProbe(dev, device, NULL)) { ++ if (my_fbdevHWProbe(dev, device, NULL)) { + pScrn->driverVersion = FBDEV_VERSION; + pScrn->driverName = FBDEV_DRIVER_NAME; + pScrn->name = FBDEV_NAME; +@@ -332,7 +402,8 @@ FBDevProbe(DriverPtr drv, int flags) + + if (!xf86LoadDrvSubModule(drv, "fbdevhw")) + return FALSE; +- ++ bind_fbdevhw(); ++ + for (i = 0; i < numDevSections; i++) { + Bool isIsa = FALSE; + Bool isPci = FALSE; +@@ -355,7 +426,7 @@ FBDevProbe(DriverPtr drv, int flags) + 0; + + } +- if (fbdevHWProbe(NULL,dev,NULL)) { ++ if (my_fbdevHWProbe(NULL,dev,NULL)) { + pScrn = NULL; + if (isPci) { + #ifndef XSERVER_LIBPCIACCESS +@@ -459,11 +530,11 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + pci_dev = fPtr->pEnt->location.id.pci; + #endif + /* open device */ +- if (!fbdevHWInit(pScrn, pci_dev, ++ if (!my_fbdevHWInit(pScrn, pci_dev, + xf86FindOptionValue(fPtr->pEnt->device->options, + "fbdev"))) + return FALSE; +- default_depth = fbdevHWGetDepth(pScrn,&fbbpp); ++ default_depth = my_fbdevHWGetDepth(pScrn,&fbbpp); + + if (default_depth == 8) do { + /* trust the command line */ +@@ -531,10 +602,10 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + pScrn->progClock = TRUE; + pScrn->rgbBits = 8; + pScrn->chipset = "fbdev"; +- pScrn->videoRam = fbdevHWGetVidmem(pScrn); ++ pScrn->videoRam = my_fbdevHWGetVidmem(pScrn); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "hardware: %s (video memory:" +- " %dkB)\n", fbdevHWGetName(pScrn), pScrn->videoRam/1024); ++ " %dkB)\n", my_fbdevHWGetName(pScrn), pScrn->videoRam/1024); + + /* handle options */ + xf86CollectOptions(pScrn, NULL); +@@ -591,7 +662,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + /* select video modes */ + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "checking modes against framebuffer device...\n"); +- fbdevHWSetVideoModes(pScrn); ++ my_fbdevHWSetVideoModes(pScrn); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "checking modes against monitor...\n"); + { +@@ -606,7 +677,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + } + + if (NULL == pScrn->modes) +- fbdevHWUseBuildinMode(pScrn); ++ my_fbdevHWUseBuildinMode(pScrn); + pScrn->currentMode = pScrn->modes; + + /* First approximation, may be refined in ScreenInit */ +@@ -618,7 +689,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + xf86SetDpi(pScrn, 0, 0); + + /* Load bpp-specific modules */ +- switch ((type = fbdevHWGetType(pScrn))) ++ switch ((type = my_fbdevHWGetType(pScrn))) + { + case FBDEVHW_PACKED_PIXELS: + switch (pScrn->bitsPerPixel) +@@ -671,6 +742,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) + FBDevFreeRec(pScrn); + return FALSE; + } ++ bind_shadow(); + } + + TRACE_EXIT("PreInit"); +@@ -681,20 +753,20 @@ static void + fbdevUpdate32to24(ScreenPtr pScreen, shadowBufPtr pBuf) + { + #ifdef HAVE_SHADOW_3224 +- shadowUpdate32to24(pScreen, pBuf); ++ my_shadowUpdate32to24(pScreen, pBuf); + #endif + } + + static void + fbdevUpdateRotatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) + { +- shadowUpdateRotatePacked(pScreen, pBuf); ++ my_shadowUpdateRotatePacked(pScreen, pBuf); + } + + static void + fbdevUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) + { +- shadowUpdatePacked(pScreen, pBuf); ++ my_shadowUpdatePacked(pScreen, pBuf); + } + + static Bool +@@ -722,7 +794,7 @@ FBDevCreateScreenResources(ScreenPtr pScreen) + else + update = fbdevUpdatePacked; + +- if (!shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate, ++ if (!my_shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate, + NULL)) { + return FALSE; + } +@@ -736,7 +808,7 @@ FBDevShadowInit(ScreenPtr pScreen) + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + FBDevPtr fPtr = FBDEVPTR(pScrn); + +- if (!shadowSetup(pScreen)) { ++ if (!my_shadowSetup(pScreen)) { + return FALSE; + } + +@@ -749,19 +821,19 @@ FBDevShadowInit(ScreenPtr pScreen) + static void + fbdevLoadPalette(ScrnInfoPtr pScrn, int num, int *i, LOCO *col, VisualPtr pVis) + { +- fbdevHWLoadPalette(pScrn, num, i, col, pVis); ++ my_fbdevHWLoadPalette(pScrn, num, i, col, pVis); + } + + static void + fbdevDPMSSet(ScrnInfoPtr pScrn, int mode, int flags) + { +- fbdevHWDPMSSet(pScrn, mode, flags); ++ my_fbdevHWDPMSSet(pScrn, mode, flags); + } + + static Bool + fbdevSaveScreen(ScreenPtr pScreen, int mode) + { +- return fbdevHWSaveScreen(pScreen, mode); ++ return my_fbdevHWSaveScreen(pScreen, mode); + } + + static Bool +@@ -773,6 +845,8 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + int init_picture = 0; + int ret, flags; + int type; ++ typeof(fbScreenInit) *my_fbScreenInit = LoaderSymbol("fbScreenInit"); ++ typeof(fbPictureInit) *my_fbPictureInit = LoaderSymbol("fbPictureInit"); + + TRACE_ENTER("FBDevScreenInit"); + +@@ -786,21 +860,21 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue); + #endif + +- if (NULL == (fPtr->fbmem = fbdevHWMapVidmem(pScrn))) { ++ if (NULL == (fPtr->fbmem = my_fbdevHWMapVidmem(pScrn))) { + xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mapping of video memory" + " failed\n"); + return FALSE; + } +- fPtr->fboff = fbdevHWLinearOffset(pScrn); ++ fPtr->fboff = my_fbdevHWLinearOffset(pScrn); + +- fbdevHWSave(pScrn); ++ my_fbdevHWSave(pScrn); + +- if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) { ++ if (!my_fbdevHWModeInit(pScrn, pScrn->currentMode)) { + xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mode initialization failed\n"); + return FALSE; + } +- fbdevHWSaveScreen(pScreen, SCREEN_SAVER_ON); +- fbdevHWAdjustFrame(ADJUST_FRAME_ARGS(pScrn, 0, 0)); ++ my_fbdevHWSaveScreen(pScreen, SCREEN_SAVER_ON); ++ my_fbdevHWAdjustFrame(ADJUST_FRAME_ARGS(pScrn, 0, 0)); + + /* mi layer */ + miClearVisualTypes(); +@@ -834,7 +908,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + } else if (!fPtr->shadowFB) { + /* FIXME: this doesn't work for all cases, e.g. when each scanline + has a padding which is independent from the depth (controlfb) */ +- pScrn->displayWidth = fbdevHWGetLineLength(pScrn) / ++ pScrn->displayWidth = my_fbdevHWGetLineLength(pScrn) / + (pScrn->bitsPerPixel / 8); + + if (pScrn->displayWidth != pScrn->virtualX) { +@@ -862,7 +936,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + } + } + +- switch ((type = fbdevHWGetType(pScrn))) ++ switch ((type = my_fbdevHWGetType(pScrn))) + { + case FBDEVHW_PACKED_PIXELS: + switch (pScrn->bitsPerPixel) { +@@ -870,7 +944,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + case 16: + case 24: + case 32: +- ret = fbScreenInit(pScreen, fPtr->shadowFB ? fPtr->shadow ++ ret = my_fbScreenInit(pScreen, fPtr->shadowFB ? fPtr->shadow + : fPtr->fbstart, pScrn->virtualX, + pScrn->virtualY, pScrn->xDpi, + pScrn->yDpi, pScrn->displayWidth, +@@ -935,7 +1009,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + } + + /* must be after RGB ordering fixed */ +- if (init_picture && !fbPictureInit(pScreen, NULL, 0)) ++ if (init_picture && !my_fbPictureInit(pScreen, NULL, 0)) + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Render extension initialisation failed\n"); + +@@ -966,7 +1040,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + + /* colormap */ +- switch ((type = fbdevHWGetType(pScrn))) ++ switch ((type = my_fbdevHWGetType(pScrn))) + { + /* XXX It would be simpler to use miCreateDefColormap() in all cases. */ + case FBDEVHW_PACKED_PIXELS: +@@ -1032,10 +1106,10 @@ FBDevCloseScreen(CLOSE_SCREEN_ARGS_DECL) + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + FBDevPtr fPtr = FBDEVPTR(pScrn); + +- fbdevHWRestore(pScrn); +- fbdevHWUnmapVidmem(pScrn); ++ my_fbdevHWRestore(pScrn); ++ my_fbdevHWUnmapVidmem(pScrn); + if (fPtr->shadow) { +- shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); ++ my_shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); + free(fPtr->shadow); + fPtr->shadow = NULL; + } +@@ -1070,7 +1144,7 @@ FBDevWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, + if (fPtr->lineLength) + *size = fPtr->lineLength; + else +- *size = fPtr->lineLength = fbdevHWGetLineLength(pScrn); ++ *size = fPtr->lineLength = my_fbdevHWGetLineLength(pScrn); + + return ((CARD8 *)fPtr->fbstart + row * fPtr->lineLength + offset); + } +@@ -1225,7 +1299,7 @@ FBDevDGAAddModes(ScrnInfoPtr pScrn) + if (fPtr->lineLength) + pDGAMode->bytesPerScanline = fPtr->lineLength; + else +- pDGAMode->bytesPerScanline = fPtr->lineLength = fbdevHWGetLineLength(pScrn); ++ pDGAMode->bytesPerScanline = fPtr->lineLength = my_fbdevHWGetLineLength(pScrn); + + pDGAMode->imageWidth = pMode->HDisplay; + pDGAMode->imageHeight = pMode->VDisplay; +-- +2.34.1 + diff --git a/BGNoneRoot.patch b/BGNoneRoot.patch index 4f884bc..c22433f 100644 --- a/BGNoneRoot.patch +++ b/BGNoneRoot.patch @@ -7,6 +7,6 @@ diff -up xf86-video-fbdev-0.4.3/src/fbdev.c.dma xf86-video-fbdev-0.4.3/src/fbdev + pScreen->canDoBGNoneRoot = 1; + - if (NULL == (fPtr->fbmem = fbdevHWMapVidmem(pScrn))) { + if (NULL == (fPtr->fbmem = my_fbdevHWMapVidmem(pScrn))) { xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mapping of video memory" " failed\n"); diff --git a/xorg-x11-drv-fbdev.spec b/xorg-x11-drv-fbdev.spec index 8777f49..cee1452 100644 --- a/xorg-x11-drv-fbdev.spec +++ b/xorg-x11-drv-fbdev.spec @@ -2,12 +2,10 @@ %global moduledir %(pkg-config xorg-server --variable=moduledir ) %global driverdir %{moduledir}/drivers -%undefine _hardened_build - Summary: Xorg X11 fbdev video driver Name: xorg-x11-drv-fbdev Version: 0.5.0 -Release: 10%{?dist} +Release: 11%{?dist} URL: http://www.x.org License: MIT @@ -15,6 +13,7 @@ Source0: https://www.x.org/pub/individual/driver/%{tarball}-%{version}.tar.bz2 ExcludeArch: s390 s390x +Patch0: 0001-mustard-Enable-linking-with-z-now.patch Patch2: BGNoneRoot.patch BuildRequires: make @@ -29,6 +28,7 @@ X.Org X11 fbdev video driver. %prep %setup -q -n %{tarball}-%{version} +%patch0 -p1 %patch2 -p1 %build @@ -50,6 +50,10 @@ find $RPM_BUILD_ROOT -regex ".*\.la$" | xargs rm -f -- %{_mandir}/man4/fbdev.4* %changelog +* Wed Feb 23 2022 Adam Jackson - 0.5.0-11 +- Enable hardened build + Resolves: rhbz#2044899 + * Tue Aug 10 2021 Mohan Boddu - 0.5.0-10 - Rebuilt for IMA sigs, glibc 2.34, aarch64 flags Related: rhbz#1991688