Prevent mistyped command line options from incurring high memory and CPU usage at startup. 64K elements in a range should be enough for everyone (TM). The OPTS_VISITOR_RANGE_MAX macro is public so that unit tests can construct corner cases with it. Signed-off-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Wanlong Gao <gaowanlong@cn.fujitsu.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
		
			
				
	
	
		
			38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Options Visitor
 | 
						|
 *
 | 
						|
 * Copyright Red Hat, Inc. 2012
 | 
						|
 *
 | 
						|
 * Author: Laszlo Ersek <lersek@redhat.com>
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 | 
						|
 * See the COPYING.LIB file in the top-level directory.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef OPTS_VISITOR_H
 | 
						|
#define OPTS_VISITOR_H
 | 
						|
 | 
						|
#include "qapi/visitor.h"
 | 
						|
#include "qemu/option.h"
 | 
						|
 | 
						|
/* Inclusive upper bound on the size of any flattened range. This is a safety
 | 
						|
 * (= anti-annoyance) measure; wrong ranges should not cause long startup
 | 
						|
 * delays nor exhaust virtual memory.
 | 
						|
 */
 | 
						|
#define OPTS_VISITOR_RANGE_MAX 65536
 | 
						|
 | 
						|
typedef struct OptsVisitor OptsVisitor;
 | 
						|
 | 
						|
/* Contrarily to qemu-option.c::parse_option_number(), OptsVisitor's "int"
 | 
						|
 * parser relies on strtoll() instead of strtoull(). Consequences:
 | 
						|
 * - string representations of negative numbers yield negative values,
 | 
						|
 * - values below INT64_MIN or LLONG_MIN are rejected,
 | 
						|
 * - values above INT64_MAX or LLONG_MAX are rejected.
 | 
						|
 */
 | 
						|
OptsVisitor *opts_visitor_new(const QemuOpts *opts);
 | 
						|
void opts_visitor_cleanup(OptsVisitor *nv);
 | 
						|
Visitor *opts_get_visitor(OptsVisitor *nv);
 | 
						|
 | 
						|
#endif
 |