for bug #235, use constructor and destructor for block and digest.
正在显示
2 个修改的文件
包含
110 行增加
和
140 行删除
| @@ -292,54 +292,44 @@ namespace _srs_internal | @@ -292,54 +292,44 @@ namespace _srs_internal | ||
| 292 | return ret; | 292 | return ret; |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | - void key_block::init() | 295 | + key_block::key_block() |
| 296 | { | 296 | { |
| 297 | - key_block* key = this; | 297 | + offset = (int32_t)rand(); |
| 298 | + random0 = NULL; | ||
| 299 | + random1 = NULL; | ||
| 298 | 300 | ||
| 299 | - key->offset = (int32_t)rand(); | ||
| 300 | - key->random0 = NULL; | ||
| 301 | - key->random1 = NULL; | 301 | + int valid_offset = calc_valid_offset(); |
| 302 | + srs_assert(valid_offset >= 0); | ||
| 302 | 303 | ||
| 303 | - int offset = key->offsets(); | ||
| 304 | - srs_assert(offset >= 0); | ||
| 305 | - | ||
| 306 | - key->random0_size = offset; | ||
| 307 | - if (key->random0_size > 0) { | ||
| 308 | - key->random0 = new char[key->random0_size]; | ||
| 309 | - srs_random_generate(key->random0, key->random0_size); | ||
| 310 | - snprintf(key->random0, key->random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | 304 | + random0_size = valid_offset; |
| 305 | + if (random0_size > 0) { | ||
| 306 | + random0 = new char[random0_size]; | ||
| 307 | + srs_random_generate(random0, random0_size); | ||
| 308 | + snprintf(random0, random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | ||
| 311 | } | 309 | } |
| 312 | 310 | ||
| 313 | - srs_random_generate(key->key, sizeof(key->key)); | 311 | + srs_random_generate(key, sizeof(key)); |
| 314 | 312 | ||
| 315 | - key->random1_size = 764 - offset - 128 - 4; | ||
| 316 | - if (key->random1_size > 0) { | ||
| 317 | - key->random1 = new char[key->random1_size]; | ||
| 318 | - srs_random_generate(key->random1, key->random1_size); | ||
| 319 | - snprintf(key->random1, key->random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | 313 | + random1_size = 764 - valid_offset - 128 - 4; |
| 314 | + if (random1_size > 0) { | ||
| 315 | + random1 = new char[random1_size]; | ||
| 316 | + srs_random_generate(random1, random1_size); | ||
| 317 | + snprintf(random1, random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | ||
| 320 | } | 318 | } |
| 321 | } | 319 | } |
| 322 | 320 | ||
| 323 | - int key_block::offsets() | 321 | + key_block::~key_block() |
| 324 | { | 322 | { |
| 325 | - key_block* key = this; | ||
| 326 | - | ||
| 327 | - int max_offset_size = 764 - 128 - 4; | ||
| 328 | - | ||
| 329 | - int offset = 0; | ||
| 330 | - u_int8_t* pp = (u_int8_t*)&key->offset; | ||
| 331 | - offset += *pp++; | ||
| 332 | - offset += *pp++; | ||
| 333 | - offset += *pp++; | ||
| 334 | - offset += *pp++; | ||
| 335 | - | ||
| 336 | - return offset % max_offset_size; | 323 | + if (random0) { |
| 324 | + srs_freep(random0); | ||
| 325 | + } | ||
| 326 | + if (random1) { | ||
| 327 | + srs_freep(random1); | ||
| 328 | + } | ||
| 337 | } | 329 | } |
| 338 | 330 | ||
| 339 | int key_block::parse(SrsStream* stream) | 331 | int key_block::parse(SrsStream* stream) |
| 340 | { | 332 | { |
| 341 | - key_block* key = this; | ||
| 342 | - | ||
| 343 | int ret = ERROR_SUCCESS; | 333 | int ret = ERROR_SUCCESS; |
| 344 | 334 | ||
| 345 | // the key must be 764 bytes. | 335 | // the key must be 764 bytes. |
| @@ -347,148 +337,138 @@ namespace _srs_internal | @@ -347,148 +337,138 @@ namespace _srs_internal | ||
| 347 | 337 | ||
| 348 | // read the last offset first, 760-763 | 338 | // read the last offset first, 760-763 |
| 349 | stream->skip(764 - sizeof(int32_t)); | 339 | stream->skip(764 - sizeof(int32_t)); |
| 350 | - key->offset = stream->read_4bytes(); | 340 | + offset = stream->read_4bytes(); |
| 351 | 341 | ||
| 352 | // reset stream to read others. | 342 | // reset stream to read others. |
| 353 | stream->skip(-764); | 343 | stream->skip(-764); |
| 354 | 344 | ||
| 355 | // TODO: FIXME: free it. | 345 | // TODO: FIXME: free it. |
| 356 | - key->random0 = NULL; | ||
| 357 | - key->random1 = NULL; | 346 | + random0 = NULL; |
| 347 | + random1 = NULL; | ||
| 358 | 348 | ||
| 359 | - int offset = key->offsets(); | ||
| 360 | - srs_assert(offset >= 0); | 349 | + int valid_offset = calc_valid_offset(); |
| 350 | + srs_assert(valid_offset >= 0); | ||
| 361 | 351 | ||
| 362 | - key->random0_size = offset; | ||
| 363 | - if (key->random0_size > 0) { | ||
| 364 | - key->random0 = new char[key->random0_size]; | ||
| 365 | - stream->read_bytes(key->random0, key->random0_size); | 352 | + random0_size = valid_offset; |
| 353 | + if (random0_size > 0) { | ||
| 354 | + random0 = new char[random0_size]; | ||
| 355 | + stream->read_bytes(random0, random0_size); | ||
| 366 | } | 356 | } |
| 367 | 357 | ||
| 368 | - stream->read_bytes(key->key, 128); | 358 | + stream->read_bytes(key, 128); |
| 369 | 359 | ||
| 370 | - key->random1_size = 764 - offset - 128 - 4; | ||
| 371 | - if (key->random1_size > 0) { | ||
| 372 | - key->random1 = new char[key->random1_size]; | ||
| 373 | - stream->read_bytes(key->random1, key->random1_size); | 360 | + random1_size = 764 - valid_offset - 128 - 4; |
| 361 | + if (random1_size > 0) { | ||
| 362 | + random1 = new char[random1_size]; | ||
| 363 | + stream->read_bytes(random1, random1_size); | ||
| 374 | } | 364 | } |
| 375 | 365 | ||
| 376 | return ret; | 366 | return ret; |
| 377 | } | 367 | } |
| 378 | 368 | ||
| 379 | - void key_block::free() | 369 | + int key_block::calc_valid_offset() |
| 380 | { | 370 | { |
| 381 | - key_block* key = this; | 371 | + int max_offset_size = 764 - 128 - 4; |
| 382 | 372 | ||
| 383 | - if (key->random0) { | ||
| 384 | - srs_freep(key->random0); | ||
| 385 | - } | ||
| 386 | - if (key->random1) { | ||
| 387 | - srs_freep(key->random1); | ||
| 388 | - } | 373 | + int valid_offset = 0; |
| 374 | + u_int8_t* pp = (u_int8_t*)&offset; | ||
| 375 | + valid_offset += *pp++; | ||
| 376 | + valid_offset += *pp++; | ||
| 377 | + valid_offset += *pp++; | ||
| 378 | + valid_offset += *pp++; | ||
| 379 | + | ||
| 380 | + return valid_offset % max_offset_size; | ||
| 389 | } | 381 | } |
| 390 | 382 | ||
| 391 | - void digest_block::init() | 383 | + digest_block::digest_block() |
| 392 | { | 384 | { |
| 393 | - digest_block* digest = this; | 385 | + offset = (int32_t)rand(); |
| 386 | + random0 = NULL; | ||
| 387 | + random1 = NULL; | ||
| 394 | 388 | ||
| 395 | - digest->offset = (int32_t)rand(); | ||
| 396 | - digest->random0 = NULL; | ||
| 397 | - digest->random1 = NULL; | 389 | + int valid_offset = calc_valid_offset(); |
| 390 | + srs_assert(valid_offset >= 0); | ||
| 398 | 391 | ||
| 399 | - int offset = digest->offsets(); | ||
| 400 | - srs_assert(offset >= 0); | ||
| 401 | - | ||
| 402 | - digest->random0_size = offset; | ||
| 403 | - if (digest->random0_size > 0) { | ||
| 404 | - digest->random0 = new char[digest->random0_size]; | ||
| 405 | - srs_random_generate(digest->random0, digest->random0_size); | ||
| 406 | - snprintf(digest->random0, digest->random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | 392 | + random0_size = valid_offset; |
| 393 | + if (random0_size > 0) { | ||
| 394 | + random0 = new char[random0_size]; | ||
| 395 | + srs_random_generate(random0, random0_size); | ||
| 396 | + snprintf(random0, random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | ||
| 407 | } | 397 | } |
| 408 | 398 | ||
| 409 | - srs_random_generate(digest->digest, sizeof(digest->digest)); | 399 | + srs_random_generate(digest, sizeof(digest)); |
| 410 | 400 | ||
| 411 | - digest->random1_size = 764 - 4 - offset - 32; | ||
| 412 | - if (digest->random1_size > 0) { | ||
| 413 | - digest->random1 = new char[digest->random1_size]; | ||
| 414 | - srs_random_generate(digest->random1, digest->random1_size); | ||
| 415 | - snprintf(digest->random1, digest->random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | 401 | + random1_size = 764 - 4 - valid_offset - 32; |
| 402 | + if (random1_size > 0) { | ||
| 403 | + random1 = new char[random1_size]; | ||
| 404 | + srs_random_generate(random1, random1_size); | ||
| 405 | + snprintf(random1, random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); | ||
| 416 | } | 406 | } |
| 417 | } | 407 | } |
| 418 | 408 | ||
| 419 | - int digest_block::offsets() | 409 | + digest_block::~digest_block() |
| 420 | { | 410 | { |
| 421 | - digest_block* digest = this; | ||
| 422 | - | ||
| 423 | - int max_offset_size = 764 - 32 - 4; | ||
| 424 | - | ||
| 425 | - int offset = 0; | ||
| 426 | - u_int8_t* pp = (u_int8_t*)&digest->offset; | ||
| 427 | - offset += *pp++; | ||
| 428 | - offset += *pp++; | ||
| 429 | - offset += *pp++; | ||
| 430 | - offset += *pp++; | ||
| 431 | - | ||
| 432 | - return offset % max_offset_size; | 411 | + if (random0) { |
| 412 | + srs_freep(random0); | ||
| 413 | + } | ||
| 414 | + if (random1) { | ||
| 415 | + srs_freep(random1); | ||
| 416 | + } | ||
| 433 | } | 417 | } |
| 434 | 418 | ||
| 435 | int digest_block::parse(SrsStream* stream) | 419 | int digest_block::parse(SrsStream* stream) |
| 436 | { | 420 | { |
| 437 | - digest_block* digest = this; | ||
| 438 | - | ||
| 439 | int ret = ERROR_SUCCESS; | 421 | int ret = ERROR_SUCCESS; |
| 440 | 422 | ||
| 441 | // the digest must be 764 bytes. | 423 | // the digest must be 764 bytes. |
| 442 | srs_assert(stream->require(764)); | 424 | srs_assert(stream->require(764)); |
| 443 | 425 | ||
| 444 | - digest->offset = stream->read_4bytes(); | 426 | + offset = stream->read_4bytes(); |
| 445 | 427 | ||
| 446 | // TODO: FIXME: free it. | 428 | // TODO: FIXME: free it. |
| 447 | - digest->random0 = NULL; | ||
| 448 | - digest->random1 = NULL; | 429 | + random0 = NULL; |
| 430 | + random1 = NULL; | ||
| 449 | 431 | ||
| 450 | - int offset = digest->offsets(); | ||
| 451 | - srs_assert(offset >= 0); | 432 | + int valid_offset = calc_valid_offset(); |
| 433 | + srs_assert(valid_offset >= 0); | ||
| 452 | 434 | ||
| 453 | - digest->random0_size = offset; | ||
| 454 | - if (digest->random0_size > 0) { | ||
| 455 | - digest->random0 = new char[digest->random0_size]; | ||
| 456 | - stream->read_bytes(digest->random0, digest->random0_size); | 435 | + random0_size = valid_offset; |
| 436 | + if (random0_size > 0) { | ||
| 437 | + random0 = new char[random0_size]; | ||
| 438 | + stream->read_bytes(random0, random0_size); | ||
| 457 | } | 439 | } |
| 458 | 440 | ||
| 459 | - stream->read_bytes(digest->digest, 32); | 441 | + stream->read_bytes(digest, 32); |
| 460 | 442 | ||
| 461 | - digest->random1_size = 764 - 4 - offset - 32; | ||
| 462 | - if (digest->random1_size > 0) { | ||
| 463 | - digest->random1 = new char[digest->random1_size]; | ||
| 464 | - stream->read_bytes(digest->random1, digest->random1_size); | 443 | + random1_size = 764 - 4 - valid_offset - 32; |
| 444 | + if (random1_size > 0) { | ||
| 445 | + random1 = new char[random1_size]; | ||
| 446 | + stream->read_bytes(random1, random1_size); | ||
| 465 | } | 447 | } |
| 466 | 448 | ||
| 467 | return ret; | 449 | return ret; |
| 468 | } | 450 | } |
| 469 | 451 | ||
| 470 | - void digest_block::free() | 452 | + int digest_block::calc_valid_offset() |
| 471 | { | 453 | { |
| 472 | - digest_block* digest = this; | 454 | + int max_offset_size = 764 - 32 - 4; |
| 473 | 455 | ||
| 474 | - if (digest->random0) { | ||
| 475 | - srs_freep(digest->random0); | ||
| 476 | - } | ||
| 477 | - if (digest->random1) { | ||
| 478 | - srs_freep(digest->random1); | ||
| 479 | - } | 456 | + int valid_offset = 0; |
| 457 | + u_int8_t* pp = (u_int8_t*)&offset; | ||
| 458 | + valid_offset += *pp++; | ||
| 459 | + valid_offset += *pp++; | ||
| 460 | + valid_offset += *pp++; | ||
| 461 | + valid_offset += *pp++; | ||
| 462 | + | ||
| 463 | + return valid_offset % max_offset_size; | ||
| 480 | } | 464 | } |
| 481 | 465 | ||
| 482 | c1s1_strategy::c1s1_strategy() | 466 | c1s1_strategy::c1s1_strategy() |
| 483 | { | 467 | { |
| 484 | - key.init(); | ||
| 485 | - digest.init(); | ||
| 486 | } | 468 | } |
| 487 | 469 | ||
| 488 | c1s1_strategy::~c1s1_strategy() | 470 | c1s1_strategy::~c1s1_strategy() |
| 489 | { | 471 | { |
| 490 | - key.free(); | ||
| 491 | - digest.free(); | ||
| 492 | } | 472 | } |
| 493 | 473 | ||
| 494 | char* c1s1_strategy::get_digest() | 474 | char* c1s1_strategy::get_digest() |
| @@ -133,22 +133,17 @@ namespace _srs_internal | @@ -133,22 +133,17 @@ namespace _srs_internal | ||
| 133 | // 4bytes | 133 | // 4bytes |
| 134 | int32_t offset; | 134 | int32_t offset; |
| 135 | public: | 135 | public: |
| 136 | - // create new key block data. | ||
| 137 | - // if created, user must free it by srs_key_block_free | ||
| 138 | - void init(); | ||
| 139 | - | ||
| 140 | - // calc the offset of key, | ||
| 141 | - // the key->offset cannot be used as the offset of key. | ||
| 142 | - int offsets(); | ||
| 143 | - | 136 | + key_block(); |
| 137 | + virtual ~key_block(); | ||
| 138 | + public: | ||
| 144 | // parse key block from c1s1. | 139 | // parse key block from c1s1. |
| 145 | // if created, user must free it by srs_key_block_free | 140 | // if created, user must free it by srs_key_block_free |
| 146 | // @stream contains c1s1_key_bytes the key start bytes | 141 | // @stream contains c1s1_key_bytes the key start bytes |
| 147 | int parse(SrsStream* stream); | 142 | int parse(SrsStream* stream); |
| 148 | - | ||
| 149 | - // free the block data create by | ||
| 150 | - // srs_key_block_init or srs_key_block_parse | ||
| 151 | - void free(); | 143 | + private: |
| 144 | + // calc the offset of key, | ||
| 145 | + // the key->offset cannot be used as the offset of key. | ||
| 146 | + int calc_valid_offset(); | ||
| 152 | }; | 147 | }; |
| 153 | 148 | ||
| 154 | /** | 149 | /** |
| @@ -176,22 +171,17 @@ namespace _srs_internal | @@ -176,22 +171,17 @@ namespace _srs_internal | ||
| 176 | char* random1; | 171 | char* random1; |
| 177 | int random1_size; | 172 | int random1_size; |
| 178 | public: | 173 | public: |
| 179 | - // create new digest block data. | ||
| 180 | - // if created, user must free it by srs_digest_block_free | ||
| 181 | - void init(); | ||
| 182 | - | ||
| 183 | - // calc the offset of digest, | ||
| 184 | - // the key->offset cannot be used as the offset of digest. | ||
| 185 | - int offsets(); | ||
| 186 | - | 174 | + digest_block(); |
| 175 | + virtual ~digest_block(); | ||
| 176 | + public: | ||
| 187 | // parse digest block from c1s1. | 177 | // parse digest block from c1s1. |
| 188 | // if created, user must free it by srs_digest_block_free | 178 | // if created, user must free it by srs_digest_block_free |
| 189 | // @stream contains c1s1_digest_bytes the digest start bytes | 179 | // @stream contains c1s1_digest_bytes the digest start bytes |
| 190 | int parse(SrsStream* stream); | 180 | int parse(SrsStream* stream); |
| 191 | - | ||
| 192 | - // free the block data create by | ||
| 193 | - // srs_digest_block_init or srs_digest_block_parse | ||
| 194 | - void free(); | 181 | + private: |
| 182 | + // calc the offset of digest, | ||
| 183 | + // the key->offset cannot be used as the offset of digest. | ||
| 184 | + int calc_valid_offset(); | ||
| 195 | }; | 185 | }; |
| 196 | 186 | ||
| 197 | class c1s1; | 187 | class c1s1; |
-
请 注册 或 登录 后发表评论