* [PATCH] xl: Return an error if an empty file is passed to cd-insert
@ 2013-05-10 15:43 George Dunlap
2013-05-10 15:57 ` George Dunlap
2013-05-13 9:35 ` Roger Pau Monné
0 siblings, 2 replies; 9+ messages in thread
From: George Dunlap @ 2013-05-10 15:43 UTC (permalink / raw)
To: xen-devel; +Cc: George Dunlap, Ian Jackson, Ian Campbell
Two changes:
* Stat the file before calling libxl_cdrom_insert()
* Return an error if anything fails (including libxl_cdrom_insert)
This is in part to work around the fact that the RAW disk type
is used for things that aren't actually files; so we can't call
stat in libxl_device.c:libxl__device_disk_set_backend() because
it may be going over a remote protocol.
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
CC: Ian Campbell <ian.campbell@citrix.com>
CC: Ian Jackson <ian.jackson@citrix.com>
---
tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index c1a969b..e8ce35b 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
return 0;
}
-static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
+static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
{
libxl_device_disk disk; /* we don't free disk's contents */
char *buf = NULL;
XLU_Config *config = 0;
+ struct stat b;
+ int rc = 0;
if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
virtdev, phys ? phys : "") < 0) {
fprintf(stderr, "out of memory\n");
- return;
+ return 1;
}
parse_disk_config(&config, buf, &disk);
- libxl_cdrom_insert(ctx, domid, &disk, NULL);
+ /* ATM the existence of the backing file is not checked for qdisk
+ * in libxl_cdrom_insert() because RAW is used for remote
+ * protocols as well as plain files. This will ideally be changed
+ * for 4.4, but this work-around fixes the problem of "cd-insert"
+ * returning success for non-existent files. */
+ if (disk.format != LIBXL_DISK_FORMAT_EMPTY
+ && stat(disk.pdev_path, &b)) {
+ fprintf(stderr, "Cannot stat file: %s\n",
+ disk.pdev_path);
+ return 1;
+ }
+
+ if (libxl_cdrom_insert(ctx, domid, &disk, NULL))
+ rc=1;
libxl_device_disk_dispose(&disk);
free(buf);
+
+ return rc;
}
int main_cd_eject(int argc, char **argv)
@@ -2539,8 +2556,7 @@ int main_cd_eject(int argc, char **argv)
domid = find_domain(argv[optind]);
virtdev = argv[optind + 1];
- cd_insert(domid, virtdev, NULL);
- return 0;
+ return cd_insert(domid, virtdev, NULL);
}
int main_cd_insert(int argc, char **argv)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-10 15:43 [PATCH] xl: Return an error if an empty file is passed to cd-insert George Dunlap
@ 2013-05-10 15:57 ` George Dunlap
2013-05-13 9:35 ` Roger Pau Monné
1 sibling, 0 replies; 9+ messages in thread
From: George Dunlap @ 2013-05-10 15:57 UTC (permalink / raw)
To: xen-devel; +Cc: George Dunlap, Ian Jackson, Ian Campbell
On Fri, May 10, 2013 at 4:43 PM, George Dunlap
<george.dunlap@eu.citrix.com> wrote:
> Two changes:
> * Stat the file before calling libxl_cdrom_insert()
> * Return an error if anything fails (including libxl_cdrom_insert)
Hmm -- not sure how "empty file" got into that description -- it
should say "non-existent file"...
-George
>
> This is in part to work around the fact that the RAW disk type
> is used for things that aren't actually files; so we can't call
> stat in libxl_device.c:libxl__device_disk_set_backend() because
> it may be going over a remote protocol.
>
> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
> CC: Ian Campbell <ian.campbell@citrix.com>
> CC: Ian Jackson <ian.jackson@citrix.com>
> ---
> tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
> 1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index c1a969b..e8ce35b 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
> return 0;
> }
>
> -static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
> +static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
> {
> libxl_device_disk disk; /* we don't free disk's contents */
> char *buf = NULL;
> XLU_Config *config = 0;
> + struct stat b;
> + int rc = 0;
>
>
> if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
> virtdev, phys ? phys : "") < 0) {
> fprintf(stderr, "out of memory\n");
> - return;
> + return 1;
> }
>
> parse_disk_config(&config, buf, &disk);
>
> - libxl_cdrom_insert(ctx, domid, &disk, NULL);
> + /* ATM the existence of the backing file is not checked for qdisk
> + * in libxl_cdrom_insert() because RAW is used for remote
> + * protocols as well as plain files. This will ideally be changed
> + * for 4.4, but this work-around fixes the problem of "cd-insert"
> + * returning success for non-existent files. */
> + if (disk.format != LIBXL_DISK_FORMAT_EMPTY
> + && stat(disk.pdev_path, &b)) {
> + fprintf(stderr, "Cannot stat file: %s\n",
> + disk.pdev_path);
> + return 1;
> + }
> +
> + if (libxl_cdrom_insert(ctx, domid, &disk, NULL))
> + rc=1;
>
> libxl_device_disk_dispose(&disk);
> free(buf);
> +
> + return rc;
> }
>
> int main_cd_eject(int argc, char **argv)
> @@ -2539,8 +2556,7 @@ int main_cd_eject(int argc, char **argv)
> domid = find_domain(argv[optind]);
> virtdev = argv[optind + 1];
>
> - cd_insert(domid, virtdev, NULL);
> - return 0;
> + return cd_insert(domid, virtdev, NULL);
> }
>
> int main_cd_insert(int argc, char **argv)
> --
> 1.7.9.5
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-10 15:43 [PATCH] xl: Return an error if an empty file is passed to cd-insert George Dunlap
2013-05-10 15:57 ` George Dunlap
@ 2013-05-13 9:35 ` Roger Pau Monné
2013-05-13 9:45 ` Ian Campbell
2013-05-13 10:31 ` George Dunlap
1 sibling, 2 replies; 9+ messages in thread
From: Roger Pau Monné @ 2013-05-13 9:35 UTC (permalink / raw)
To: George Dunlap; +Cc: Ian Jackson, Ian Campbell, xen-devel
On 10/05/13 17:43, George Dunlap wrote:
> Two changes:
> * Stat the file before calling libxl_cdrom_insert()
> * Return an error if anything fails (including libxl_cdrom_insert)
>
> This is in part to work around the fact that the RAW disk type
> is used for things that aren't actually files; so we can't call
> stat in libxl_device.c:libxl__device_disk_set_backend() because
> it may be going over a remote protocol.
>
> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
> CC: Ian Campbell <ian.campbell@citrix.com>
> CC: Ian Jackson <ian.jackson@citrix.com>
> ---
> tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
> 1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index c1a969b..e8ce35b 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
> return 0;
> }
>
> -static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
> +static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
> {
> libxl_device_disk disk; /* we don't free disk's contents */
> char *buf = NULL;
> XLU_Config *config = 0;
> + struct stat b;
> + int rc = 0;
>
>
> if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
> virtdev, phys ? phys : "") < 0) {
> fprintf(stderr, "out of memory\n");
> - return;
> + return 1;
ERROR_NOMEM
> }
>
> parse_disk_config(&config, buf, &disk);
>
> - libxl_cdrom_insert(ctx, domid, &disk, NULL);
> + /* ATM the existence of the backing file is not checked for qdisk
> + * in libxl_cdrom_insert() because RAW is used for remote
> + * protocols as well as plain files. This will ideally be changed
> + * for 4.4, but this work-around fixes the problem of "cd-insert"
> + * returning success for non-existent files. */
> + if (disk.format != LIBXL_DISK_FORMAT_EMPTY
> + && stat(disk.pdev_path, &b)) {
> + fprintf(stderr, "Cannot stat file: %s\n",
> + disk.pdev_path);
You are leaking buf here, I know xl is just about to exit, but it might
be best to to define a label below that contains:
out:
free(buf);
return rc;
and go to it.
> + return 1;
ERROR_INVAL
> + }
> +
> + if (libxl_cdrom_insert(ctx, domid, &disk, NULL))
> + rc=1;
You could use the return value of libxl_cdrom_insert instead of 1.
>
> libxl_device_disk_dispose(&disk);
> free(buf);
> +
> + return rc;
> }
>
> int main_cd_eject(int argc, char **argv)
> @@ -2539,8 +2556,7 @@ int main_cd_eject(int argc, char **argv)
> domid = find_domain(argv[optind]);
> virtdev = argv[optind + 1];
>
> - cd_insert(domid, virtdev, NULL);
> - return 0;
> + return cd_insert(domid, virtdev, NULL);
> }
>
> int main_cd_insert(int argc, char **argv)
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-13 9:35 ` Roger Pau Monné
@ 2013-05-13 9:45 ` Ian Campbell
2013-05-13 10:03 ` Roger Pau Monné
2013-05-13 10:31 ` George Dunlap
1 sibling, 1 reply; 9+ messages in thread
From: Ian Campbell @ 2013-05-13 9:45 UTC (permalink / raw)
To: Roger Pau Monne; +Cc: George Dunlap, Ian Jackson, xen-devel
On Mon, 2013-05-13 at 10:35 +0100, Roger Pau Monne wrote:
> On 10/05/13 17:43, George Dunlap wrote:
> > Two changes:
> > * Stat the file before calling libxl_cdrom_insert()
> > * Return an error if anything fails (including libxl_cdrom_insert)
> >
> > This is in part to work around the fact that the RAW disk type
> > is used for things that aren't actually files; so we can't call
> > stat in libxl_device.c:libxl__device_disk_set_backend() because
> > it may be going over a remote protocol.
> >
> > Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
> > CC: Ian Campbell <ian.campbell@citrix.com>
> > CC: Ian Jackson <ian.jackson@citrix.com>
> > ---
> > tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
> > 1 file changed, 21 insertions(+), 5 deletions(-)
> >
> > diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> > index c1a969b..e8ce35b 100644
> > --- a/tools/libxl/xl_cmdimpl.c
> > +++ b/tools/libxl/xl_cmdimpl.c
> > @@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
> > return 0;
> > }
> >
> > -static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
> > +static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
> > {
> > libxl_device_disk disk; /* we don't free disk's contents */
> > char *buf = NULL;
> > XLU_Config *config = 0;
> > + struct stat b;
> > + int rc = 0;
> >
> >
> > if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
> > virtdev, phys ? phys : "") < 0) {
> > fprintf(stderr, "out of memory\n");
> > - return;
> > + return 1;
>
> ERROR_NOMEM
xl seems pretty inconsistent in its use of libxl error codes, sometimes
it uses +ERROR_FOO, other times -ERROR_FOO and other times it uses its
own open coded numbers.
So I wouldn't say this is wrong as such but so long as the final xl exit
code is 0 on success and non-zero otherwise I think it is up to George.
>
> > }
> >
> > parse_disk_config(&config, buf, &disk);
> >
> > - libxl_cdrom_insert(ctx, domid, &disk, NULL);
> > + /* ATM the existence of the backing file is not checked for qdisk
> > + * in libxl_cdrom_insert() because RAW is used for remote
> > + * protocols as well as plain files. This will ideally be changed
> > + * for 4.4, but this work-around fixes the problem of "cd-insert"
> > + * returning success for non-existent files. */
> > + if (disk.format != LIBXL_DISK_FORMAT_EMPTY
> > + && stat(disk.pdev_path, &b)) {
> > + fprintf(stderr, "Cannot stat file: %s\n",
> > + disk.pdev_path);
>
> You are leaking buf here, I know xl is just about to exit,
I prefer to have xl clear up properly whenever possible. Not because I
care particularly about xl (which isn't generally long lived) but
because it makes it possible to use valgrind+xl to check for leaks in
libxl, and I care about that because other toolstacks which use libxl
can be long lived and therefore care about leaks. Having xl not contain
false positive leaks helps here.
Ian.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-13 9:45 ` Ian Campbell
@ 2013-05-13 10:03 ` Roger Pau Monné
0 siblings, 0 replies; 9+ messages in thread
From: Roger Pau Monné @ 2013-05-13 10:03 UTC (permalink / raw)
To: Ian Campbell; +Cc: George Dunlap, Ian Jackson, xen-devel
On 13/05/13 11:45, Ian Campbell wrote:
> On Mon, 2013-05-13 at 10:35 +0100, Roger Pau Monne wrote:
>> On 10/05/13 17:43, George Dunlap wrote:
>>> Two changes:
>>> * Stat the file before calling libxl_cdrom_insert()
>>> * Return an error if anything fails (including libxl_cdrom_insert)
>>>
>>> This is in part to work around the fact that the RAW disk type
>>> is used for things that aren't actually files; so we can't call
>>> stat in libxl_device.c:libxl__device_disk_set_backend() because
>>> it may be going over a remote protocol.
>>>
>>> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>>> CC: Ian Campbell <ian.campbell@citrix.com>
>>> CC: Ian Jackson <ian.jackson@citrix.com>
>>> ---
>>> tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
>>> 1 file changed, 21 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
>>> index c1a969b..e8ce35b 100644
>>> --- a/tools/libxl/xl_cmdimpl.c
>>> +++ b/tools/libxl/xl_cmdimpl.c
>>> @@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
>>> return 0;
>>> }
>>>
>>> -static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
>>> +static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
>>> {
>>> libxl_device_disk disk; /* we don't free disk's contents */
>>> char *buf = NULL;
>>> XLU_Config *config = 0;
>>> + struct stat b;
>>> + int rc = 0;
>>>
>>>
>>> if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
>>> virtdev, phys ? phys : "") < 0) {
>>> fprintf(stderr, "out of memory\n");
>>> - return;
>>> + return 1;
>>
>> ERROR_NOMEM
>
> xl seems pretty inconsistent in its use of libxl error codes, sometimes
> it uses +ERROR_FOO, other times -ERROR_FOO and other times it uses its
> own open coded numbers.
>
> So I wouldn't say this is wrong as such but so long as the final xl exit
> code is 0 on success and non-zero otherwise I think it is up to George.
Yes I agree, xl is full of return 1, -1 and things like that, but anyway
I think it was worth mentioning.
>>
>>> }
>>>
>>> parse_disk_config(&config, buf, &disk);
>>>
>>> - libxl_cdrom_insert(ctx, domid, &disk, NULL);
>>> + /* ATM the existence of the backing file is not checked for qdisk
>>> + * in libxl_cdrom_insert() because RAW is used for remote
>>> + * protocols as well as plain files. This will ideally be changed
>>> + * for 4.4, but this work-around fixes the problem of "cd-insert"
>>> + * returning success for non-existent files. */
>>> + if (disk.format != LIBXL_DISK_FORMAT_EMPTY
>>> + && stat(disk.pdev_path, &b)) {
>>> + fprintf(stderr, "Cannot stat file: %s\n",
>>> + disk.pdev_path);
>>
>> You are leaking buf here, I know xl is just about to exit,
>
> I prefer to have xl clear up properly whenever possible. Not because I
> care particularly about xl (which isn't generally long lived) but
> because it makes it possible to use valgrind+xl to check for leaks in
> libxl, and I care about that because other toolstacks which use libxl
> can be long lived and therefore care about leaks. Having xl not contain
> false positive leaks helps here.
>
> Ian.
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-13 9:35 ` Roger Pau Monné
2013-05-13 9:45 ` Ian Campbell
@ 2013-05-13 10:31 ` George Dunlap
1 sibling, 0 replies; 9+ messages in thread
From: George Dunlap @ 2013-05-13 10:31 UTC (permalink / raw)
To: Roger Pau Monné; +Cc: Ian Jackson, Ian Campbell, xen-devel
On 13/05/13 10:35, Roger Pau Monné wrote:
> On 10/05/13 17:43, George Dunlap wrote:
>> Two changes:
>> * Stat the file before calling libxl_cdrom_insert()
>> * Return an error if anything fails (including libxl_cdrom_insert)
>>
>> This is in part to work around the fact that the RAW disk type
>> is used for things that aren't actually files; so we can't call
>> stat in libxl_device.c:libxl__device_disk_set_backend() because
>> it may be going over a remote protocol.
>>
>> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>> CC: Ian Campbell <ian.campbell@citrix.com>
>> CC: Ian Jackson <ian.jackson@citrix.com>
>> ---
>> tools/libxl/xl_cmdimpl.c | 26 +++++++++++++++++++++-----
>> 1 file changed, 21 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
>> index c1a969b..e8ce35b 100644
>> --- a/tools/libxl/xl_cmdimpl.c
>> +++ b/tools/libxl/xl_cmdimpl.c
>> @@ -2505,25 +2505,42 @@ int main_memset(int argc, char **argv)
>> return 0;
>> }
>>
>> -static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
>> +static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
>> {
>> libxl_device_disk disk; /* we don't free disk's contents */
>> char *buf = NULL;
>> XLU_Config *config = 0;
>> + struct stat b;
>> + int rc = 0;
>>
>>
>> if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
>> virtdev, phys ? phys : "") < 0) {
>> fprintf(stderr, "out of memory\n");
>> - return;
>> + return 1;
> ERROR_NOMEM
If this were a library function I would definitely return -ERROR_NOMEM;
but since this is just a helper function whose value is going to be
returned to the command-line, I think just returning 1 is the best thing
to do.
>
>> }
>>
>> parse_disk_config(&config, buf, &disk);
>>
>> - libxl_cdrom_insert(ctx, domid, &disk, NULL);
>> + /* ATM the existence of the backing file is not checked for qdisk
>> + * in libxl_cdrom_insert() because RAW is used for remote
>> + * protocols as well as plain files. This will ideally be changed
>> + * for 4.4, but this work-around fixes the problem of "cd-insert"
>> + * returning success for non-existent files. */
>> + if (disk.format != LIBXL_DISK_FORMAT_EMPTY
>> + && stat(disk.pdev_path, &b)) {
>> + fprintf(stderr, "Cannot stat file: %s\n",
>> + disk.pdev_path);
> You are leaking buf here, I know xl is just about to exit, but it might
> be best to to define a label below that contains:
Oops! Sorry about that...
>> + return 1;
> ERROR_INVAL
>
>> + }
>> +
>> + if (libxl_cdrom_insert(ctx, domid, &disk, NULL))
>> + rc=1;
> You could use the return value of libxl_cdrom_insert instead of 1.
I sort of assumed that libxl_cdrom_insert() was a negative value, and
that I wanted xl to return 1.
I'll send a respin w/ the leak fixed.
-George
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-30 9:00 ` Ian Campbell
@ 2013-05-30 9:28 ` George Dunlap
0 siblings, 0 replies; 9+ messages in thread
From: George Dunlap @ 2013-05-30 9:28 UTC (permalink / raw)
To: Ian Campbell; +Cc: Ian Jackson, xen-devel
On Thu, May 30, 2013 at 10:00 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Tue, 2013-05-14 at 11:07 +0100, George Dunlap wrote:
>> Two changes:
>> * Stat the file before calling libxl_cdrom_insert()
>> * Return an error if anything fails (including libxl_cdrom_insert)
>>
>> This is in part to work around the fact that the RAW disk type
>> is used for things that aren't actually files; so we can't call
>> stat in libxl_device.c:libxl__device_disk_set_backend() because
>> it may be going over a remote protocol.
>>
>> v2:
>> - Avoid leaking buf
>>
>> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>
> Acked + applied, thanks.
>
>> + /* ATM the existence of the backing file is not checked for qdisk
>> + * in libxl_cdrom_insert() because RAW is used for remote
>> + * protocols as well as plain files. This will ideally be changed
>> + * for 4.4, but this work-around fixes the problem of "cd-insert"
>> + * returning success for non-existent files. */
>
> Is this on your 4.4 list?
Yes:
* libxl: Don't use RAW format for "URL"-based qdisks (e.g., rbd:rbd/foo.img)
We talked about this at the hackathon as well.
-George
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] xl: Return an error if an empty file is passed to cd-insert
2013-05-14 10:07 George Dunlap
@ 2013-05-30 9:00 ` Ian Campbell
2013-05-30 9:28 ` George Dunlap
0 siblings, 1 reply; 9+ messages in thread
From: Ian Campbell @ 2013-05-30 9:00 UTC (permalink / raw)
To: George Dunlap; +Cc: Ian Jackson, xen-devel
On Tue, 2013-05-14 at 11:07 +0100, George Dunlap wrote:
> Two changes:
> * Stat the file before calling libxl_cdrom_insert()
> * Return an error if anything fails (including libxl_cdrom_insert)
>
> This is in part to work around the fact that the RAW disk type
> is used for things that aren't actually files; so we can't call
> stat in libxl_device.c:libxl__device_disk_set_backend() because
> it may be going over a remote protocol.
>
> v2:
> - Avoid leaking buf
>
> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Acked + applied, thanks.
> + /* ATM the existence of the backing file is not checked for qdisk
> + * in libxl_cdrom_insert() because RAW is used for remote
> + * protocols as well as plain files. This will ideally be changed
> + * for 4.4, but this work-around fixes the problem of "cd-insert"
> + * returning success for non-existent files. */
Is this on your 4.4 list?
Ian.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] xl: Return an error if an empty file is passed to cd-insert
@ 2013-05-14 10:07 George Dunlap
2013-05-30 9:00 ` Ian Campbell
0 siblings, 1 reply; 9+ messages in thread
From: George Dunlap @ 2013-05-14 10:07 UTC (permalink / raw)
To: xen-devel; +Cc: George Dunlap, Ian Jackson, Ian Campbell
Two changes:
* Stat the file before calling libxl_cdrom_insert()
* Return an error if anything fails (including libxl_cdrom_insert)
This is in part to work around the fact that the RAW disk type
is used for things that aren't actually files; so we can't call
stat in libxl_device.c:libxl__device_disk_set_backend() because
it may be going over a remote protocol.
v2:
- Avoid leaking buf
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
CC: Ian Campbell <ian.campbell@citrix.com>
CC: Ian Jackson <ian.jackson@citrix.com>
---
tools/libxl/xl_cmdimpl.c | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index c1a969b..2ef6875 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2505,25 +2505,45 @@ int main_memset(int argc, char **argv)
return 0;
}
-static void cd_insert(uint32_t domid, const char *virtdev, char *phys)
+static int cd_insert(uint32_t domid, const char *virtdev, char *phys)
{
libxl_device_disk disk; /* we don't free disk's contents */
char *buf = NULL;
XLU_Config *config = 0;
+ struct stat b;
+ int rc = 0;
if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
virtdev, phys ? phys : "") < 0) {
fprintf(stderr, "out of memory\n");
- return;
+ rc = 1;
+ goto out;
}
parse_disk_config(&config, buf, &disk);
- libxl_cdrom_insert(ctx, domid, &disk, NULL);
+ /* ATM the existence of the backing file is not checked for qdisk
+ * in libxl_cdrom_insert() because RAW is used for remote
+ * protocols as well as plain files. This will ideally be changed
+ * for 4.4, but this work-around fixes the problem of "cd-insert"
+ * returning success for non-existent files. */
+ if (disk.format != LIBXL_DISK_FORMAT_EMPTY
+ && stat(disk.pdev_path, &b)) {
+ fprintf(stderr, "Cannot stat file: %s\n",
+ disk.pdev_path);
+ rc = 1;
+ goto out;
+ }
+
+ if (libxl_cdrom_insert(ctx, domid, &disk, NULL))
+ rc=1;
+out:
libxl_device_disk_dispose(&disk);
free(buf);
+
+ return rc;
}
int main_cd_eject(int argc, char **argv)
@@ -2539,8 +2559,7 @@ int main_cd_eject(int argc, char **argv)
domid = find_domain(argv[optind]);
virtdev = argv[optind + 1];
- cd_insert(domid, virtdev, NULL);
- return 0;
+ return cd_insert(domid, virtdev, NULL);
}
int main_cd_insert(int argc, char **argv)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-05-30 9:28 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-10 15:43 [PATCH] xl: Return an error if an empty file is passed to cd-insert George Dunlap
2013-05-10 15:57 ` George Dunlap
2013-05-13 9:35 ` Roger Pau Monné
2013-05-13 9:45 ` Ian Campbell
2013-05-13 10:03 ` Roger Pau Monné
2013-05-13 10:31 ` George Dunlap
2013-05-14 10:07 George Dunlap
2013-05-30 9:00 ` Ian Campbell
2013-05-30 9:28 ` George Dunlap
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.