[PATCH:libXxf86vm 1/4] Improve error handling in XF86VidModeGetMonitor()

walter harms wharms at bfs.de
Sun Apr 14 04:28:48 PDT 2013



Am 14.04.2013 03:48, schrieb Alan Coopersmith:
> Ensure that when we return an error we unlock the display first, and
> NULL out any pointers we freed in error cleanup.
> 
> Instead of adding these fixes to every error check, instead combine
> the error handling cleanup into a single copy.
> 
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
>  src/XF86VMode.c |   82 ++++++++++++++++++++++++++-----------------------------
>  1 file changed, 39 insertions(+), 43 deletions(-)
> 
> diff --git a/src/XF86VMode.c b/src/XF86VMode.c
> index c0e50e6..165f8ba 100644
> --- a/src/XF86VMode.c
> +++ b/src/XF86VMode.c
> @@ -856,6 +856,7 @@ XF86VidModeGetMonitor(Display* dpy, int screen, XF86VidModeMonitor* monitor)
>      xXF86VidModeGetMonitorReq *req;
>      CARD32 syncrange;
>      int i;
> +    Bool result = True;
>  
>      XF86VidModeCheckExtension (dpy, info, False);
>  
> @@ -875,63 +876,58 @@ XF86VidModeGetMonitor(Display* dpy, int screen, XF86VidModeMonitor* monitor)
>      monitor->bandwidth = (float)rep.bandwidth / 1e6;
>  #endif
>      if (rep.vendorLength) {
> -	if (!(monitor->vendor = (char *)Xcalloc(rep.vendorLength + 1, 1))) {
> -	    _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
> -		      ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
> -	    return False;
> -	}
> +	monitor->vendor = Xcalloc(rep.vendorLength + 1, 1);
> +	if (monitor->vendor == NULL)
> +	    result = False;
>      } else {
>  	monitor->vendor = NULL;
>      }

i do not understand this, do you realy want monitor->vendor = NULL;
when monitor->vendor = Xcalloc(rep.vendorLength + 1, 1); succeeds ?`


> -    if (rep.modelLength) {
> -	if (!(monitor->model = Xcalloc(rep.modelLength + 1, 1))) {
> -	    _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
> -		      ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
> -	    if (monitor->vendor)
> -		Xfree(monitor->vendor);
> -	    return False;
> -	}
> +    if (result && rep.modelLength) {
> +	monitor->model = Xcalloc(rep.modelLength + 1, 1);
> +	if (monitor->model == NULL)
> +	    result = False;
>      } else {
>  	monitor->model = NULL;
>      }
> -    if (!(monitor->hsync = Xcalloc(rep.nhsync, sizeof(XF86VidModeSyncRange)))) {
> -	_XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
> -		  ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
> -
> -	if (monitor->vendor)
> -	    Xfree(monitor->vendor);
> -	if (monitor->model)
> -	    Xfree(monitor->model);
> -	return False;
> +    if (result) {
> +	monitor->hsync = Xcalloc(rep.nhsync, sizeof(XF86VidModeSyncRange));
> +	monitor->vsync = Xcalloc(rep.nvsync, sizeof(XF86VidModeSyncRange));
> +	if ((monitor->hsync == NULL) || (monitor->vsync == NULL))
> +	    result = False;
> +    } else {
> +	monitor->hsync = monitor->vsync = NULL;
>      }
> -    if (!(monitor->vsync = Xcalloc(rep.nvsync, sizeof(XF86VidModeSyncRange)))) {
> +    if (result == False) {
>  	_XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
>  		  ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
> -	if (monitor->vendor)
> -	    Xfree(monitor->vendor);
> -	if (monitor->model)
> -	    Xfree(monitor->model);
> +	Xfree(monitor->vendor);
> +	monitor->vendor = NULL;
> +	Xfree(monitor->model);
> +	monitor->model = NULL;
>  	Xfree(monitor->hsync);
> -	return False;
> -    }
> -    for (i = 0; i < rep.nhsync; i++) {
> -	_XRead(dpy, (char *)&syncrange, 4);
> -	monitor->hsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
> -	monitor->hsync[i].hi = (float)(syncrange >> 16) / 100.0;
> +	monitor->hsync = NULL;
> +	Xfree(monitor->vsync);
> +	monitor->vsync = NULL;
>      }
> -    for (i = 0; i < rep.nvsync; i++) {
> -	_XRead(dpy, (char *)&syncrange, 4);
> -	monitor->vsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
> -	monitor->vsync[i].hi = (float)(syncrange >> 16) / 100.0;
> +    else {
> +	for (i = 0; i < rep.nhsync; i++) {
> +	    _XRead(dpy, (char *)&syncrange, 4);
> +	    monitor->hsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
> +	    monitor->hsync[i].hi = (float)(syncrange >> 16) / 100.0;
> +	}
> +	for (i = 0; i < rep.nvsync; i++) {
> +	    _XRead(dpy, (char *)&syncrange, 4);
> +	    monitor->vsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
> +	    monitor->vsync[i].hi = (float)(syncrange >> 16) / 100.0;
> +	}
> +	if (rep.vendorLength)
> +	    _XReadPad(dpy, monitor->vendor, rep.vendorLength);
> +	if (rep.modelLength)
> +	    _XReadPad(dpy, monitor->model, rep.modelLength);
>      }
> -    if (rep.vendorLength)
> -	_XReadPad(dpy, monitor->vendor, rep.vendorLength);
> -    if (rep.modelLength)
> -	_XReadPad(dpy, monitor->model, rep.modelLength);
> -
>      UnlockDisplay(dpy);
>      SyncHandle();
> -    return True;
> +    return result;
>  }
>  
>  Bool


More information about the xorg-devel mailing list