diff options
-rwxr-xr-x | src/notification_ipc.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/notification_ipc.c b/src/notification_ipc.c index f1dbc1c..40ad1a1 100755 --- a/src/notification_ipc.c +++ b/src/notification_ipc.c @@ -475,28 +475,42 @@ static void _delete_single_notify(GVariant *parameters) /* LCOV_EXCL_START */ static void _delete_multiple_notify(GVariant *parameters) { - int buf[100] = {0,}; + int *buf; int idx = 0; + int num; notification_op *noti_op; GVariantIter *iter; uid_t uid; - g_variant_get(parameters, "(a(i)i)", &iter, &uid); - while (g_variant_iter_loop(iter, "(i)", &buf[idx])) { + g_variant_get(parameters, "(a(i)ii)", &iter, &num, &uid); + if (num <= 0) { + NOTIFICATION_ERR("Invalid number to delete"); + return; + } + NOTIFICATION_DBG("Deleted count[%d]", num); + + buf = (int *)malloc(sizeof(int) * num); + if (buf == NULL) { + NOTIFICATION_ERR("Failed to alloc"); + return; + } + + while (g_variant_iter_loop(iter, "(i)", &buf[idx]) && idx < num) { NOTIFICATION_DBG("priv id[%d]", buf[idx]); idx++; } g_variant_iter_free(iter); - NOTIFICATION_DBG("Deleted count[%d]", idx); noti_op = _ipc_create_op(NOTIFICATION_OP_DELETE, idx, buf, idx, NULL); if (noti_op == NULL) { NOTIFICATION_ERR("Failed to create op"); + free(buf); return; } notification_call_changed_cb_for_uid(noti_op, idx, uid); free(noti_op); + free(buf); } /* LCOV_EXCL_STOP */ |