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