Linux: Hardened getAvailableDisplayModes so that it won't be confused by a changing number of display modes while it is executing
This commit is contained in:
parent
dd312b492b
commit
8668ab3e89
|
@ -4,7 +4,7 @@ CC=gcc
|
||||||
LINKER=gcc
|
LINKER=gcc
|
||||||
STRIP=strip
|
STRIP=strip
|
||||||
CFLAGS_LINK=-shared -Wall
|
CFLAGS_LINK=-shared -Wall
|
||||||
LIBS=-L/usr/X11/lib -lX11 -lXext -lXxf86vm -lpthread -L/usr/lib/jvm/java-1.4.2-sun-1.4.2.05/jre/lib/i386/ -ljawt -Wl,-static,-lXcursor,-lXrender,-lXrandr,-call_shared
|
LIBS=-L/usr/X11/lib -lX11 -lXext -lXxf86vm -lpthread -L/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386/ -ljawt -Wl,-static,-lXcursor,-lXrender,-lXrandr,-call_shared
|
||||||
CFLAGS_O=-fPIC -O2 -D_X11 -Wall -pthread -c -I../common -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
|
CFLAGS_O=-fPIC -O2 -D_X11 -Wall -pthread -c -I../common -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
|
||||||
SRC=$(wildcard *.c) $(wildcard ../common/*.c) $(wildcard ../common/arb/*.c) $(wildcard ../common/ati/*.c) $(wildcard ../common/ext/*.c) $(wildcard ../common/nv/*.c)
|
SRC=$(wildcard *.c) $(wildcard ../common/*.c) $(wildcard ../common/arb/*.c) $(wildcard ../common/ati/*.c) $(wildcard ../common/ext/*.c) $(wildcard ../common/nv/*.c)
|
||||||
OBJECTS=$(subst .c,.o,$(SRC))
|
OBJECTS=$(subst .c,.o,$(SRC))
|
||||||
|
|
|
@ -147,31 +147,30 @@ static extension getBestDisplayModeExtension(JNIEnv *env, Display *disp) {
|
||||||
static mode_info *getXrandrDisplayModes(Display *disp, int screen, int *num_modes) {
|
static mode_info *getXrandrDisplayModes(Display *disp, int screen, int *num_modes) {
|
||||||
int num_randr_sizes;
|
int num_randr_sizes;
|
||||||
XRRScreenSize *sizes = XRRSizes(disp, screen, &num_randr_sizes);
|
XRRScreenSize *sizes = XRRSizes(disp, screen, &num_randr_sizes);
|
||||||
|
mode_info *avail_modes = NULL;
|
||||||
|
int list_size = 0;
|
||||||
/* Count number of modes */
|
/* Count number of modes */
|
||||||
int num_randr_modes = 0;
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < num_randr_sizes; i++) {
|
int mode_index = 0;
|
||||||
int num_randr_rates;
|
|
||||||
XRRRates(disp, screen, i, &num_randr_rates);
|
|
||||||
num_randr_modes += num_randr_rates;
|
|
||||||
}
|
|
||||||
mode_info *avail_modes = (mode_info *)malloc(sizeof(mode_info)*num_randr_modes);
|
|
||||||
if (avail_modes == NULL)
|
|
||||||
return NULL;
|
|
||||||
int mode = 0;
|
|
||||||
for (i = 0; i < num_randr_sizes; i++) {
|
for (i = 0; i < num_randr_sizes; i++) {
|
||||||
int num_randr_rates;
|
int num_randr_rates;
|
||||||
short *freqs = XRRRates(disp, screen, i, &num_randr_rates);
|
short *freqs = XRRRates(disp, screen, i, &num_randr_rates);
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < num_randr_rates; j++) {
|
for (j = 0; j < num_randr_rates; j++) {
|
||||||
avail_modes[mode].width = sizes[i].width;
|
if (list_size <= mode_index) {
|
||||||
avail_modes[mode].height = sizes[i].height;
|
list_size += 1;
|
||||||
avail_modes[mode].freq = freqs[j];
|
avail_modes = (mode_info *)realloc(avail_modes, sizeof(mode_info)*list_size);
|
||||||
avail_modes[mode].mode_data.size_index = i;
|
if (avail_modes == NULL)
|
||||||
mode++;
|
return NULL;
|
||||||
|
}
|
||||||
|
avail_modes[mode_index].width = sizes[i].width;
|
||||||
|
avail_modes[mode_index].height = sizes[i].height;
|
||||||
|
avail_modes[mode_index].freq = freqs[j];
|
||||||
|
avail_modes[mode_index].mode_data.size_index = i;
|
||||||
|
mode_index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*num_modes = num_randr_modes;
|
*num_modes = mode_index;
|
||||||
return avail_modes;
|
return avail_modes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue