mirror of
				https://github.com/netwide-assembler/nasm.git
				synced 2025-10-10 00:25:06 -04:00 
			
		
		
		
	BR3041451: Implement upper bound for %rep counter
Since %rep counter is a 64 bit signed integer we have to use some "maximum possible value" limit (upper bound) otherwise there may be a situation when %rep counter is 0 or even negative while user has been passing big positive integer value. Reported-by: nasm64developer Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
This commit is contained in:
		| @@ -9,6 +9,9 @@ since 2007. | ||||
|  | ||||
| \S{cl-2.09} Version 2.09 | ||||
|  | ||||
| \b Fixed assignment the magnitude of \c{%rep} counter. It is limited | ||||
|   to 62 bits now. | ||||
|  | ||||
| \b Fixed NULL dereference if argument of \c{%strlen} resolves | ||||
|   to whitespace. For example if nonexistent macro parameter is used. | ||||
|  | ||||
|   | ||||
| @@ -3211,6 +3211,9 @@ infinite loop in the preprocessor, which (on multitasking or | ||||
| multi-user systems) would typically cause all the system memory to | ||||
| be gradually used up and other applications to start crashing. | ||||
|  | ||||
| Note a maximum repeat count is limited by 62 bit number, though it | ||||
| is hardly possible that you ever need anything bigger. | ||||
|  | ||||
|  | ||||
| \H{files} Source Files and Dependencies | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								preproc.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								preproc.c
									
									
									
									
									
								
							| @@ -326,6 +326,9 @@ enum { | ||||
|  */ | ||||
| #define DEADMAN_LIMIT (1 << 20) | ||||
|  | ||||
| /* max reps */ | ||||
| #define REP_LIMIT ((INT64_C(1) << 62)) | ||||
|  | ||||
| /* | ||||
|  * Condition codes. Note that we use c_ prefix not C_ because C_ is | ||||
|  * used in nasm.h for the "real" condition codes. At _this_ level, | ||||
| @@ -2895,7 +2898,12 @@ issue_error: | ||||
|                 error(ERR_NONFATAL, "non-constant value given to `%%rep'"); | ||||
|                 return DIRECTIVE_FOUND; | ||||
|             } | ||||
|             count = reloc_value(evalresult) + 1; | ||||
|             count = reloc_value(evalresult); | ||||
|             if (count >= REP_LIMIT) { | ||||
|                 error(ERR_NONFATAL, "`%%rep' evalue exceeds limit"); | ||||
|                 count = 0; | ||||
|             } else | ||||
|                 count++; | ||||
|         } else { | ||||
|             error(ERR_NONFATAL, "`%%rep' expects a repeat count"); | ||||
|             count = 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user