Fossil SCM
Resolve two 'db transaction never commits' warnings from /xfer in cases where it response to invalid inputs from the remote (found via libfossil testing).
Commit
bb8604921caf24e83b7f42459cda3d58c26e5efe30b9b2c1862ee20892ef9b0f
Parent
96c0fc9e88892fc…
1 file changed
+2
+2
| --- src/xfer.c | ||
| +++ src/xfer.c | ||
| @@ -1523,10 +1523,11 @@ | ||
| 1523 | 1523 | cgi_set_content_type("application/x-fossil-uncompressed"); |
| 1524 | 1524 | } |
| 1525 | 1525 | blob_is_int(&xfer.aToken[2], &seqno); |
| 1526 | 1526 | if( seqno<=0 ){ |
| 1527 | 1527 | xfer_fatal_error("invalid clone sequence number"); |
| 1528 | + db_rollback_transaction(); | |
| 1528 | 1529 | return; |
| 1529 | 1530 | } |
| 1530 | 1531 | max = db_int(0, "SELECT max(rid) FROM blob"); |
| 1531 | 1532 | while( xfer.mxSend>(int)blob_size(xfer.pOut) && seqno<=max){ |
| 1532 | 1533 | if( time(NULL) >= xfer.maxTime ) break; |
| @@ -1598,10 +1599,11 @@ | ||
| 1598 | 1599 | && blob_is_int(&xfer.aToken[2], &size) ){ |
| 1599 | 1600 | const char *zName = blob_str(&xfer.aToken[1]); |
| 1600 | 1601 | Blob content; |
| 1601 | 1602 | if( size<0 ){ |
| 1602 | 1603 | xfer_fatal_error("invalid config record"); |
| 1604 | + db_rollback_transaction(); | |
| 1603 | 1605 | return; |
| 1604 | 1606 | } |
| 1605 | 1607 | blob_zero(&content); |
| 1606 | 1608 | blob_extract(xfer.pIn, size, &content); |
| 1607 | 1609 | if( !g.perm.Admin ){ |
| 1608 | 1610 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -1523,10 +1523,11 @@ | |
| 1523 | cgi_set_content_type("application/x-fossil-uncompressed"); |
| 1524 | } |
| 1525 | blob_is_int(&xfer.aToken[2], &seqno); |
| 1526 | if( seqno<=0 ){ |
| 1527 | xfer_fatal_error("invalid clone sequence number"); |
| 1528 | return; |
| 1529 | } |
| 1530 | max = db_int(0, "SELECT max(rid) FROM blob"); |
| 1531 | while( xfer.mxSend>(int)blob_size(xfer.pOut) && seqno<=max){ |
| 1532 | if( time(NULL) >= xfer.maxTime ) break; |
| @@ -1598,10 +1599,11 @@ | |
| 1598 | && blob_is_int(&xfer.aToken[2], &size) ){ |
| 1599 | const char *zName = blob_str(&xfer.aToken[1]); |
| 1600 | Blob content; |
| 1601 | if( size<0 ){ |
| 1602 | xfer_fatal_error("invalid config record"); |
| 1603 | return; |
| 1604 | } |
| 1605 | blob_zero(&content); |
| 1606 | blob_extract(xfer.pIn, size, &content); |
| 1607 | if( !g.perm.Admin ){ |
| 1608 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -1523,10 +1523,11 @@ | |
| 1523 | cgi_set_content_type("application/x-fossil-uncompressed"); |
| 1524 | } |
| 1525 | blob_is_int(&xfer.aToken[2], &seqno); |
| 1526 | if( seqno<=0 ){ |
| 1527 | xfer_fatal_error("invalid clone sequence number"); |
| 1528 | db_rollback_transaction(); |
| 1529 | return; |
| 1530 | } |
| 1531 | max = db_int(0, "SELECT max(rid) FROM blob"); |
| 1532 | while( xfer.mxSend>(int)blob_size(xfer.pOut) && seqno<=max){ |
| 1533 | if( time(NULL) >= xfer.maxTime ) break; |
| @@ -1598,10 +1599,11 @@ | |
| 1599 | && blob_is_int(&xfer.aToken[2], &size) ){ |
| 1600 | const char *zName = blob_str(&xfer.aToken[1]); |
| 1601 | Blob content; |
| 1602 | if( size<0 ){ |
| 1603 | xfer_fatal_error("invalid config record"); |
| 1604 | db_rollback_transaction(); |
| 1605 | return; |
| 1606 | } |
| 1607 | blob_zero(&content); |
| 1608 | blob_extract(xfer.pIn, size, &content); |
| 1609 | if( !g.perm.Admin ){ |
| 1610 |