]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
sbuff: Protect against errant copies
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 25 Jul 2020 22:09:23 +0000 (18:09 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 25 Jul 2020 22:09:23 +0000 (18:09 -0400)
src/lib/util/sbuff.c

index 9d947ba266b8798d8d3909efcd0feb521552fe1c..dc5106910c23f34cfbf8ed4280d67fbac2e64b65 100644 (file)
@@ -658,6 +658,8 @@ ssize_t fr_sbuff_in_char(fr_sbuff_t *sbuff, char c)
 {
        CHECK_SBUFF_INIT(sbuff);
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        FR_SBUFF_EXTEND_OR_RETURN(sbuff, 1);
 
        *sbuff->p = c;
@@ -680,6 +682,8 @@ ssize_t fr_sbuff_in_strcpy(fr_sbuff_t *sbuff, char const *str)
 
        CHECK_SBUFF_INIT(sbuff);
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        len = strlen(str);
        FR_SBUFF_EXTEND_OR_RETURN(sbuff, len);
 
@@ -701,6 +705,8 @@ 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;
+
        FR_SBUFF_EXTEND_OR_RETURN(sbuff, len);
 
        memcpy(sbuff->p, str, len);
@@ -723,6 +729,8 @@ ssize_t fr_sbuff_in_bstrcpy_buffer(fr_sbuff_t *sbuff, char const *str)
 
        CHECK_SBUFF_INIT(sbuff);
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        len = talloc_array_length(str) - 1;
 
        FR_SBUFF_EXTEND_OR_RETURN(sbuff, len);
@@ -778,6 +786,8 @@ ssize_t fr_sbuff_in_vsprintf(fr_sbuff_t *sbuff, char const *fmt, va_list ap)
 
        CHECK_SBUFF_INIT(sbuff);
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        if (sbuff_scratch_init(&scratch) < 0) return 0;
 
        va_copy(ap_p, ap);
@@ -805,6 +815,8 @@ ssize_t fr_sbuff_in_sprintf(fr_sbuff_t *sbuff, char const *fmt, ...)
        va_list         ap;
        ssize_t         slen;
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        va_start(ap, fmt);
        slen = fr_sbuff_in_vsprintf(sbuff, fmt, ap);
        va_end(ap);
@@ -829,6 +841,8 @@ ssize_t fr_sbuff_in_snprint(fr_sbuff_t *sbuff, char const *in, size_t inlen, cha
 
        CHECK_SBUFF_INIT(sbuff);
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        len = fr_snprint_len(in, inlen, quote);
        FR_SBUFF_EXTEND_OR_RETURN(sbuff, len);
 
@@ -852,6 +866,8 @@ ssize_t fr_sbuff_in_snprint_buffer(fr_sbuff_t *sbuff, char const *in, char quote
 {
        if (unlikely(!in)) return 0;
 
+       if (unlikely(sbuff->is_const)) return 0;
+
        return fr_sbuff_in_snprint(sbuff, in, talloc_array_length(in) - 1, quote);
 }