svn commit: r1936811 - apr/apr/trunk/memcache
[email protected] Mon, 03 Aug 2026 12:30:35 -0000
| Newsgroups | gmane.comp.apache.apr.cvs |
|---|---|
| Message-ID | <178576023524.1831810.15330846939258185167@svn03-he-fi> |
Author: covener
Date: Mon Aug 3 12:30:34 2026
New Revision: 1936811
Log:
apr_memcache: error checking
Reviewed By: covener, jorton, jfclere
Modified:
apr/apr/trunk/memcache/apr_memcache.c
Modified: apr/apr/trunk/memcache/apr_memcache.c
==============================================================================
--- apr/apr/trunk/memcache/apr_memcache.c Mon Aug 3 12:28:37 2026 (r1936810)
+++ apr/apr/trunk/memcache/apr_memcache.c Mon Aug 3 12:30:34 2026 (r1936811)
@@ -677,6 +677,11 @@ static apr_status_t get_server_line(apr_
conn->blen = bsize;
conn->buffer[bsize] = '\0';
+ /* Validate CRLF line termination to prevent integer underflow attacks */
+ if (bsize < 2 || conn->buffer[bsize-2] != '\r' || conn->buffer[bsize-1] != '\n') {
+ return APR_EGENERAL;
+ }
+
return apr_brigade_cleanup(conn->tb);
}
@@ -1169,9 +1174,14 @@ apr_memcache_version(apr_memcache_server
}
if (strncmp(MS_VERSION, conn->buffer, MS_VERSION_LEN) == 0) {
- *baton = apr_pstrmemdup(p, conn->buffer+MS_VERSION_LEN+1,
- conn->blen - MS_VERSION_LEN - 2);
- rv = APR_SUCCESS;
+ if (conn->blen < MS_VERSION_LEN + 2) {
+ rv = APR_EGENERAL;
+ }
+ else {
+ *baton = apr_pstrmemdup(p, conn->buffer+MS_VERSION_LEN+1,
+ conn->blen - MS_VERSION_LEN - 2);
+ rv = APR_SUCCESS;
+ }
}
else {
rv = APR_EGENERAL;
@@ -1638,23 +1648,35 @@ apr_memcache_multgetp(apr_memcache_t *mc
static const char *stat_read_string(apr_pool_t *p, char *buf, apr_size_t len)
{
/* remove trailing \r\n and null char */
+ if (len < 2) {
+ return apr_pstrdup(p, "");
+ }
return apr_pstrmemdup(p, buf, len-2);
}
static apr_uint32_t stat_read_uint32(apr_pool_t *p, char *buf, apr_size_t len)
{
+ if (len < 2) {
+ return 0;
+ }
buf[len-2] = '\0';
return atoi(buf);
}
static apr_uint64_t stat_read_uint64(apr_pool_t *p, char *buf, apr_size_t len)
{
+ if (len < 2) {
+ return 0;
+ }
buf[len-2] = '\0';
return apr_atoi64(buf);
}
static apr_time_t stat_read_time(apr_pool_t *p, char *buf, apr_size_t len)
{
+ if (len < 2) {
+ return 0;
+ }
buf[len-2] = '\0';
return apr_time_from_sec(atoi(buf));
}
@@ -1666,6 +1688,9 @@ static apr_time_t stat_read_rtime(apr_po
char *usecs;
const char *sep = ":.";
+ if (len < 2) {
+ return apr_time_make(0, 0);
+ }
buf[len-2] = '\0';
secs = apr_strtok(buf, sep, &tok);