Note: This is a beta release of Red Hat Bugzilla 5.0. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Also email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback here.
Bug 78861 - SDL DGA segfaults on program start in DGA_SetVideoMode
Summary: SDL DGA segfaults on program start in DGA_SetVideoMode
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Red Hat Raw Hide
Classification: Retired
Component: SDL
Version: 1.0
Hardware: i686
OS: Linux
medium
medium
Target Milestone: ---
Assignee: wdovlrrw
QA Contact:
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2002-12-02 12:34 UTC by Luca Barbieri
Modified: 2008-05-01 15:38 UTC (History)
0 users

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2002-12-03 12:28:18 UTC


Attachments (Terms of Use)
Patch: tested and fixes the problem (deleted)
2002-12-03 12:26 UTC, Luca Barbieri
no flags Details | Diff

Description Luca Barbieri 2002-12-02 12:34:17 UTC
Description of Problem:
When an SDL program is started with SDL_VIDEODRIVER=dga, it segfaults in
DGA_SetVideoMode.
The "dga" program (non SDL) works fine.

Version-Release number of selected component (if applicable):
SDL-1.2.4-5
XFree86-4.2.99.2-0.20021122.2

How Reproducible:
Every time.

Steps to Reproduce:
1. Install a 2D SDL program (reproduced with frozen-bubble and VisualBoyAdvance)
2. Run it as root with SDL_VIDEODRIVER=dga

Actual Results:
Segfault. A core dump shows that it happens at 0x400779bc in DGA_SetVideoMode ()
from /usr/lib/libSDL-1.2.so.0.

Expected Results:
The program should work correctly.

Additional Information:
0x400779a8 <DGA_SetVideoMode+232>:      test   %edi,%edi
0x400779aa <DGA_SetVideoMode+234>:      je     0x40077c78 <DGA_SetVideoMode+952>
0x400779b0 <DGA_SetVideoMode+240>:      mov    0x8(%ebp),%ecx
0x400779b3 <DGA_SetVideoMode+243>:      mov    0x290(%ecx),%edx
0x400779b9 <DGA_SetVideoMode+249>:      mov    0xffffffe4(%ebp),%ecx
0x400779bc <DGA_SetVideoMode+252>:      movswl 0x3c(%esi,%ecx,1),%eax

eax            0x1      1
ecx            0xe038   57400
edx            0x8212f30        136392496
ebx            0x4008eedc       1074327260
esp            0xbffff2d0       0xbffff2d0
ebp            0xbffff308       0xbffff308
esi            0x822f328        136508200
edi            0x821d928        136436008
eip            0x400779bc       0x400779bc
eflags         0x210206 2163206

Comment 1 Luca Barbieri 2002-12-02 19:12:24 UTC
The problem is probably the use of modes[i] after modes has been freed.
The code should either use mode-> or delay freeing modes.
I have not tested whether fixing this solves the problem.

	/* Set the video mode */
	mode = SDL_NAME(XDGASetMode)(DGA_Display, DGA_Screen, modes[i].num);
	XFree(modes);
	if ( mode == NULL ) {
		SDL_SetError("Unable to switch to requested mode");
		return(NULL);
	}
	DGA_visualClass = modes[i].visualClass;
	memory_base = (Uint8 *)mode->data;
	memory_pitch = mode->mode.bytesPerScanline;


Comment 2 Luca Barbieri 2002-12-03 12:26:12 UTC
Created attachment 87187 [details]
Patch: tested and fixes the problem

Comment 3 Luca Barbieri 2002-12-03 12:28:12 UTC
The patch solves the problem on my system.
The bug is also present in upstream CVS, so please forward the patch.


Comment 4 Thomas Woerner 2002-12-11 13:55:53 UTC
The bug is fixed in CVS, now.


Note You need to log in before you can comment on or make changes to this bug.