BR3041451: Implement upper bound for %rep counter
authorCyrill Gorcunov <gorcunov@gmail.com>
Mon, 9 Aug 2010 09:58:22 +0000 (13:58 +0400)
committerCyrill Gorcunov <gorcunov@gmail.com>
Mon, 9 Aug 2010 14:35:35 +0000 (18:35 +0400)
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>
doc/changes.src
doc/nasmdoc.src
preproc.c

index a7ee231..d015f9e 100644 (file)
@@ -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.
 
index ab343e5..e797329 100644 (file)
@@ -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
 
index 885b3a9..64c481a 100644 (file)
--- a/preproc.c
+++ b/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;