static int chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell) { int rv = 0; tt_assert(ch); tt_assert(var_cell); if (test_chan_accept_cells) { /* Free the cell and bump the counter */ var_cell_free(var_cell); ++test_cells_written; rv = 1; } /* else return 0, we didn't accept it */ done: return rv; }
static void test_proto_var_cell(void *arg) { (void)arg; char *mem_op_hex_tmp = NULL; char tmp[1024]; buf_t *buf = NULL; var_cell_t *cell = NULL; buf = buf_new(); memset(tmp, 0xf0, sizeof(tmp)); /* Short little commands will make us say "no cell yet." */ tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); tt_ptr_op(cell, OP_EQ, NULL); buf_add(buf, "\x01\x02\x02\0x2", 4); tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); /* An incomplete fixed-length cell makes us say "no cell yet". */ buf_add(buf, "\x03", 1); tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); /* A complete fixed length-cell makes us say "not a variable-length cell" */ buf_add(buf, tmp, 509); tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); buf_clear(buf); /* An incomplete versions cell is a variable-length cell that isn't ready * yet. */ buf_add(buf, "\x01\x02\x03\x04" /* circid */ "\x07" /* VERSIONS */ "\x00\x04" /* 4 bytes long */ "\x00" /* incomplete */, 8); tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); tt_ptr_op(cell, OP_EQ, NULL); /* Complete it, and it's a variable-length cell. Leave a byte on the end for * fun. */ buf_add(buf, "\x09\x00\x25\ff", 4); tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); tt_ptr_op(cell, OP_NE, NULL); tt_int_op(cell->command, OP_EQ, CELL_VERSIONS); tt_uint_op(cell->circ_id, OP_EQ, 0x01020304); tt_int_op(cell->payload_len, OP_EQ, 4); test_mem_op_hex(cell->payload, OP_EQ, "00090025"); var_cell_free(cell); cell = NULL; tt_int_op(buf_datalen(buf), OP_EQ, 1); buf_clear(buf); /* In link protocol 3 and earlier, circid fields were two bytes long. Let's * ensure that gets handled correctly. */ buf_add(buf, "\x23\x45\x81\x00\x06" /* command 81; 6 bytes long */ "coraje", 11); tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 3)); tt_ptr_op(cell, OP_NE, NULL); tt_int_op(cell->command, OP_EQ, 129); tt_uint_op(cell->circ_id, OP_EQ, 0x2345); tt_int_op(cell->payload_len, OP_EQ, 6); tt_mem_op(cell->payload, OP_EQ, "coraje", 6); var_cell_free(cell); cell = NULL; tt_int_op(buf_datalen(buf), OP_EQ, 0); /* In link protocol 2, only VERSIONS cells counted as variable-length */ buf_add(buf, "\x23\x45\x81\x00\x06" "coraje", 11); /* As above */ tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); buf_clear(buf); buf_add(buf, "\x23\x45\x07\x00\x06" "futuro", 11); tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); tt_ptr_op(cell, OP_NE, NULL); tt_int_op(cell->command, OP_EQ, 7); tt_uint_op(cell->circ_id, OP_EQ, 0x2345); tt_int_op(cell->payload_len, OP_EQ, 6); tt_mem_op(cell->payload, OP_EQ, "futuro", 6); var_cell_free(cell); cell = NULL; done: buf_free(buf); var_cell_free(cell); tor_free(mem_op_hex_tmp); }