diff options
| author | AFWEF_147 <[email protected]> | 2026-03-23 12:09:58 +0000 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2026-04-01 22:56:37 +0800 |
| commit | ebe65849dbf33bb8c5774876aa46fa17b1a5f998 (patch) | |
| tree | 1bf907492c33eeff4641a3ab76a16e98c048a3cc /components | |
| parent | 9c8b58f482adffea97596a4ab6c457551c2b4279 (diff) | |
fix(at): clamp formatted output length
Diffstat (limited to 'components')
| -rw-r--r-- | components/net/at/src/at_utils.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/components/net/at/src/at_utils.c b/components/net/at/src/at_utils.c index a5cbf7c8fd..3a7b499581 100644 --- a/components/net/at/src/at_utils.c +++ b/components/net/at/src/at_utils.c @@ -63,9 +63,36 @@ rt_weak rt_size_t at_utils_send(rt_device_t dev, { return rt_device_write(dev, pos, buffer, size); } + +static rt_size_t _at_vsnprintf_len(char *send_buf, rt_size_t buf_size, rt_size_t suffix_size, + const char *format, va_list args) +{ + int len; + rt_size_t text_size; + + if (buf_size <= suffix_size) + { + return 0; + } + + text_size = buf_size - suffix_size; + len = vsnprintf(send_buf, text_size, format, args); + if (len <= 0) + { + return 0; + } + + if ((rt_size_t)len >= text_size) + { + return text_size - 1; + } + + return len; +} + rt_size_t at_vprintf(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args) { - rt_size_t len = vsnprintf(send_buf, buf_size, format, args); + rt_size_t len = _at_vsnprintf_len(send_buf, buf_size, 0, format, args); if (len == 0) { return 0; @@ -79,7 +106,7 @@ rt_size_t at_vprintf(rt_device_t device, char *send_buf, rt_size_t buf_size, con } rt_size_t at_vprintfln(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args) { - rt_size_t len = vsnprintf(send_buf, buf_size - 2, format, args); + rt_size_t len = _at_vsnprintf_len(send_buf, buf_size, 2, format, args); if (len == 0) { return 0; @@ -96,7 +123,7 @@ rt_size_t at_vprintfln(rt_device_t device, char *send_buf, rt_size_t buf_size, c } rt_size_t at_vprintfcr(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args) { - rt_size_t len = vsnprintf(send_buf, buf_size - 1, format, args); + rt_size_t len = _at_vsnprintf_len(send_buf, buf_size, 1, format, args); if (len == 0) { return 0; @@ -112,7 +139,7 @@ rt_size_t at_vprintfcr(rt_device_t device, char *send_buf, rt_size_t buf_size, c } rt_size_t at_vprintflf(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args) { - rt_size_t len = vsnprintf(send_buf, buf_size - 1, format, args); + rt_size_t len = _at_vsnprintf_len(send_buf, buf_size, 1, format, args); if (len == 0) { return 0; |
