aboutsummaryrefslogtreecommitdiff
path: root/src/func.c
diff options
context:
space:
mode:
authordrh <>2023-06-30 11:51:36 +0000
committerdrh <>2023-06-30 11:51:36 +0000
commit60f41362cfa65da5baa992367156f67d738e1be3 (patch)
tree04c36b70ac2f3fbaf19618f22654bb582426c6a5 /src/func.c
parent2ddfa6a360ede3e370201b9f45737f8a350be198 (diff)
downloadsqlite-60f41362cfa65da5baa992367156f67d738e1be3.tar.gz
sqlite-60f41362cfa65da5baa992367156f67d738e1be3.zip
Make the sum() function less precise and slower in order to avoid
harmless signed integer overflow UBSAN warnings from OSS-Fuzz. FossilOrigin-Name: 1be0646a2c352dbf03d2af87fd48b6f9edfd68666790ac6863144ac95f3e0621
Diffstat (limited to 'src/func.c')
-rw-r--r--src/func.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/func.c b/src/func.c
index c505c37d6..75a07e63f 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1740,8 +1740,13 @@ static void sumFinalize(sqlite3_context *context){
if( p->approx ){
sqlite3_result_double(context, p->rSum[0]+p->rSum[1]);
}else{
- i64 v = (i64)p->rSum[0] + (i64)p->rSum[1];
+ double r = p->rSum[0] + p->rSum[1];
+ i64 v;
double y[2], z[2];
+ v = sqlite3RealToI64(p->rSum[0]);
+ if( sqlite3AddInt64(&v, sqlite3RealToI64(p->rSum[1])) ){
+ v = 0;
+ }
sqlite3DDFromInt(v, y);
sqlite3DDSub(y[0], y[1], p->rSum[0], p->rSum[1], z);
if( z[0] + z[1] != 0.0 ){