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