All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Dario Faggioli <dario.faggioli@citrix.com>
Cc: George Dunlap <george.dunlap@eu.citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Xen-devel <xen-devel@lists.xen.org>
Subject: Re: [PATCH] tools/libxc: Fix error checking for xc_get_{cpu, node}map_size() callers
Date: Fri, 13 Dec 2013 00:35:12 +0000	[thread overview]
Message-ID: <52AA5640.7000005@citrix.com> (raw)
In-Reply-To: <1386892758.5488.140.camel@Solace>

On 12/12/2013 23:59, Dario Faggioli wrote:
> On gio, 2013-12-12 at 21:05 +0000, Andrew Cooper wrote:
>> On 12/12/2013 14:56, Dario Faggioli wrote:
>>> Yep, I confirm that, after that changeset, neither
>>> xc_get_max_{cpus,nodes}() nor xc_get_{cpu,node}map_size() return 0 as an
>>> error anymore.
>> Zero might not be "the error condition" any more, but it is certainly an
>> error from any of these functions (and possible as
>> xc_get_max_{cpus,nodes}() is capable of returning 0 if Xen hands back -1
>> for physinfo.max_{cpu,node}_id)
>>
> Well, yes, but under what circumstances Xen would do such a thing? As
> far as I can see, max_node_id is just 'MAX_NUMNODES-1'. max_cpu_id is
> 'nr_cpu_ids-1', nr_cpu_ids is '__read_mostly nr_cpu_ids = NR_CPUS'.
>
> I may be wrong, but it looks to me that either both MAX_NUMNODES and
> NR_CPUS (and nr_cpu_ids+1 too, if it changes) are > 0, or the system
> would be experiencing way bigger issues than misdimensioning a bitmap.
>
> What I mean is, if we are there checking, we at least have one node and
> one cpu. In which case, either the call failed and returned <0, or it
> succeeded, and returned >0.
>
> What am I missing?

I didn't wish to imply that I expected Xen to return -1 for either
case.  Stuff would indeed be very broken if this were the case.

As the argument is over the difference between "< 0" and "<= 0",
defensive coding would have the "<= 0" check even if Xen is a trusted
source of information.

>
>> xc_{cpu/node}map_alloc() must strictly still be "<= 0" checks to avoid
>> the issue where calloc(1, 0) returns a non-NULL pointer.
>>
> Here `man calloc' says, among other things: "The memory is set to zero.
> If nmemb or size is 0, then calloc() returns either NULL, or a unique
> pointer value that can later be successfully passed to free()."
>
> Was it that what you were referring to?

Now I come to reconsider this, It wasn't quite the same situation as
libxl_list_vm().

However,

calloc(1, 0) (just like malloc(0) ) can give you a valid pointer to a
buffer you cannot use, and indeed glibc does give you a real buffer of
length 0.

This very dangerous, as traditional thinking says "if I have a non-null
pointer in my hands, its good".  As soon as you dereference this
pointer, you have undefined behaviour.

>From what I understand from comp.lang.c, the only reason this is in the
spec (rather than being a very strict "malloc(0) => NULL") is that
implementations at the time of standardisation already had this behaviour.

Whatever the reason for these quirks existing, they are best avoided
whenever possible.

>
>> Currently, I am of the opinion that the patch is better as is, than
>> changing some of the checks to being strictly "< 0"
>>
> Given the first part of this reply (if I'm not mistaken in there) I'd
> prefer the other way round. I.e., '< 0' whenever it makes sense and, if
> it's an actual issue, '<= 0' in xc_{cpu/node}map_alloc(), perhaps with a
> comment, saying that the '<=' is there to prevent calloc madness. :-)
>
> That being said, I'm happy with whatever solution a tool maintainer
> likes better.
>
> Regards,
> Dario
>

I too will end up deferring to a specific judgement from a tools
maintainer.  I am just taking this opportunity to justify why I chose
"<= 0" in all cases rather than "< 0" (which certainly did get considered).

~Andrew

  reply	other threads:[~2013-12-13  0:35 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-11 15:47 [PATCH] tools/libxc: Fix error checking for xc_get_{cpu, node}map_size() callers Andrew Cooper
2013-12-12 14:24 ` Ian Campbell
2013-12-12 14:56   ` Dario Faggioli
2013-12-12 21:05     ` Andrew Cooper
2013-12-12 23:59       ` Dario Faggioli
2013-12-13  0:35         ` Andrew Cooper [this message]
2013-12-13 10:13           ` Dario Faggioli
2013-12-18 11:10           ` Ian Campbell

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=52AA5640.7000005@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=dario.faggioli@citrix.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.