grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
From: Andrei Borzenkov <arvidjaar@gmail.com>
To: Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
Cc: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: [PATCH] ofdisk: Recognizes SAS disks automatically
Date: Sat, 1 Aug 2015 10:33:43 +0300	[thread overview]
Message-ID: <20150801103343.41ddb9b4@opensuse.site> (raw)
In-Reply-To: <1438349665-14139-1-git-send-email-pfsmorigo@linux.vnet.ibm.com>

В Fri, 31 Jul 2015 10:34:25 -0300
Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com> пишет:

> Read all children from sas path and add it to the device list.

Examples of paths and names would be useful for reference.

> 
> ---
>  grub-core/disk/ieee1275/ofdisk.c | 51 ++++++++++++++++++++++++++++++++++++++++
>  include/grub/ieee1275/ofdisk.h   |  3 +++
>  2 files changed, 54 insertions(+)
> 
> diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
> index 331769b..b17f6d1 100644
> --- a/grub-core/disk/ieee1275/ofdisk.c
> +++ b/grub-core/disk/ieee1275/ofdisk.c
> @@ -260,6 +260,57 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
>        grub_free (buf);
>        return;
>      }
> +  else if (grub_strcmp (alias->type, "sas_ioa") == 0)
> +    {
> +      struct sas_children
> +        {
> +          struct grub_ieee1275_common_hdr common;
> +          grub_ieee1275_cell_t method;
> +          grub_ieee1275_cell_t ihandle;
> +          grub_ieee1275_cell_t max;
> +          grub_ieee1275_cell_t table;
> +          grub_ieee1275_cell_t catch_result;
> +          grub_ieee1275_cell_t nentries;
> +        }
> +      args;
> +      char *buf, *bufptr;
> +      unsigned i;
> +      grub_ieee1275_ihandle_t ihandle;
> +
> +      buf = grub_malloc (grub_strlen (alias->path)
> +                         + sizeof("/disk@") + IEEE1275_SAS_CHILDREN_SIZE + 1);
> +      if (!buf)
> +        return;
> +
> +      bufptr = grub_stpcpy (buf, alias->path);
> +
> +      if (grub_ieee1275_open (alias->path, &ihandle))
> +        return;

memory leak.

> +
> +      INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 2);
> +      args.method = (grub_ieee1275_cell_t) "get-sas-children";
> +      args.ihandle = ihandle;
> +      args.max = IEEE1275_SAS_CHILDREN_BUFFER_SIZE;
> +      args.table = 0;
> +      args.catch_result = 0;
> +      args.nentries = 0;
> +
> +      if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
> +        {
> +          grub_ieee1275_close (ihandle);
> +          return;

memory leak

> +        }
> +      grub_uint64_t *ptr;
> +      for (i = 0; i < args.nentries; i++)
> +        {
> +          ptr = (grub_uint64_t *) (args.table + IEEE1275_SAS_CHILDREN_SIZE * i);

Is it guaranteed to be aligned? Why do you need magic constant if it
really sizeof(grub_unit64_t)?

> +          grub_snprintf (bufptr, 100, "/disk@%" PRIxGRUB_UINT64_T, (grub_uint64_t) *ptr);

Where size 100 comes from? You just allocated 8 bytes for the rest
(sans final zero byte), but printf outputs 16 bytes, so it overflows
buffer.

> +          dev_iterate_real (buf, buf);
> +        }
> +
> +      grub_ieee1275_close (ihandle);

Out of curiosity - what happens with args.table? Does firmware free it
implicitly?

> +      grub_free (buf);
> +    }
>  
>    if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS)
>        && grub_strcmp (alias->type, "block") == 0)
> diff --git a/include/grub/ieee1275/ofdisk.h b/include/grub/ieee1275/ofdisk.h
> index 2f69e3f..59f84f7 100644
> --- a/include/grub/ieee1275/ofdisk.h
> +++ b/include/grub/ieee1275/ofdisk.h
> @@ -19,6 +19,9 @@
>  #ifndef GRUB_OFDISK_HEADER
>  #define GRUB_OFDISK_HEADER	1
>  
> +#define IEEE1275_SAS_CHILDREN_SIZE 8
> +#define IEEE1275_SAS_CHILDREN_BUFFER_SIZE 100*IEEE1275_SAS_CHILDREN_SIZE
> +
>  extern void grub_ofdisk_init (void);
>  extern void grub_ofdisk_fini (void);
>  



      reply	other threads:[~2015-08-01  7:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-31 13:34 [PATCH] ofdisk: Recognizes SAS disks automatically Paulo Flabiano Smorigo
2015-08-01  7:33 ` Andrei Borzenkov [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150801103343.41ddb9b4@opensuse.site \
    --to=arvidjaar@gmail.com \
    --cc=grub-devel@gnu.org \
    --cc=pfsmorigo@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).