Changeset - r14960:e1d932ae3540
[Not reviewed]
master
0 1 0
smatz - 14 years ago 2010-04-07 21:18:17
smatz@openttd.org
(svn r19578) -Codechange: do not accept commas at invalid places in ParseIntList()
1 file changed with 29 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/settings.cpp
Show inline comments
 
@@ -158,19 +158,38 @@ static uint32 LookupManyOfMany(const cha
 
 * @return returns the number of items found, or -1 on an error */
 
int ParseIntList(const char *p, int *items, int maxitems)
 
{
 
	int n = 0, v;
 
	char *end;
 
	int n = 0; // number of items read so far
 
	bool comma = false; // do we accept comma?
 

	
 
	while (*p != '\0') {
 
		switch (*p) {
 
			case ',':
 
				/* Do not accept multiple commas between numbers */
 
				if (!comma) return -1;
 
				comma = false;
 
				/* FALL THROUGH */
 
			case ' ':
 
				p++;
 
				break;
 

	
 
	for (;;) {
 
		v = strtol(p, &end, 0);
 
		if (p == end || n == maxitems) return -1;
 
		p = end;
 
		items[n++] = v;
 
		if (*p == '\0') break;
 
		if (*p != ',' && *p != ' ') return -1;
 
		p++;
 
			default: {
 
				if (n == maxitems) return -1; // we don't accept that many numbers
 
				char *end;
 
				long v = strtol(p, &end, 0);
 
				if (p == end) return -1; // invalid character (not a number)
 
				if (sizeof(int) < sizeof(long)) v = ClampToI32(v);
 
				items[n++] = v;
 
				p = end; // first non-number
 
				comma = true; // we accept comma now
 
				break;
 
			}
 
		}
 
	}
 

	
 
	/* If we have read comma but no number after it, fail.
 
	 * We have read comma when (n != 0) and comma is not allowed */
 
	if (n != 0 && !comma) return -1;
 

	
 
	return n;
 
}
 

	
0 comments (0 inline, 0 general)