Mercurial > pidgin
comparison src/signals.c @ 8004:07dc83303503
[gaim-migrate @ 8681]
Removing a signal handler while a signal is being emitted could crash Gaim.
This should now be fixed.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Mon, 05 Jan 2004 07:03:56 +0000 |
parents | 191e5b9a249b |
children | fa6395637e2c |
comparison
equal
deleted
inserted
replaced
8003:b9d3d397a195 | 8004:07dc83303503 |
---|---|
410 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) | 410 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) |
411 { | 411 { |
412 GaimInstanceData *instance_data; | 412 GaimInstanceData *instance_data; |
413 GaimSignalData *signal_data; | 413 GaimSignalData *signal_data; |
414 GaimSignalHandlerData *handler_data; | 414 GaimSignalHandlerData *handler_data; |
415 GList *l; | 415 GList *l, *l_next; |
416 | 416 |
417 g_return_if_fail(instance != NULL); | 417 g_return_if_fail(instance != NULL); |
418 g_return_if_fail(signal != NULL); | 418 g_return_if_fail(signal != NULL); |
419 | 419 |
420 instance_data = | 420 instance_data = |
430 gaim_debug(GAIM_DEBUG_ERROR, "signals", | 430 gaim_debug(GAIM_DEBUG_ERROR, "signals", |
431 "Signal data for %s not found!\n", signal); | 431 "Signal data for %s not found!\n", signal); |
432 return; | 432 return; |
433 } | 433 } |
434 | 434 |
435 for (l = signal_data->handlers; l != NULL; l = l->next) | 435 for (l = signal_data->handlers; l != NULL; l = l_next) |
436 { | 436 { |
437 l_next = l->next; | |
438 | |
437 handler_data = (GaimSignalHandlerData *)l->data; | 439 handler_data = (GaimSignalHandlerData *)l->data; |
438 | 440 |
439 if (handler_data->use_vargs) | 441 if (handler_data->use_vargs) |
440 { | 442 { |
441 ((void (*)(va_list, void *))handler_data->cb)(args, | 443 ((void (*)(va_list, void *))handler_data->cb)(args, |
471 { | 473 { |
472 GaimInstanceData *instance_data; | 474 GaimInstanceData *instance_data; |
473 GaimSignalData *signal_data; | 475 GaimSignalData *signal_data; |
474 GaimSignalHandlerData *handler_data; | 476 GaimSignalHandlerData *handler_data; |
475 void *ret_val = NULL; | 477 void *ret_val = NULL; |
476 GList *l; | 478 GList *l, *l_next; |
477 | 479 |
478 g_return_val_if_fail(instance != NULL, NULL); | 480 g_return_val_if_fail(instance != NULL, NULL); |
479 g_return_val_if_fail(signal != NULL, NULL); | 481 g_return_val_if_fail(signal != NULL, NULL); |
480 | 482 |
481 instance_data = | 483 instance_data = |
491 gaim_debug(GAIM_DEBUG_ERROR, "signals", | 493 gaim_debug(GAIM_DEBUG_ERROR, "signals", |
492 "Signal data for %s not found!\n", signal); | 494 "Signal data for %s not found!\n", signal); |
493 return 0; | 495 return 0; |
494 } | 496 } |
495 | 497 |
496 for (l = signal_data->handlers; l != NULL; l = l->next) | 498 for (l = signal_data->handlers; l != NULL; l = l_next) |
497 { | 499 { |
500 l_next = l->next; | |
501 | |
498 handler_data = (GaimSignalHandlerData *)l->data; | 502 handler_data = (GaimSignalHandlerData *)l->data; |
499 | 503 |
500 if (handler_data->use_vargs) | 504 if (handler_data->use_vargs) |
501 { | 505 { |
502 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( | 506 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( |