[PATCH v2] Fix checking for valid argument of --dpi

Pali Rohár pali.rohar at gmail.com
Mon Nov 26 21:17:24 UTC 2018


Function strtod() sets strtod_error to the pointer of the first invalid
character and therefore it does not have to be first character from input.
When input is valid then it points to nul byte. Conversion error is
indicated by setted errno. Zero-length argument, non-positive DPI or DPI
with trailing or leading whitespaces is invalid too.

Update also error message about invalid argument.

Signed-off-by: Pali Rohár <pali.rohar at gmail.com>

--

Changes since v1:
* Get same error message for `xrandr --dpi ''` and `xrandr --dpi ' '`
* Make the check for dpi <= 0
* Do not accept leading whitespaces (trailing were already disallowed)
---
 xrandr.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/xrandr.c b/xrandr.c
index ce3cd91..4baa075 100644
--- a/xrandr.c
+++ b/xrandr.c
@@ -40,6 +40,7 @@
 #include <inttypes.h>
 #include <stdarg.h>
 #include <math.h>
+#include <ctype.h>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -3118,8 +3119,9 @@ main (int argc, char **argv)
 	if (!strcmp ("--dpi", argv[i])) {
 	    char *strtod_error;
 	    if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]);
+	    errno = 0;
 	    dpi = strtod(argv[i], &strtod_error);
-	    if (argv[i] == strtod_error)
+	    if (!argv[i][0] || isspace(argv[i][0]) || *strtod_error || errno || dpi <= 0)
 	    {
 		dpi = 0.0;
 		dpi_output_name = argv[i];
@@ -3569,7 +3571,7 @@ main (int argc, char **argv)
 	    XRROutputInfo	*output_info;
 	    XRRModeInfo	*mode_info;
 	    if (!dpi_output)
-		fatal ("Cannot find output %s\n", dpi_output_name);
+		fatal ("%s is not valid DPI nor valid output\n", dpi_output_name);
 	    output_info = dpi_output->output_info;
 	    mode_info = dpi_output->mode_info;
 	    if (output_info && mode_info && output_info->mm_height)
-- 
2.11.0



More information about the xorg-devel mailing list