static int fill_thread_core_info(struct elf_thread_core_info *t,
                                 const struct user_regset_view *view,
-                                long signr, size_t *total)
+                                long signr, struct elf_note_info *info)
 {
-       unsigned int i;
+       unsigned int note_iter, view_iter;
 
        /*
         * NT_PRSTATUS is the one special case, because the regset data
 
        fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
                  PRSTATUS_SIZE, &t->prstatus);
-       *total += notesize(&t->notes[0]);
+       info->size += notesize(&t->notes[0]);
 
        do_thread_regset_writeback(t->task, &view->regsets[0]);
 
        /*
         * Each other regset might generate a note too.  For each regset
-        * that has no core_note_type or is inactive, we leave t->notes[i]
-        * all zero and we'll know to skip writing it later.
+        * that has no core_note_type or is inactive, skip it.
         */
-       for (i = 1; i < view->n; ++i) {
-               const struct user_regset *regset = &view->regsets[i];
+       note_iter = 1;
+       for (view_iter = 1; view_iter < view->n; ++view_iter) {
+               const struct user_regset *regset = &view->regsets[view_iter];
                int note_type = regset->core_note_type;
                bool is_fpreg = note_type == NT_PRFPREG;
                void *data;
                if (ret < 0)
                        continue;
 
+               if (WARN_ON_ONCE(note_iter >= info->thread_notes))
+                       break;
+
                if (is_fpreg)
                        SET_PR_FPVALID(&t->prstatus);
 
-               fill_note(&t->notes[i], is_fpreg ? "CORE" : "LINUX",
+               fill_note(&t->notes[note_iter], is_fpreg ? "CORE" : "LINUX",
                          note_type, ret, data);
 
-               *total += notesize(&t->notes[i]);
+               info->size += notesize(&t->notes[note_iter]);
+               note_iter++;
        }
 
        return 1;
         * Now fill in each thread's information.
         */
        for (t = info->thread; t != NULL; t = t->next)
-               if (!fill_thread_core_info(t, view, cprm->siginfo->si_signo, &info->size))
+               if (!fill_thread_core_info(t, view, cprm->siginfo->si_signo, info))
                        return 0;
 
        /*