winlin

fix bug #36: never directly use *(int32_t*) to convert, for arm may not support

@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "91" 34 +#define VERSION_REVISION "92"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "srs" 37 #define RTMP_SIG_SRS_KEY "srs"
@@ -232,3 +232,11 @@ void SrsStream::write_string(std::string value) @@ -232,3 +232,11 @@ void SrsStream::write_string(std::string value)
232 p += value.length(); 232 p += value.length();
233 } 233 }
234 234
  235 +void SrsStream::write_bytes(char* data, int size)
  236 +{
  237 + srs_assert(require(size));
  238 +
  239 + memcpy(p, data, size);
  240 + p += size;
  241 +}
  242 +
@@ -129,6 +129,10 @@ public: @@ -129,6 +129,10 @@ public:
129 * write string to stream 129 * write string to stream
130 */ 130 */
131 virtual void write_string(std::string value); 131 virtual void write_string(std::string value);
  132 + /**
  133 + * write bytes to stream
  134 + */
  135 + virtual void write_bytes(char* data, int size);
132 }; 136 };
133 137
134 #endif 138 #endif
@@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 #include <srs_protocol_io.hpp> 31 #include <srs_protocol_io.hpp>
32 #include <srs_protocol_utility.hpp> 32 #include <srs_protocol_utility.hpp>
33 #include <srs_protocol_rtmp.hpp> 33 #include <srs_protocol_rtmp.hpp>
  34 +#include <srs_kernel_stream.hpp>
34 35
35 #ifdef SRS_AUTO_SSL 36 #ifdef SRS_AUTO_SSL
36 37
@@ -230,6 +231,26 @@ namespace srs @@ -230,6 +231,26 @@ namespace srs
230 return ret; 231 return ret;
231 } 232 }
232 233
  234 + // read/write stream using SrsStream.
  235 + void __srs_stream_write_4bytes(char* pp, int32_t value)
  236 + {
  237 + static SrsStream stream;
  238 +
  239 + int ret = stream.initialize(pp, 4);
  240 + srs_assert(ret == ERROR_SUCCESS);
  241 +
  242 + stream.write_4bytes(value);
  243 + }
  244 + int32_t __srs_stream_read_4bytes(char* pp)
  245 + {
  246 + static SrsStream stream;
  247 +
  248 + int ret = stream.initialize(pp, 4);
  249 + srs_assert(ret == ERROR_SUCCESS);
  250 +
  251 + return stream.read_4bytes();
  252 + }
  253 +
