Changeset 5608:584b36c566e2 in roaraudio for libroar
- Timestamp:
- 07/31/12 15:31:35 (12 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- libroar
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/basic.c
r5471 r5608 510 510 return -1; 511 511 512 // specal hack to set an il egal value used internaly in libroar:512 // specal hack to set an illegal value used internaly in libroar: 513 513 if ( fh == -2 ) 514 514 fh = -1; … … 516 516 if ( roar_vio_open_fh_socket(con->viocon, fh) != -1 ) { 517 517 con->flags |= ROAR_CON_FLAGS_VIO; 518 } else { 519 return -1; 518 520 } 519 521 … … 543 545 544 546 struct roar_vio_calls * roar_get_connection_vio2 (struct roar_connection * con) { 545 if ( con == NULL ) 547 if ( con == NULL ) { 548 roar_err_set(ROAR_ERROR_FAULT); 546 549 return NULL; 550 } 547 551 548 552 if ( con->flags & ROAR_CON_FLAGS_VIO ) … … 551 555 // TODO: try to open the VIO. 552 556 557 roar_err_set(ROAR_ERROR_BADFH); 553 558 return NULL; 554 559 } -
libroar/ctl.c
r5462 r5608 161 161 int roar_get_client (struct roar_connection * con, struct roar_client * client, int id) { 162 162 struct roar_message m; 163 char * data = NULL; 164 int ret; 163 165 164 166 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy! … … 171 173 ROAR_DBG("roar_get_client(*): id = %i", id); 172 174 173 if ( roar_req(con, &m, NULL) == -1 )175 if ( roar_req(con, &m, &data) == -1 ) 174 176 return -1; 175 177 … … 179 181 ROAR_DBG("roar_get_client(*): got ok"); 180 182 181 return roar_ctl_m2c(&m, client); 183 ret = roar_ctl_m2c2(&m, client, data); 184 185 if ( data != NULL ) 186 roar_mm_free(data); 187 188 return ret; 182 189 } 183 190 … … 376 383 } 377 384 378 int roar_ctl_c2m (struct roar_message * m, struct roar_client * c) { 379 int cur = 0; 385 int roar_ctl_c2m2 (struct roar_message * m, struct roar_client * c, void ** data) { 386 char * d; 387 size_t cur = 0; 380 388 int h; 381 389 int i; 382 390 int max_len; 383 391 uint32_t pid; 384 signed long int len_rest;385 392 size_t nnode_len; 393 size_t needed_len = 3 + 5*4 + 18 /* 18 = current max size for blob */; 386 394 387 395 if ( c == NULL ) 388 396 return -1; 389 397 390 m->data[cur++] = 0; // 0: Version 391 m->data[cur++] = c->execed; // 1: execed 398 if ( data != NULL ) 399 *data = NULL; 400 401 max_len = strlen(c->name); 402 needed_len += max_len; 403 404 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) 405 if ( c->streams[i] != -1 ) 406 needed_len++; 407 408 if ( needed_len > sizeof(m->data) ) { 409 if ( data == NULL ) { 410 needed_len -= max_len; 411 if ( needed_len > sizeof(m->data) ) { 412 roar_panic(ROAR_FATAL_ERROR_CPU_FAILURE, "needed_len > sizeof(m->data) happend."); 413 roar_err_set(ROAR_ERROR_BADCKSUM); 414 return -1; 415 } 416 max_len = sizeof(m->data) - needed_len; 417 needed_len = sizeof(m->data); 418 d = m->data; 419 } else { 420 d = roar_mm_malloc(needed_len); 421 if ( d == NULL ) 422 return -1; 423 *data = d; 424 } 425 } else { 426 d = m->data; 427 } 428 429 d[cur++] = 0; // 0: Version 430 d[cur++] = c->execed; // 1: execed 392 431 393 432 h = 0; 394 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) {433 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) 395 434 if ( c->streams[i] != -1 ) 396 m->data[cur+1+h++] = c->streams[i]; 397 } 398 399 m->data[cur++] = h; // 2: num of streams 435 d[cur+1+h++] = c->streams[i]; 436 437 d[cur++] = h; // 2: num of streams 400 438 cur += h; 401 402 max_len = strlen(c->name);403 439 404 440 // TODO: add some code to check if this fits in the pkg … … 406 442 // and fully decieded about this function. 407 443 408 m->data[cur++] = max_len;409 410 strncpy( (m->data)+cur, c->name, max_len);444 d[cur++] = max_len; 445 446 strncpy(d+cur, c->name, max_len); 411 447 412 448 cur += max_len; 413 449 414 450 pid = ROAR_HOST2NET32(c->pid); 415 memcpy(&( m->data[cur]), &pid, 4);451 memcpy(&(d[cur]), &pid, 4); 416 452 cur += 4; 417 453 418 454 pid = ROAR_HOST2NET32(c->uid); 419 memcpy(&( m->data[cur]), &pid, 4);455 memcpy(&(d[cur]), &pid, 4); 420 456 cur += 4; 421 457 422 458 pid = ROAR_HOST2NET32(c->gid); 423 memcpy(&( m->data[cur]), &pid, 4);459 memcpy(&(d[cur]), &pid, 4); 424 460 cur += 4; 425 461 426 462 pid = ROAR_HOST2NET32(c->proto); 427 memcpy(&( m->data[cur]), &pid, 4);463 memcpy(&(d[cur]), &pid, 4); 428 464 cur += 4; 429 465 430 466 pid = ROAR_HOST2NET32(c->byteorder); 431 memcpy(&( m->data[cur]), &pid, 4);467 memcpy(&(d[cur]), &pid, 4); 432 468 cur += 4; 433 469 434 len_rest = (long int)sizeof(m->data) - (long int)cur; 435 if ( len_rest < 0 ) { 470 if ( cur > needed_len ) { 436 471 roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL); 437 472 } 438 473 439 nnode_len = len_rest;440 if ( roar_nnode_to_blob(&(c->nnode), &( m->data[cur]), &nnode_len) == 0 ) {474 nnode_len = needed_len - cur; 475 if ( roar_nnode_to_blob(&(c->nnode), &(d[cur]), &nnode_len) == 0 ) { 441 476 cur += nnode_len; 442 477 } 443 478 479 if ( cur > needed_len ) { 480 roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL); 481 } 482 444 483 m->datalen = cur; 445 484 … … 447 486 } 448 487 449 int roar_ctl_m2c (struct roar_message * m, struct roar_client * c) { 488 int roar_ctl_m2c2 (struct roar_message * m, struct roar_client * c, void * data) { 489 char * d = data; 450 490 uint32_t pid; 451 491 size_t len; … … 463 503 } 464 504 505 if ( d == NULL ) { 506 if ( m->datalen > sizeof(m->data) ) { 507 roar_err_set(ROAR_ERROR_FAULT); 508 return -1; 509 } 510 d = m->data; 511 } 512 465 513 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen); 466 514 467 if ( m->data[0] != 0 ) {515 if ( d[0] != 0 ) { 468 516 ROAR_DBG("roar_ctl_m2c(*): wrong version!"); 469 517 roar_err_set(ROAR_ERROR_NSVERSION); … … 478 526 ROAR_DBG("roar_ctl_m2c(*): have usable data!"); 479 527 480 c->execed = m->data[1];528 c->execed = d[1]; 481 529 482 530 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) 483 531 c->streams[i] = -1; 484 532 485 if ( m->data[2] < 0 || m->data[2] > ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT ) {533 if ( d[2] < 0 || d[2] > ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT ) { 486 534 roar_err_set(ROAR_ERROR_TOOMANYARGS); 487 535 return -1; 488 536 } 489 537 490 for (i = 0; i < m->data[2]; i++) 491 c->streams[i] = m->data[3+i]; 492 493 cur = 3 + m->data[2]; 494 495 strncpy(c->name, (m->data)+cur+1, m->data[cur]); 496 c->name[(int)m->data[cur]] = 0; 497 498 cur += m->data[cur] + 1; 499 500 memcpy(&pid, &(m->data[cur]), 4); 538 for (i = 0; i < d[2]; i++) 539 c->streams[i] = d[3+i]; 540 541 cur = 3 + d[2]; 542 543 // check length here! 544 strncpy(c->name, d+cur+1, d[cur] > (sizeof(c->name)-1) ? sizeof(c->name)-1 : d[cur]); 545 c->name[(size_t)d[cur] > (sizeof(c->name)-1) ? sizeof(c->name)-1 : (size_t)d[cur]] = 0; 546 547 cur += d[cur] + 1; 548 549 memcpy(&pid, &(d[cur]), 4); 501 550 c->pid = ROAR_NET2HOST32(pid); 502 551 cur += 4; 503 552 504 memcpy(&pid, &( m->data[cur]), 4);553 memcpy(&pid, &(d[cur]), 4); 505 554 c->uid = ROAR_NET2HOST32(pid); 506 555 cur += 4; 507 556 508 memcpy(&pid, &( m->data[cur]), 4);557 memcpy(&pid, &(d[cur]), 4); 509 558 c->gid = ROAR_NET2HOST32(pid); 510 559 cur += 4; 511 560 512 561 if ( m->datalen >= cur+4 ) { 513 memcpy(&pid, &( m->data[cur]), 4);562 memcpy(&pid, &(d[cur]), 4); 514 563 c->proto = ROAR_NET2HOST32(pid); 515 564 cur += 4; … … 519 568 520 569 if ( m->datalen >= cur+4 ) { 521 memcpy(&pid, &( m->data[cur]), 4);570 memcpy(&pid, &(d[cur]), 4); 522 571 c->byteorder = ROAR_NET2HOST32(pid); 523 572 cur += 4; … … 528 577 if ( m->datalen > cur ) { 529 578 len = m->datalen - cur; 530 if ( roar_nnode_from_blob(&(c->nnode), &( m->data[cur]), &len) == 0 ) {579 if ( roar_nnode_from_blob(&(c->nnode), &(d[cur]), &len) == 0 ) { 531 580 cur += len; 532 581 } else { … … 540 589 541 590 return 0; 591 } 592 593 int roar_ctl_c2m (struct roar_message * m, struct roar_client * c) { 594 return roar_ctl_c2m2(m, c, NULL); 595 } 596 int roar_ctl_m2c (struct roar_message * m, struct roar_client * c) { 597 return roar_ctl_m2c2(m, c, NULL); 542 598 } 543 599 -
libroar/proto.c
r5467 r5608 148 148 } 149 149 150 static inline int _libroar_msgresyncer(struct roar_vio_calls * vio, size_t len) { 151 char buffer[2*LIBROAR_BUFFER_MSGDATA]; // this is always called with len > LIBROAR_BUFFER_MSGDATA. 152 ssize_t ret; 153 size_t errorc = 0; 154 155 while (len && errorc < 4) { 156 ret = roar_vio_read(vio, buffer, len > sizeof(buffer) ? sizeof(buffer) : len); 157 if ( ret == (size_t)-1 ) { 158 errorc++; 159 } else { 160 errorc = 0; 161 len -= ret; 162 } 163 } 164 165 if ( len ) 166 return -1; // last error is still set. 167 return 0; 168 } 169 150 170 int roar_vrecv_message2(struct roar_vio_calls * vio, struct roar_message * mes, char ** data, 151 171 struct roar_error_frame * errorframe) { … … 269 289 } else { 270 290 if ( data == NULL ) { 271 roar_err_set(ROAR_ERROR_MSGSIZE); 291 if ( _libroar_msgresyncer(vio, mes->datalen) == -1 ) { 292 roar_err_set(ROAR_ERROR_BADCKSUM); 293 } else { 294 roar_err_set(ROAR_ERROR_MSGSIZE); 295 } 272 296 return -1; 273 297 } 274 298 275 299 if ( (*data = roar_mm_malloc(mes->datalen)) == NULL ) { 276 roar_err_set(ROAR_ERROR_NOMEM); 300 if ( _libroar_msgresyncer(vio, mes->datalen) == -1 ) { 301 roar_err_set(ROAR_ERROR_BADCKSUM); 302 } else { 303 roar_err_set(ROAR_ERROR_NOMEM); 304 } 277 305 return -1; 278 306 }
Note: See TracChangeset
for help on using the changeset viewer.