Mercurial > pidgin
comparison src/protocols/msn/msg.c @ 6827:1cfbb731aa1f
[gaim-migrate @ 7372]
Several fixes for attempted NULL pointer frees, and some MSNSLP fixes.
Still not ready for use yet.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Sun, 14 Sep 2003 01:59:09 +0000 |
| parents | 2adf21e70601 |
| children | a372cf34387e |
comparison
equal
deleted
inserted
replaced
| 6826:2adf21e70601 | 6827:1cfbb731aa1f |
|---|---|
| 34 while (*(tmp) && *(tmp) != '\r') \ | 34 while (*(tmp) && *(tmp) != '\r') \ |
| 35 (tmp)++; \ | 35 (tmp)++; \ |
| 36 if (*(tmp) != '\0') *(tmp)++ = '\0'; \ | 36 if (*(tmp) != '\0') *(tmp)++ = '\0'; \ |
| 37 if (*(tmp) == '\n') (tmp)++ | 37 if (*(tmp) == '\n') (tmp)++ |
| 38 | 38 |
| 39 | |
| 40 #define msn_put16(buf, data) ( \ | |
| 41 (*(buf) = (u_char)((data)>>8)&0xff), \ | |
| 42 (*((buf)+1) = (u_char)(data)&0xff), \ | |
| 43 2) | |
| 44 #define msn_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff)) | |
| 45 #define msn_put32(buf, data) ( \ | |
| 46 (*((buf)) = (u_char)((data)>>24)&0xff), \ | |
| 47 (*((buf)+1) = (u_char)((data)>>16)&0xff), \ | |
| 48 (*((buf)+2) = (u_char)((data)>>8)&0xff), \ | |
| 49 (*((buf)+3) = (u_char)(data)&0xff), \ | |
| 50 4) | |
| 51 #define msn_get32(buf) ((((*(buf))<<24)&0xff000000) + \ | |
| 52 (((*((buf)+1))<<16)&0x00ff0000) + \ | |
| 53 (((*((buf)+2))<< 8)&0x0000ff00) + \ | |
| 54 (((*((buf)+3) )&0x000000ff))) | |
| 55 | |
| 56 | |
| 39 /* | 57 /* |
| 40 * "MIME-Version: 1.0\r\n" == 19 | 58 * "MIME-Version: 1.0\r\n" == 19 |
| 41 * "Content-Type: " == 14 | 59 * "Content-Type: " == 14 |
| 42 * "\r\n" == 2 | 60 * "\r\n" == 2 |
| 43 * "\r\n" before body == 2 | 61 * "\r\n" before body == 2 |
| 197 tmp++; | 215 tmp++; |
| 198 | 216 |
| 199 memcpy(footer, tmp, 4); | 217 memcpy(footer, tmp, 4); |
| 200 | 218 |
| 201 /* Import the header. */ | 219 /* Import the header. */ |
| 202 memcpy(&msg->msnslp_header.session_id, tmp, 4); tmp += 4; | 220 msg->msnslp_header.session_id = msn_get32(tmp); tmp += 4; |
| 203 memcpy(&msg->msnslp_header.id, tmp, 4); tmp += 4; | 221 msg->msnslp_header.id = msn_get32(tmp); tmp += 4; |
| 204 memcpy(&msg->msnslp_header.offset, tmp, 4); tmp += 8; | 222 msg->msnslp_header.offset = msn_get32(tmp); tmp += 8; |
| 205 memcpy(&msg->msnslp_header.total_size, tmp, 4); tmp += 8; | 223 msg->msnslp_header.total_size = msn_get32(tmp); tmp += 8; |
| 206 memcpy(&msg->msnslp_header.length, tmp, 4); tmp += 4; | 224 msg->msnslp_header.length = msn_get32(tmp); tmp += 4; |
| 207 memcpy(&msg->msnslp_header.flags, tmp, 4); tmp += 4; | 225 msg->msnslp_header.flags = msn_get32(tmp); tmp += 4; |
| 208 memcpy(&msg->msnslp_header.ack_session_id, tmp, 4); tmp += 4; | 226 msg->msnslp_header.ack_session_id = msn_get32(tmp); tmp += 4; |
| 209 memcpy(&msg->msnslp_header.ack_unique_id, tmp, 4); tmp += 4; | 227 msg->msnslp_header.ack_unique_id = msn_get32(tmp); tmp += 4; |
| 210 memcpy(&msg->msnslp_header.ack_length, tmp, 4); tmp += 8; | 228 msg->msnslp_header.ack_length = msn_get32(tmp); tmp += 8; |
| 211 | 229 |
| 212 /* Convert to the right endianness */ | 230 /* Convert to the right endianness */ |
| 213 msg->msnslp_header.session_id = ntohl(msg->msnslp_header.session_id); | 231 msg->msnslp_header.session_id = ntohl(msg->msnslp_header.session_id); |
| 214 msg->msnslp_header.id = ntohl(msg->msnslp_header.id); | 232 msg->msnslp_header.id = ntohl(msg->msnslp_header.id); |
| 215 msg->msnslp_header.length = ntohl(msg->msnslp_header.length); | 233 msg->msnslp_header.length = ntohl(msg->msnslp_header.length); |
| 299 | 317 |
| 300 char * | 318 char * |
| 301 msn_message_to_string(const MsnMessage *msg, size_t *ret_size) | 319 msn_message_to_string(const MsnMessage *msg, size_t *ret_size) |
| 302 { | 320 { |
| 303 GList *l; | 321 GList *l; |
| 322 const char *body; | |
| 304 char *msg_start; | 323 char *msg_start; |
| 305 char *str; | 324 char *str; |
| 306 char buf[MSN_BUF_LEN]; | 325 char buf[MSN_BUF_LEN]; |
| 307 int len; | 326 int len; |
| 308 | 327 |
| 315 * | 334 * |
| 316 * -- ChipX86 | 335 * -- ChipX86 |
| 317 */ | 336 */ |
| 318 g_return_val_if_fail(msg != NULL, NULL); | 337 g_return_val_if_fail(msg != NULL, NULL); |
| 319 | 338 |
| 339 body = msn_message_get_body(msg); | |
| 340 | |
| 320 if (msn_message_is_incoming(msg)) { | 341 if (msn_message_is_incoming(msg)) { |
| 321 MsnUser *sender = msn_message_get_sender(msg); | 342 MsnUser *sender = msn_message_get_sender(msg); |
| 322 | 343 |
| 323 g_snprintf(buf, sizeof(buf), "MSG %s %s %d\r\n", | 344 g_snprintf(buf, sizeof(buf), "MSG %s %s %d\r\n", |
| 324 msn_user_get_passport(sender), msn_user_get_name(sender), | 345 msn_user_get_passport(sender), msn_user_get_name(sender), |
| 333 len = strlen(buf) + msg->size + 1; | 354 len = strlen(buf) + msg->size + 1; |
| 334 | 355 |
| 335 str = g_new0(char, len + 1); | 356 str = g_new0(char, len + 1); |
| 336 | 357 |
| 337 g_strlcpy(str, buf, len); | 358 g_strlcpy(str, buf, len); |
| 359 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 338 | 360 |
| 339 msg_start = str + strlen(str); | 361 msg_start = str + strlen(str); |
| 362 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 340 | 363 |
| 341 /* Standard header. */ | 364 /* Standard header. */ |
| 342 if (msg->charset == NULL) { | 365 if (msg->charset == NULL) { |
| 343 g_snprintf(buf, sizeof(buf), | 366 g_snprintf(buf, sizeof(buf), |
| 344 "MIME-Version: 1.0\r\n" | 367 "MIME-Version: 1.0\r\n" |
| 349 g_snprintf(buf, sizeof(buf), | 372 g_snprintf(buf, sizeof(buf), |
| 350 "MIME-Version: 1.0\r\n" | 373 "MIME-Version: 1.0\r\n" |
| 351 "Content-Type: %s; charset=%s\r\n", | 374 "Content-Type: %s; charset=%s\r\n", |
| 352 msg->content_type, msg->charset); | 375 msg->content_type, msg->charset); |
| 353 } | 376 } |
| 377 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 354 | 378 |
| 355 g_strlcat(str, buf, len); | 379 g_strlcat(str, buf, len); |
| 380 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 356 | 381 |
| 357 for (l = msg->attr_list; l != NULL; l = l->next) { | 382 for (l = msg->attr_list; l != NULL; l = l->next) { |
| 358 const char *key = (char *)l->data; | 383 const char *key = (char *)l->data; |
| 359 const char *value; | 384 const char *value; |
| 360 | 385 |
| 363 g_snprintf(buf, sizeof(buf), "%s: %s\r\n", key, value); | 388 g_snprintf(buf, sizeof(buf), "%s: %s\r\n", key, value); |
| 364 | 389 |
| 365 g_strlcat(str, buf, len); | 390 g_strlcat(str, buf, len); |
| 366 } | 391 } |
| 367 | 392 |
| 393 g_strlcat(str, "\r\n", len); | |
| 394 | |
| 368 if (msg->msnslp_message) | 395 if (msg->msnslp_message) |
| 369 { | 396 { |
| 370 char *c; | 397 char *c; |
| 371 char blank[4]; | |
| 372 long session_id, id, offset, total_size, length, flags; | 398 long session_id, id, offset, total_size, length, flags; |
| 373 long ack_session_id, ack_unique_id, ack_length; | 399 long ack_session_id, ack_unique_id, ack_length; |
| 374 | 400 |
| 375 blank[0] = blank[1] = blank[2] = blank[3] = 0; | |
| 376 | |
| 377 g_strlcat(str, "\r\n", 3); | |
| 378 | |
| 379 c = str + strlen(str); | 401 c = str + strlen(str); |
| 402 | |
| 403 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 404 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 380 | 405 |
| 381 session_id = htonl(msg->msnslp_header.session_id); | 406 session_id = htonl(msg->msnslp_header.session_id); |
| 382 id = htonl(msg->msnslp_header.id); | 407 id = htonl(msg->msnslp_header.id); |
| 383 offset = htonl(msg->msnslp_header.offset); | 408 offset = htonl(msg->msnslp_header.offset); |
| 384 total_size = htonl(msg->msnslp_header.total_size); | 409 total_size = htonl(msg->msnslp_header.total_size); |
| 386 flags = htonl(msg->msnslp_header.flags); | 411 flags = htonl(msg->msnslp_header.flags); |
| 387 ack_session_id = htonl(msg->msnslp_header.ack_session_id); | 412 ack_session_id = htonl(msg->msnslp_header.ack_session_id); |
| 388 ack_unique_id = htonl(msg->msnslp_header.ack_unique_id); | 413 ack_unique_id = htonl(msg->msnslp_header.ack_unique_id); |
| 389 ack_length = htonl(msg->msnslp_header.ack_length); | 414 ack_length = htonl(msg->msnslp_header.ack_length); |
| 390 | 415 |
| 391 memcpy(c, &session_id, 4); c += 4; | 416 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); |
| 392 memcpy(c, &id, 4); c += 4; | |
| 393 memcpy(c, &offset, 4); c += 4; | |
| 394 memcpy(c, blank, 4); c += 4; | |
| 395 memcpy(c, &total_size, 4); c += 4; | |
| 396 memcpy(c, blank, 4); c += 4; | |
| 397 memcpy(c, &length, 4); c += 4; | |
| 398 memcpy(c, &flags, 4); c += 4; | |
| 399 memcpy(c, &ack_session_id, 4); c += 4; | |
| 400 memcpy(c, &ack_unique_id, 4); c += 4; | |
| 401 memcpy(c, &ack_length, 4); c += 4; | |
| 402 memcpy(c, blank, 4); c += 4; | |
| 403 | |
| 404 strncpy(c, msn_message_get_body(msg), len); | |
| 405 | |
| 406 c += strlen(msn_message_get_body(msg)); | |
| 407 | |
| 408 if (strlen(msn_message_get_body(msg)) > 0) | |
| 409 *c++ = '\0'; | |
| 410 | |
| 411 memcpy(c, &msg->msnslp_footer.app_id, 4); c += 4; | |
| 412 *c = '\0'; | |
| 413 | |
| 414 gaim_debug_misc("msn", "cur size = %d\n", (c - str)); | |
| 415 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | 417 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); |
| 416 | 418 |
| 417 if (msg->size != (c - str)) | 419 c += msn_put32(c, session_id); gaim_debug_misc("msn", "1\n"); |
| 420 c += msn_put32(c, id); gaim_debug_misc("msn", "2\n"); | |
| 421 c += msn_put32(c, offset); gaim_debug_misc("msn", "3\n"); | |
| 422 c += msn_put32(c, 0); gaim_debug_misc("msn", "4\n"); | |
| 423 c += msn_put32(c, total_size); gaim_debug_misc("msn", "5\n"); | |
| 424 c += msn_put32(c, 0); gaim_debug_misc("msn", "6\n"); | |
| 425 c += msn_put32(c, length); gaim_debug_misc("msn", "7\n"); | |
| 426 c += msn_put32(c, flags); gaim_debug_misc("msn", "8\n"); | |
| 427 c += msn_put32(c, ack_session_id); gaim_debug_misc("msn", "9\n"); | |
| 428 c += msn_put32(c, ack_unique_id); gaim_debug_misc("msn", "10\n"); | |
| 429 c += msn_put32(c, ack_length); gaim_debug_misc("msn", "11\n"); | |
| 430 c += msn_put32(c, 0); gaim_debug_misc("msn", "12\n"); | |
| 431 | |
| 432 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 433 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 434 | |
| 435 if (body != NULL) | |
| 436 { | |
| 437 strncpy(c, body, len); | |
| 438 | |
| 439 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 440 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 441 | |
| 442 c += strlen(body); | |
| 443 | |
| 444 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 445 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 446 | |
| 447 if (strlen(body) > 0) | |
| 448 *c++ = '\0'; | |
| 449 | |
| 450 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 451 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 452 } | |
| 453 | |
| 454 c += msn_put32(c, msg->msnslp_footer.app_id); | |
| 455 | |
| 456 gaim_debug_misc("msn", "cur size = %d\n", (c - msg_start)); | |
| 457 gaim_debug_misc("msn", "msg->size = %d\n", msg->size); | |
| 458 | |
| 459 if (msg->size != (c - msg_start)) | |
| 418 { | 460 { |
| 419 gaim_debug(GAIM_DEBUG_ERROR, "msn", | 461 gaim_debug(GAIM_DEBUG_ERROR, "msn", |
| 420 "Outgoing message size (%d) and string length (%d) " | 462 "Outgoing message size (%d) and data length (%d) " |
| 421 "do not match!\n", msg->size, (c - str)); | 463 "do not match!\n", msg->size, (c - msg_start)); |
| 422 } | 464 } |
| 423 } | 465 } |
| 424 else | 466 else |
| 425 { | 467 { |
| 426 g_snprintf(buf, sizeof(buf), "\r\n%s", msn_message_get_body(msg)); | 468 g_strlcat(str, body, len); |
| 427 | |
| 428 g_strlcat(str, buf, len); | |
| 429 | 469 |
| 430 if (msg->size != strlen(msg_start)) { | 470 if (msg->size != strlen(msg_start)) { |
| 431 gaim_debug(GAIM_DEBUG_ERROR, "msn", | 471 gaim_debug(GAIM_DEBUG_ERROR, "msn", |
| 432 "Outgoing message size (%d) and string length (%d) " | 472 "Outgoing message size (%d) and string length (%d) " |
| 433 "do not match!\n", msg->size, strlen(msg_start)); | 473 "do not match!\n", msg->size, strlen(msg_start)); |
| 534 const char *c; | 574 const char *c; |
| 535 char *buf, *d; | 575 char *buf, *d; |
| 536 int newline_count = 0; | 576 int newline_count = 0; |
| 537 size_t new_len; | 577 size_t new_len; |
| 538 | 578 |
| 539 g_return_if_fail(msg != NULL); | 579 g_return_if_fail(msg != NULL); |
| 540 g_return_if_fail(body != NULL); | 580 g_return_if_fail(body != NULL); |
| 541 | 581 |
| 542 if (msg->body != NULL) { | 582 if (msg->body != NULL) { |
| 543 msg->size -= strlen(msg->body); | 583 msg->size -= strlen(msg->body); |
| 544 g_free(msg->body); | 584 g_free(msg->body); |
