]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Properly compute the number or recv cells from deliver_window
authorMike Perry <mikeperry-git@torproject.org>
Wed, 1 Dec 2021 23:20:17 +0000 (23:20 +0000)
committerMike Perry <mikeperry-git@torproject.org>
Tue, 22 Feb 2022 19:28:35 +0000 (19:28 +0000)
Without this conversion, there is an implict 1000-recv_cells, which causes
the mod to fail if it is not a factor of 1000.

src/core/or/sendme.c

index ee670f9d5140fd01262ec4e5dc0869065c387053..9acef1cc20f72658eea2e2c40e73f03245bd5d94 100644 (file)
@@ -339,7 +339,7 @@ record_cell_digest_on_circ(circuit_t *circ, const uint8_t *sendme_digest)
  * updated once the cell is actually put in the outbuf.
  */
 static bool
-circuit_sendme_cell_is_next(int window, int sendme_inc)
+circuit_sendme_cell_is_next(int deliver_window, int sendme_inc)
 {
   /* Are we at the limit of the increment and if not, we don't expect next
    * cell is a SENDME.
@@ -348,8 +348,13 @@ circuit_sendme_cell_is_next(int window, int sendme_inc)
    * next cell is a SENDME, the window (either package or deliver) hasn't been
    * decremented just yet so when this is called, we are currently processing
    * the "window - 1" cell.
+   *
+   * Because deliver_window starts at CIRCWINDOW_START and counts down,
+   * to get the actual number of received cells for this check, we must
+   * first convert to receieved cells, or the modulus operator will fail.
    */
-  if (((window - 1) % sendme_inc) != 0) {
+  tor_assert(deliver_window <= CIRCWINDOW_START);
+  if (((CIRCWINDOW_START - (deliver_window - 1)) % sendme_inc) != 0) {
     return false;
   }