On 07/11, Denys Vlasenko wrote:
>
> I propose to save this information in core dump, as a new note
> in note segment.

Denys, I am in no position to discuss whether we need this change or not,
format, etc. I'll only try to comment the code.

And please do not use the attachments ;)

> +static void fill_files_note(struct memelfnote *note)
> +{
> +     struct vm_area_struct *vma;
> +     struct file *file;
> +     unsigned count, word_count, size, remaining;
> +     long *data;
> +     long *start_end_ofs;
> +     char *name;
> +
> +     count = 0;
> +     for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
> +             file = vma->vm_file;
> +             if (!file)
> +                     continue;
> +             count++;
> +             if (count >= MAX_FILE_NOTE_SIZE / 64) /* paranoia check */
> +                     goto err;

Why this check? If count is huge, then...

> +     size = count * 64;
> +     word_count = 2 + 3 * count;
> + alloc:
> +     if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
> +             goto err;

we should detect this case before the first alloc?

> +     size = (size + PAGE_SIZE - 1) & (-PAGE_SIZE);

Well, I'd suggest PAGE_MASK instead of -PAGE_SIZE. Better yet,

        size = round_up(size, PAGE_SIZE);

> +             if (remaining == 0) {
> + try_new_size:
> +                     vfree(data);
> +                     size = size * 5 / 4;
> +                     goto alloc;
> +             }
> +             filename = d_path(&file->f_path, name, remaining);
> +             if (IS_ERR(filename)) {
> +                     if (PTR_ERR(filename) == -ENAMETOOLONG)
> +                             goto try_new_size;

This looks like unnecessary complication to me, or I missed something.
d_path(..., buflen) should handle the "buflen == 0" case correctly, so
afacics you can remove the "if (remaining == 0)" block and move this
free-and-goto-alloc code under the -ENAMETOOLONG check.

> +             while ((remaining--, *name++ = *filename++) != '\0')
> +                     continue;

Well, perhaps this is just me... but this looks a bit too complex
to me ;) I won't insist, but

                do
                        remaining--;
                while ((*name++ = *filename++));

looks more understandable, imho.

Or even

                /* d_path() fills the end of the buffer */
                remaining = name - filename;
                strcpy(name, filename);

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to