winlin

for bug #235, use constructor and destructor for block and digest.

@@ -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;