diff options
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/glx/glxconfig.c | 63 |
2 files changed, 38 insertions, 27 deletions
diff --git a/.pick_status.json b/.pick_status.json index 4756005ed94..414cbf394c5 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -94,7 +94,7 @@ "description": "Revert \"glx: convert glx_config_create_list to one big calloc\"", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "35fc7bdf0e6ad6547e39099e7060a3d89539b56d" }, diff --git a/src/glx/glxconfig.c b/src/glx/glxconfig.c index 569d24bfac5..6c4267c8f39 100644 --- a/src/glx/glxconfig.c +++ b/src/glx/glxconfig.c @@ -218,43 +218,54 @@ glx_config_get(struct glx_config * mode, int attribute, int *value_return) _X_HIDDEN struct glx_config * glx_config_create_list(unsigned count) { - struct glx_config *c = NULL; + const size_t size = sizeof(struct glx_config); + struct glx_config *base = NULL; + struct glx_config **next; unsigned i; - if (!(c = calloc(count, sizeof(struct glx_config)))) - return NULL; - + next = &base; for (i = 0; i < count; i++) { - c[i].visualID = GLX_DONT_CARE; - c[i].visualType = GLX_DONT_CARE; - c[i].visualRating = GLX_NONE; - c[i].transparentPixel = GLX_NONE; - c[i].transparentRed = GLX_DONT_CARE; - c[i].transparentGreen = GLX_DONT_CARE; - c[i].transparentBlue = GLX_DONT_CARE; - c[i].transparentAlpha = GLX_DONT_CARE; - c[i].transparentIndex = GLX_DONT_CARE; - c[i].xRenderable = GLX_DONT_CARE; - c[i].fbconfigID = GLX_DONT_CARE; - c[i].swapMethod = GLX_SWAP_UNDEFINED_OML; - c[i].bindToTextureRgb = GLX_DONT_CARE; - c[i].bindToTextureRgba = GLX_DONT_CARE; - c[i].bindToMipmapTexture = GLX_DONT_CARE; - c[i].bindToTextureTargets = GLX_DONT_CARE; - c[i].yInverted = GLX_DONT_CARE; - c[i].sRGBCapable = GLX_DONT_CARE; + *next = calloc(1, size); + if (*next == NULL) { + glx_config_destroy_list(base); + base = NULL; + break; + } + + (*next)->visualID = GLX_DONT_CARE; + (*next)->visualType = GLX_DONT_CARE; + (*next)->visualRating = GLX_NONE; + (*next)->transparentPixel = GLX_NONE; + (*next)->transparentRed = GLX_DONT_CARE; + (*next)->transparentGreen = GLX_DONT_CARE; + (*next)->transparentBlue = GLX_DONT_CARE; + (*next)->transparentAlpha = GLX_DONT_CARE; + (*next)->transparentIndex = GLX_DONT_CARE; + (*next)->xRenderable = GLX_DONT_CARE; + (*next)->fbconfigID = GLX_DONT_CARE; + (*next)->swapMethod = GLX_SWAP_UNDEFINED_OML; + (*next)->bindToTextureRgb = GLX_DONT_CARE; + (*next)->bindToTextureRgba = GLX_DONT_CARE; + (*next)->bindToMipmapTexture = GLX_DONT_CARE; + (*next)->bindToTextureTargets = GLX_DONT_CARE; + (*next)->yInverted = GLX_DONT_CARE; + (*next)->sRGBCapable = GLX_DONT_CARE; - if (i != count -1) - c[i].next = &(c[i+1]); + next = &((*next)->next); } - return c; + return base; } _X_HIDDEN void glx_config_destroy_list(struct glx_config *configs) { - free(configs); + while (configs != NULL) { + struct glx_config *const next = configs->next; + + free(configs); + configs = next; + } } |