233 // calc the offset of key, 254 // calc the offset of key,
234 // the key->offset cannot be used as the offset of key. 255 // the key->offset cannot be used as the offset of key.
235 int srs_key_block_get_offset(key_block* key) 256 int srs_key_block_get_offset(key_block* key)
@@ -282,7 +303,7 @@ namespace srs @@ -282,7 +303,7 @@ namespace srs
282 char* pp = c1s1_key_bytes + 764; 303 char* pp = c1s1_key_bytes + 764;
283 304
284 pp -= sizeof(int32_t); 305 pp -= sizeof(int32_t);
285 - key->offset = *(int32_t*)pp; 306 + key->offset = __srs_stream_read_4bytes(pp);
286 307
287 key->random0 = NULL; 308 key->random0 = NULL;
288 key->random1 = NULL; 309 key->random1 = NULL;
@@ -373,7 +394,7 @@ namespace srs @@ -373,7 +394,7 @@ namespace srs
373 394
374 char* pp = c1s1_digest_bytes; 395 char* pp = c1s1_digest_bytes;
375 396
376 - digest->offset = *(int32_t*)pp; 397 + digest->offset = __srs_stream_read_4bytes(pp);
377 pp += sizeof(int32_t); 398 pp += sizeof(int32_t);
378 399
379 digest->random0 = NULL; 400 digest->random0 = NULL;
@@ -416,13 +437,13 @@ namespace srs @@ -416,13 +437,13 @@ namespace srs
416 void __srs_time_copy_to(char*& pp, int32_t time) 437 void __srs_time_copy_to(char*& pp, int32_t time)
417 { 438 {
418 // 4bytes time 439 // 4bytes time
419 - *(int32_t*)pp = time; 440 + __srs_stream_write_4bytes(pp, time);
420 pp += 4; 441 pp += 4;
421 } 442 }
422 void __srs_version_copy_to(char*& pp, int32_t version) 443 void __srs_version_copy_to(char*& pp, int32_t version)
423 { 444 {
424 // 4bytes version 445 // 4bytes version
425 - *(int32_t*)pp = version; 446 + __srs_stream_write_4bytes(pp, version);
426 pp += 4; 447 pp += 4;
427 } 448 }
428 void __srs_key_copy_to(char*& pp, key_block* key) 449 void __srs_key_copy_to(char*& pp, key_block* key)
@@ -441,16 +462,17 @@ namespace srs @@ -441,16 +462,17 @@ namespace srs
441 } 462 }
442 pp += key->random1_size; 463 pp += key->random1_size;
443 464
444 - *(int32_t*)pp = key->offset; 465 + __srs_stream_write_4bytes(pp, key->offset);
445 pp += 4; 466 pp += 4;
446 } 467 }
447 void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) 468 void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest)
448 { 469 {
449 // 732bytes digest block without the 32bytes digest-data 470 // 732bytes digest block without the 32bytes digest-data
450 // nbytes digest block part1 471 // nbytes digest block part1
451 - *(int32_t*)pp = digest->offset; 472 + __srs_stream_write_4bytes(pp, digest->offset);
452 pp += 4; 473 pp += 4;
453 474
  475 + // digest random padding.
454 if (digest->random0_size > 0) { 476 if (digest->random0_size > 0) {
455 memcpy(pp, digest->random0, digest->random0_size); 477 memcpy(pp, digest->random0, digest->random0_size);
456 } 478 }
@@ -720,8 +742,9 @@ namespace srs @@ -720,8 +742,9 @@ namespace srs
720 742
721 destroy_blocks(); 743 destroy_blocks();
722 744
723 - time = *(int32_t*)_c1s1;  
724 - version = *(int32_t*)(_c1s1 + 4); // client c1 version 745 +
  746 + time = __srs_stream_read_4bytes(_c1s1);
  747 + version = __srs_stream_read_4bytes(_c1s1 + 4); // client c1 version
725 748
726 if (_schema == srs_schema0) { 749 if (_schema == srs_schema0) {
727 if ((ret = srs_key_block_parse(&block0.key, _c1s1 + 8)) != ERROR_SUCCESS) { 750 if ((ret = srs_key_block_parse(&block0.key, _c1s1 + 8)) != ERROR_SUCCESS) {
@@ -766,9 +789,11 @@ namespace srs @@ -766,9 +789,11 @@ namespace srs
766 789
767 destroy_blocks(); 790 destroy_blocks();
768 791
  792 + // client c1 time and version
769 time = ::time(NULL); 793 time = ::time(NULL);
770 - version = 0x00000000; // client c1 version 794 + version = 0x80000702; // client c1 version
771 795
  796 + // generate signature by schema
772 if (_schema == srs_schema0) { 797 if (_schema == srs_schema0) {
773 srs_key_block_init(&block0.key); 798 srs_key_block_init(&block0.key);
774 srs_digest_block_init(&block1.digest); 799 srs_digest_block_init(&block1.digest);
@@ -779,6 +804,7 @@ namespace srs @@ -779,6 +804,7 @@ namespace srs
779 804
780 schema = _schema; 805 schema = _schema;
781 806
  807 + // generate digest
782 char* digest = NULL; 808 char* digest = NULL;
783 809
784 if ((ret = calc_c1_digest(digest)) != ERROR_SUCCESS) { 810 if ((ret = calc_c1_digest(digest)) != ERROR_SUCCESS) {
@@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 #include <srs_protocol_handshake.hpp> 31 #include <srs_protocol_handshake.hpp>
32 #include <srs_protocol_rtmp_stack.hpp> 32 #include <srs_protocol_rtmp_stack.hpp>
33 #include <srs_protocol_utility.hpp> 33 #include <srs_protocol_utility.hpp>
  34 +#include <srs_kernel_stream.hpp>
34 35
35 using namespace std; 36 using namespace std;
36 37
@@ -268,9 +269,13 @@ int SrsHandshakeBytes::create_c0c1() @@ -268,9 +269,13 @@ int SrsHandshakeBytes::create_c0c1()
268 srs_random_generate(c0c1, 1537); 269 srs_random_generate(c0c1, 1537);
269 270
270 // plain text required. 271 // plain text required.
271 - c0c1[0] = 0x03;  
272 - *(int32_t*)(c0c1 + 1) = ::time(NULL);  
273 - *(int32_t*)(c0c1 + 1 + 4) = 0x00; 272 + static SrsStream stream;
  273 + if ((ret = stream.initialize(c0c1, 9)) != ERROR_SUCCESS) {
  274 + return ret;
  275 + }
  276 + stream.write_1bytes(0x03);
  277 + stream.write_4bytes(::time(NULL));
  278 + stream.write_4bytes(0x00);
274 279
275 return ret; 280 return ret;
276 } 281 }
@@ -287,11 +292,15 @@ int SrsHandshakeBytes::create_s0s1s2(const char* c1) @@ -287,11 +292,15 @@ int SrsHandshakeBytes::create_s0s1s2(const char* c1)
287 srs_random_generate(s0s1s2, 3073); 292 srs_random_generate(s0s1s2, 3073);
288 293
289 // plain text required. 294 // plain text required.
290 - s0s1s2[0] = 0x03;  
291 - *(int32_t*)(s0s1s2 + 1) = ::time(NULL); 295 + SrsStream stream;
  296 + if ((ret = stream.initialize(s0s1s2, 9)) != ERROR_SUCCESS) {
  297 + return ret;
  298 + }
  299 + stream.write_1bytes(0x03);
  300 + stream.write_4bytes(::time(NULL));
292 // s2 time2 copy from c1 301 // s2 time2 copy from c1
293 if (c0c1) { 302 if (c0c1) {
294 - *(int32_t*)(s0s1s2 + 1 + 4) = *(int32_t*)(c0c1 + 1); 303 + stream.write_bytes(c0c1 + 1, 4);
295 } 304 }
296 305
297 // if c1 specified, copy c1 to s2. 306 // if c1 specified, copy c1 to s2.
@@ -315,10 +324,14 @@ int SrsHandshakeBytes::create_c2() @@ -315,10 +324,14 @@ int SrsHandshakeBytes::create_c2()
315 srs_random_generate(c2, 1536); 324 srs_random_generate(c2, 1536);
316 325
317 // time 326 // time
318 - *(int32_t*)(c2) = ::time(NULL); 327 + SrsStream stream;
  328 + if ((ret = stream.initialize(c2, 8)) != ERROR_SUCCESS) {
  329 + return ret;
  330 + }
  331 + stream.write_4bytes(::time(NULL));
319 // c2 time2 copy from s1 332 // c2 time2 copy from s1
320 if (s0s1s2) { 333 if (s0s1s2) {
321 - *(int32_t*)(c2 + 4) = *(int32_t*)(s0s1s2 + 1); 334 + stream.write_bytes(s0s1s2 + 1, 4);
322 } 335 }
323 336
324 return ret; 337 return ret;
@@ -455,6 +468,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url) @@ -455,6 +468,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
455 SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); 468 SrsConnectAppPacket* pkt = new SrsConnectAppPacket();
456 469
457 pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); 470 pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
  471 + pkt->command_object->set("flashVer", SrsAmf0Any::str("WIN 12,0,0,41"));
458 pkt->command_object->set("swfUrl", SrsAmf0Any::str()); 472 pkt->command_object->set("swfUrl", SrsAmf0Any::str());
459 pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); 473 pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str()));
460 pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); 474 pkt->command_object->set("fpad", SrsAmf0Any::boolean(false));