]> granicus.if.org Git - check/commitdiff
Document the new function, give precedence to environment.
authorOren Ben-Kiki <oren@ben-kiki.org>
Sun, 27 Aug 2017 18:54:52 +0000 (21:54 +0300)
committerOren Ben-Kiki <oren@ben-kiki.org>
Sun, 27 Aug 2017 18:54:52 +0000 (21:54 +0300)
doc/check.texi
src/check.h.in
src/check_pack.c

index 242196349394bf8659ea0b9a87b3a9a2fc4cc3bd..c8afba53a94c697e4a07ab1b59f287575661ff25 100644 (file)
@@ -993,6 +993,17 @@ repetitive code that is hard to read.  For your convenience Check
 provides a set of functions (actually macros) for testing often used
 conditions.
 
+@findex check_set_max_msg_size
+@vindex CK_MAX_MSG_SIZE
+The typical size of an assertion message is less than 80 bytes.
+However, some of the functions listed below can generate very large messages
+(up to 4GB allocations were seen in the wild).
+To prevent this, a limit is placed on the assertion message size.
+This limit is 4K bytes by default.
+It can be modified by setting the @code(CK_MAX_MSG_SIZE) environment variable,
+or, if it is not set, by invoking the @code{check_set_max_msg_size()} function.
+If used, this function must be called, once, before the first assertion.
+
 @ftable @code
 @item ck_abort
 Unconditionally fails test with default message.
@@ -2274,6 +2285,8 @@ CK_XML_LOG_FILE_NAME: Filename to write XML log to. See section @ref{XML Logging
 
 CK_TAP_LOG_FILE_NAME: Filename to write TAP (Test Anything Protocol) output to.  See section @ref{TAP Logging}.
 
+CK_MAX_MSG_SIZE: Maximal assertion message size.
+
 
 @node Copying This Manual, Index, Environment Variable Reference, Top
 @appendix Copying This Manual
index 46e9c4b4daeebf0113670710b18e94a567e0a62c..458e3d1185e16f053b030abd6cafd7cb5bc9bda0 100644 (file)
@@ -2271,12 +2271,11 @@ CK_DLL_EXP void CK_EXPORT check_waitpid_and_exit(pid_t pid) CK_ATTRIBUTE_NORETUR
  * (values of up to 4GB were seen in the wild).
  * The usual size for a message is less than 80 bytes.
  *
- * By default, an assertion message is restricted to 4K bytes.
- * It is possible to override this by setting the CK_MAX_MSG_SIZE environment variable,
- * or by invoking this function.
- * Specifying a non-positive argument resets the value,
- * to the value specified by the environment variable,
- * or to the default 4K bytes if the environment variable is not specified.
+ * If the environment variable CK_MAX_MSG_SIZE is defined to a positive value, it is used.
+ * Otherwise, if a maximal message size is set via this function, it is used.
+ * Otherwise, the maximal message size is one assigned at compile time (4K bytes).
+ *
+ * If used, this function must be called once before any assertion is made.
  *
  * @param max_msg_size the maximal assertion message size.
  *
index 88a1050e9b6cc6afc8ba8002d5c317d03a2487bd..c1b77f298c98bc8f5b1d7bfd6a2acb374be4419f 100644 (file)
@@ -23,7 +23,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
-
 #include "check.h"
 #include "check_error.h"
 #include "check_list.h"
@@ -39,6 +38,9 @@
 
 /* Maximum size for one message in the message stream. */
 static int ck_max_msg_size = 0;
+#ifndef DEFAULT_MAX_MSG_SIZE
+#define DEFAULT_MAX_MSG_SIZE 4096
+#endif
 /* This is used to implement a sliding window on the receiving
  * side. When sending messages, we assure that no single message
  * is bigger than this.
@@ -49,22 +51,22 @@ static int ck_max_msg_size = 0;
  */
 
 void check_set_max_msg_size(int max_msg_size) {
-    ck_max_msg_size = max_msg_size;
-}
-
-static int get_max_msg_size(void) {
     if (ck_max_msg_size <= 0) {
         char *env = getenv("CK_MAX_MSG_SIZE");
         if (env)
             ck_max_msg_size = atoi(env);
-
         if (ck_max_msg_size <= 0)
-            ck_max_msg_size = 4096;
+            ck_max_msg_size = max_msg_size;
+        if (ck_max_msg_size <= 0)
+            ck_max_msg_size = DEFAULT_MAX_MSG_SIZE;
     }
-    return ck_max_msg_size;
 }
 
-
+static int get_max_msg_size(void) {
+    if (ck_max_msg_size <= 0)
+        check_set_max_msg_size(0);
+    return ck_max_msg_size;
+}
 
 /* typedef an unsigned int that has at least 4 bytes */
 typedef uint32_t ck_uint32;