#if defined(STATIC_ANALYZER) || !defined(NDEBUG)
# define CHECK_SBUFF_INIT(_sbuff) do { if (!(_sbuff)->extend && (unlikely(!(_sbuff)->buff) || unlikely(!(_sbuff)->start) || unlikely(!(_sbuff)->end) || unlikely(!(_sbuff)->p))) return 0; } while (0)
+# define CHECK_SBUFF_WRITEABLE(_sbuff) do { CHECK_SBUFF_INIT(_sbuff); if (unlikely((_sbuff)->is_const)) return 0; } while (0)
+
#else
# define CHECK_SBUFF_INIT(_sbuff)
+# define CHECK_SBUFF_WRITEABLE(_sbuff)
#endif
bool const sbuff_char_class_uint[UINT8_MAX + 1] = {
{
size_t len;
- CHECK_SBUFF_INIT(sbuff);
-
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
len = strlen(str);
FR_SBUFF_EXTEND_LOWAT_OR_RETURN(sbuff, len);
*/
ssize_t fr_sbuff_in_bstrncpy(fr_sbuff_t *sbuff, char const *str, size_t len)
{
- CHECK_SBUFF_INIT(sbuff);
-
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
FR_SBUFF_EXTEND_LOWAT_OR_RETURN(sbuff, len);
{
size_t len;
- CHECK_SBUFF_INIT(sbuff);
-
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
len = talloc_array_length(str) - 1;
* @param[in] sbuff to print into.
* @param[in] fmt string.
* @param[in] ap arguments for format string.
- * @return
+< * @return
* - >= 0 the number of bytes printed into the sbuff.
* - <0 the number of bytes required to complete the print operation.
*/
char *tmp;
ssize_t slen;
- CHECK_SBUFF_INIT(sbuff);
-
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
if (sbuff_scratch_init(&scratch) < 0) return 0;
va_list ap;
ssize_t slen;
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
va_start(ap, fmt);
slen = fr_sbuff_in_vsprintf(sbuff, fmt, ap);
/* Significantly quicker if there are no rules */
if (!e_rules || (e_rules->chr == '\0')) return fr_sbuff_in_bstrncpy(sbuff, in, inlen);
- CHECK_SBUFF_INIT(sbuff);
-
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
our_sbuff = FR_SBUFF(sbuff);
while (p < end) {
{
if (unlikely(!in)) return 0;
- if (unlikely(sbuff->is_const)) return 0;
+ CHECK_SBUFF_WRITEABLE(sbuff);
return fr_sbuff_in_escape(sbuff, in, talloc_array_length(in) - 1, e_rules);
}
if (sep) e_rules.subs[(uint8_t)*sep] = *sep;
+ CHECK_SBUFF_WRITEABLE(out);
+
for (p = array; *p; p++) {
if (*p) FR_SBUFF_RETURN(fr_sbuff_in_escape, &our_out, *p, strlen(*p), &e_rules);