[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 03/10] net: dhcp: Allow overloading legacy bootfile and na
From: |
Daniel Kiper |
Subject: |
Re: [PATCH v3 03/10] net: dhcp: Allow overloading legacy bootfile and name field |
Date: |
Fri, 8 Mar 2019 13:04:25 +0100 |
User-agent: |
NeoMutt/20170113 (1.7.2) |
On Fri, Mar 08, 2019 at 11:51:27AM +0000, Andre Przywara wrote:
> On Fri, 8 Mar 2019 12:34:18 +0100
> Daniel Kiper <address@hidden> wrote:
>
> > On Thu, Mar 07, 2019 at 03:14:09PM +0000, Andre Przywara wrote:
> > > From: Andrei Borzenkov <address@hidden>
> > >
> > > DHCP specifies a special dummy option OVERLOAD, to allow DHCP options to
> > > spill over into the (legacy) BOOTFILE and SNAME fields.
> > >
> > > Parse and handle this option properly.
> > >
> > > Signed-off-by: Andre Przywara <address@hidden>
> >
> > In general Reviewed-by: Daniel Kiper <address@hidden> but one
> > nitpick below...
> >
> > > ---
> > > grub-core/net/bootp.c | 59 ++++++++++++++++++++++++++++++++++++++++++-
> > > include/grub/net.h | 1 +
> > > 2 files changed, 59 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
> > > index 8d6763689..860d9c80d 100644
> > > --- a/grub-core/net/bootp.c
> > > +++ b/grub-core/net/bootp.c
> > > @@ -25,11 +25,19 @@
> > > #include <grub/net/udp.h>
> > > #include <grub/datetime.h>
> > >
> > > +enum
> > > +{
> > > + GRUB_DHCP_OPT_OVERLOAD_FILE = 1,
> > > + GRUB_DHCP_OPT_OVERLOAD_SNAME = 2,
> > > +};
> > > +
> > > static const void *
> > > find_dhcp_option (const struct grub_net_bootp_packet *bp, grub_size_t
> > > size,
> > > grub_uint8_t opt_code, grub_uint8_t *opt_len)
> > > {
> > > const grub_uint8_t *ptr;
> > > + grub_uint8_t overload = 0;
> > > + int end = 0;
> > > grub_size_t i;
> > >
> > > if (opt_len)
> > > @@ -54,6 +62,7 @@ find_dhcp_option (const struct grub_net_bootp_packet
> > > *bp, grub_size_t size,
> > > size -= sizeof (*bp);
> > > i = sizeof (grub_uint32_t);
> > >
> > > +again:
> > > while (i < size)
> > > {
> > > grub_uint8_t tagtype;
> > > @@ -67,7 +76,10 @@ find_dhcp_option (const struct grub_net_bootp_packet
> > > *bp, grub_size_t size,
> > >
> > > /* End tag. */
> > > if (tagtype == GRUB_NET_BOOTP_END)
> > > - break;
> > > + {
> > > + end = 1;
> > > + break;
> > > + }
> > >
> > > if (i >= size)
> > > return NULL;
> > > @@ -84,9 +96,54 @@ find_dhcp_option (const struct grub_net_bootp_packet
> > > *bp, grub_size_t size,
> > > return &ptr[i];
> > > }
> > >
> > > + if (tagtype == GRUB_NET_DHCP_OVERLOAD && taglength == 1)
> > > + overload = ptr[i];
> > > +
> > > i += taglength;
> > > }
> > >
> > > + if (!end)
> > > + return NULL;
> > > +
> > > + /* RFC2131, 4.1, 23ff:
> > > + * If the options in a DHCP message extend into the 'sname' and 'file'
> > > + * fields, the 'option overload' option MUST appear in the 'options'
> > > + * field, with value 1, 2 or 3, as specified in RFC 1533. If the
> > > + * 'option overload' option is present in the 'options' field, the
> > > + * options in the 'options' field MUST be terminated by an 'end'
> > > option,
> > > + * and MAY contain one or more 'pad' options to fill the options field.
> > > + * The options in the 'sname' and 'file' fields (if in use as indicated
> > > + * by the 'options overload' option) MUST begin with the first octet of
> > > + * the field, MUST be terminated by an 'end' option, and MUST be
> > > + * followed by 'pad' options to fill the remainder of the field. Any
> > > + * individual option in the 'options', 'sname' and 'file' fields MUST
> > > be
> > > + * entirely contained in that field. The options in the 'options'
> > > field
> > > + * MUST be interpreted first, so that any 'option overload' options may
> > > + * be interpreted. The 'file' field MUST be interpreted next (if the
> > > + * 'option overload' option indicates that the 'file' field contains
> > > + * DHCP options), followed by the 'sname' field.
> > > + *
> > > + * FIXME: We do not explicitly check for trailing 'pad' options here.
> > > + */
> > > + end = 0;
> >
> > It seems to me that this line is not needed... I can drop it before
> > committing the patch if you are OK with it.
>
> I was eyeballing this line as well, but I think it *is* needed:
> It resets end to 0, before possibly jumping back to the again label, inside
> the if conditions below.
> Does that make sense?
Ahhh... Right, I have missed that. So,
Reviewed-by: Daniel Kiper <address@hidden>
Daniel
> Cheers,
> Andre.
>
> >
> > > + if (overload & GRUB_DHCP_OPT_OVERLOAD_FILE)
> > > + {
> > > + overload &= ~GRUB_DHCP_OPT_OVERLOAD_FILE;
> > > + ptr = (grub_uint8_t *) &bp->boot_file[0];
> > > + size = sizeof (bp->boot_file);
> > > + i = 0;
> > > + goto again;
> > > + }
> > > +
> > > + if (overload & GRUB_DHCP_OPT_OVERLOAD_SNAME)
> > > + {
> > > + overload &= ~GRUB_DHCP_OPT_OVERLOAD_SNAME;
> > > + ptr = (grub_uint8_t *) &bp->server_name[0];
> > > + size = sizeof (bp->server_name);
> > > + i = 0;
> > > + goto again;
> > > + }
> > > +
> > > return NULL;
> > > }
> >
> > Daniel
- [PATCH v3 00/10] net: bootp: add native DHCPv4 support, Andre Przywara, 2019/03/07
- [PATCH v3 05/10] net: dhcp: make grub_net_process_dhcp take an interface, Andre Przywara, 2019/03/07
- [PATCH v3 04/10] net: dhcp: refactor DHCP packet transmission into separate function, Andre Przywara, 2019/03/07
- [PATCH v3 07/10] net: dhcp: use DHCP options for name and bootfile, Andre Przywara, 2019/03/07
- [PATCH v3 08/10] net: dhcp: allow receiving DHCP OFFER and ACK packets, Andre Przywara, 2019/03/07
[PATCH v3 09/10] net: dhcp: actually send out DHCPv4 DISCOVER and REQUEST messages, Andre Przywara, 2019/03/07
[PATCH v3 06/10] net: dhcp: introduce per-interface timeout, Andre Przywara, 2019/03/07