Bug 889

Summary: Client crash with resolutions above 1920x1080
Product: Odamex Reporter: Jenova <oro.networks>
Component: ClientAssignee: Odamex Bug Reporter <odamex-bug-reporter>
Status: RESOLVED FIXED    
Severity: normal CC: alexmax2742
Priority: P1    
Version: 0.6.x   
Hardware: x86 (Windows, Linux, etc)   
OS: Windows   
Bug Depends on:    
Bug Blocks: 900    

Description Jenova 2012-08-15 00:38:09 UTC
Odamex will crash when switching to a resolution beyond 1920x1080. I assume 1920x1200 is also not affected by this bug, but I cannot test this because my monitor does not support 16:10 resolutions.

If I play on my native resolution (2560x1440) it will crash, regardless of if fullscreen is enabled or disabled.
Comment 1 Mike Lightner 2012-08-15 01:43:30 UTC
Odamex supports a maximum width of 2048 and a maximum height of 1536.  However, it should not crash, but rather go to the highest supported resolution.
Comment 2 Alexander Mayfield 2012-08-15 01:56:53 UTC
Some valgrind output from attempting to set the video mode to something ridiculous:

==12398== Invalid write of size 4
==12398==    at 0x8233ACF: R_StoreWallRange(int, int) (r_segs.cpp:1050)
==12398==    by 0x81FD3F4: R_ClipPassWallSegment(int, int) (r_bsp.cpp:250)
==12398==    by 0x81FEAB1: R_AddLine(seg_s*) (r_bsp.cpp:706)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==  Address 0x835ea40 expected vs actual:
==12398==  Expected: global array "walltopf" of size 8,192 in object with soname "NONE"
==12398==  Actual:   global array "walltopb" of size 8,192 in object with soname "NONE"
==12398==  Actual:   is 0 after Expected


==12398== Invalid write of size 4
==12398==    at 0x8233C0F: R_StoreWallRange(int, int) (r_segs.cpp:1062)
==12398==    by 0x81FD3F4: R_ClipPassWallSegment(int, int) (r_bsp.cpp:250)
==12398==    by 0x81FEAB1: R_AddLine(seg_s*) (r_bsp.cpp:706)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==  Address 0x8362a40 expected vs actual:
==12398==  Expected: global array "wallbottomf" of size 8,192 in object with soname "NONE"
==12398==  Actual:   global array "wallbottomb" of size 8,192 in object with soname "NONE"
==12398==  Actual:   is 0 after Expected

==12398== Invalid write of size 4
==12398==    at 0x8233D7E: R_StoreWallRange(int, int) (r_segs.cpp:1078)
==12398==    by 0x81FD3F4: R_ClipPassWallSegment(int, int) (r_bsp.cpp:250)
==12398==    by 0x81FEAB1: R_AddLine(seg_s*) (r_bsp.cpp:706)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==  Address 0x8360a40 expected vs actual:
==12398==  Expected: global array "walltopb" of size 8,192 in object with soname "NONE"
==12398==  Actual:   global array "wallbottomf" of size 8,192 in object with soname "NONE"
==12398==  Actual:   is 0 after Expected


==12398== Invalid write of size 4
==12398==    at 0x8233ACF: R_StoreWallRange(int, int) (r_segs.cpp:1050)
==12398==    by 0x81FD1CD: R_ClipSolidWallSegment(int, int) (r_bsp.cpp:149)
==12398==    by 0x81FEACC: R_AddLine(seg_s*) (r_bsp.cpp:710)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==  Address 0x835ea40 expected vs actual:
==12398==  Expected: global array "walltopf" of size 8,192 in object with soname "NONE"
==12398==  Actual:   global array "walltopb" of size 8,192 in object with soname "NONE"
==12398==  Actual:   is 0 after Expected

==12398== Invalid write of size 4
==12398==    at 0x8233EF9: R_StoreWallRange(int, int) (r_segs.cpp:1093)
==12398==    by 0x81FD3F4: R_ClipPassWallSegment(int, int) (r_bsp.cpp:250)
==12398==    by 0x81FEAB1: R_AddLine(seg_s*) (r_bsp.cpp:706)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==  Address 0x8364a40 expected vs actual:
==12398==  Expected: global array "wallbottomb" of size 8,192 in object with soname "NONE"
==12398==  Actual:   unknown
==12398==  Actual:   is 0 after Expected

...and so on, until finally:

==12398== Process terminating with default action of signal 11 (SIGSEGV)
==12398==  Bad permissions for mapped region at address 0x202953
==12398==    at 0x202953: ???
==12398==    by 0x81FD3F4: R_ClipPassWallSegment(int, int) (r_bsp.cpp:250)
==12398==    by 0x81FEAB1: R_AddLine(seg_s*) (r_bsp.cpp:706)
==12398==    by 0x81FF386: R_Subsector(int) (r_bsp.cpp:942)
==12398==    by 0x81FF4B4: R_RenderBSPNode(int) (r_bsp.cpp:974)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398==    by 0x81FF44C: R_RenderBSPNode(int) (r_bsp.cpp:966)
==12398== 
==12398== ERROR SUMMARY: 21 errors from 19 contexts (suppressed: 12 from 10)
Comment 3 Mike Lightner 2012-09-06 03:29:43 UTC
We need to clamp instead of allowing this to happen.
Comment 4 Alexander Mayfield 2012-09-06 22:50:56 UTC
r3335 committed a fix that bumped the maximum resolution up to 2880x1800, which is the native resolution of a Retina Macbook Pro.  In addition, the client will refuse to set a video resolution bigger than what it can handle.  Please test.
Comment 5 Mike Lightner 2012-10-05 03:03:18 UTC
This is good for now, closing...