Yann Ylavic <ylavic....@gmail.com> writes:

> So possibly something like the below:
>
> Index: encoding/apr_base64.c
> ===================================================================
> --- encoding/apr_base64.c    (revision 1908764)
> +++ encoding/apr_base64.c    (working copy)
> @@ -20,8 +20,27 @@
>   * ugly 'len' functions, which is quite a nasty cost.
>   */
>
> -#undef NDEBUG /* always abort() on assert()ion failure */
> +/* An APR__ASSERT()ion failure will abort() with or without printing
> + * the faulting condition (and code location) depending on NDEBUG.
> + */
> +#ifndef NDEBUG  /* use assert()/system's printing before abort() mechanism */
>  #include <assert.h>
> +#define APR__ASSERT(cond) assert(cond)
> +#else           /* just abort() */
> +#if APR_HAVE_STDLIB_H
> +#include <stdlib.h>
> +#endif
> +#if HAVE___BUILTIN_EXPECT
> +#define APR__UNLIKELY(cond) __builtin_expect(!!(cond), 0)
> +#else
> +#define APR__UNLIKELY(cond) (!!(cond))
> +#endif
> +#define APR__ASSERT(cond) do { \
> +    if (APR__UNLIKELY(!(cond))) { \
> +        abort(); \
> +    } \
> +} while (0)
> +#endif

Yes, something along these lines, although I was thinking we could maybe
get away with just adding a small helper that covers all cases, as in the
attached patch.


Thanks,
Evgeny Kotkov
Index: encoding/apr_base64.c
===================================================================
--- encoding/apr_base64.c       (revision 1908804)
+++ encoding/apr_base64.c       (working copy)
@@ -20,7 +20,6 @@
  * ugly 'len' functions, which is quite a nasty cost.
  */
 
-#undef NDEBUG /* always abort() on assert()ion failure */
 #include <assert.h>
 
 #include "apr_base64.h"
@@ -28,6 +27,17 @@
 #include "apr_xlate.h"
 #endif                /* APR_CHARSET_EBCDIC */
 
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#define verify_condition(cond) do { \
+    if (!(cond)) {                  \
+        assert(0 && #cond);         \
+        abort();                    \
+    }                               \
+} while (0)
+
 /* Above APR_BASE64_ENCODE_MAX length the encoding can't fit in an int >= 0 */
 #define APR_BASE64_ENCODE_MAX 1610612733
 
@@ -124,7 +134,7 @@ APR_DECLARE(int) apr_base64_decode_len(const char
     bufin = (const unsigned char *) bufcoded;
     while (pr2six[*(bufin++)] <= 63);
     nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    assert(nprbytes <= APR_BASE64_DECODE_MAX);
+    verify_condition(nprbytes <= APR_BASE64_DECODE_MAX);
 
     return (int)(((nprbytes + 3u) / 4u) * 3u + 1u);
 }
@@ -161,7 +171,7 @@ APR_DECLARE(int) apr_base64_decode_binary(unsigned
     bufin = (const unsigned char *) bufcoded;
     while (pr2six[*(bufin++)] <= 63);
     nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    assert(nprbytes <= APR_BASE64_DECODE_MAX);
+    verify_condition(nprbytes <= APR_BASE64_DECODE_MAX);
     nbytesdecoded = (int)(((nprbytes + 3u) / 4u) * 3u);
 
     bufout = (unsigned char *) bufplain;
@@ -206,7 +216,7 @@ static const char basis_64[] =
 
 APR_DECLARE(int) apr_base64_encode_len(int len)
 {
-    assert(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
+    verify_condition(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
 
     return ((len + 2) / 3 * 4) + 1;
 }
@@ -219,7 +229,7 @@ APR_DECLARE(int) apr_base64_encode(char *encoded,
     int i;
     char *p;
 
-    assert(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
+    verify_condition(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
 
     p = encoded;
     for (i = 0; i < len - 2; i += 3) {
@@ -258,7 +268,7 @@ APR_DECLARE(int) apr_base64_encode_binary(char *en
     int i;
     char *p;
 
-    assert(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
+    verify_condition(len >= 0 && len <= APR_BASE64_ENCODE_MAX);
 
     p = encoded;
     for (i = 0; i < len - 2; i += 3) {
@@ -292,7 +302,7 @@ APR_DECLARE(char *) apr_pbase64_encode(apr_pool_t
     char *encoded;
     apr_size_t len = strlen(string);
 
-    assert(len <= (apr_size_t)APR_BASE64_ENCODE_MAX);
+    verify_condition(len <= (apr_size_t)APR_BASE64_ENCODE_MAX);
     encoded = (char *) apr_palloc(p, apr_base64_encode_len((int)len));
     apr_base64_encode(encoded, string, (int)len);
 

Reply via email to