diff mbox

[v3,5/5] mkelf32: Close those file descriptors in the error paths.

Message ID 1455246507-5589-6-git-send-email-konrad.wilk@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Konrad Rzeszutek Wilk Feb. 12, 2016, 3:08 a.m. UTC
While we are operating here we may as well fix some of the
file descriptor leaks.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 xen/arch/x86/boot/mkelf32.c | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

Comments

Jan Beulich Feb. 18, 2016, 4:29 p.m. UTC | #1
>>> On 12.02.16 at 04:08, <konrad.wilk@oracle.com> wrote:
> While we are operating here we may as well fix some of the
> file descriptor leaks.

I'm not convinced. The added goto-s make the code uglier to read,
and this being a standalone utility there's not really any leak here.

Jan
Ian Jackson Feb. 18, 2016, 4:39 p.m. UTC | #2
Jan Beulich writes ("Re: [PATCH v3 5/5] mkelf32: Close those file descriptors in the error paths."):
> On 12.02.16 at 04:08, <konrad.wilk@oracle.com> wrote:
> > While we are operating here we may as well fix some of the
> > file descriptor leaks.
> 
> I'm not convinced. The added goto-s make the code uglier to read,
> and this being a standalone utility there's not really any leak here.

I don't buy this `uglier to read'.  What `return 1' does is make me
think `is some resource being leaked' and `do I need to audit this
thing'.

Ian.
Jan Beulich Feb. 18, 2016, 4:45 p.m. UTC | #3
>>> On 18.02.16 at 17:39, <Ian.Jackson@eu.citrix.com> wrote:
> Jan Beulich writes ("Re: [PATCH v3 5/5] mkelf32: Close those file descriptors 
> in the error paths."):
>> On 12.02.16 at 04:08, <konrad.wilk@oracle.com> wrote:
>> > While we are operating here we may as well fix some of the
>> > file descriptor leaks.
>> 
>> I'm not convinced. The added goto-s make the code uglier to read,
>> and this being a standalone utility there's not really any leak here.
> 
> I don't buy this `uglier to read'.  What `return 1' does is make me
> think `is some resource being leaked' and `do I need to audit this
> thing'.

Certainly a matter of taste to some degree - goto-s are always
ugly to read to my eyes. Irrespective of this I don't buy the leak
aspect for a non-library like, short running build utility. The close()
calls are just more code, with absolutely no added benefit to the
system the code runs on.

Jan
Konrad Rzeszutek Wilk Feb. 18, 2016, 9:12 p.m. UTC | #4
On Thu, Feb 18, 2016 at 09:45:30AM -0700, Jan Beulich wrote:
> >>> On 18.02.16 at 17:39, <Ian.Jackson@eu.citrix.com> wrote:
> > Jan Beulich writes ("Re: [PATCH v3 5/5] mkelf32: Close those file descriptors 
> > in the error paths."):
> >> On 12.02.16 at 04:08, <konrad.wilk@oracle.com> wrote:
> >> > While we are operating here we may as well fix some of the
> >> > file descriptor leaks.
> >> 
> >> I'm not convinced. The added goto-s make the code uglier to read,
> >> and this being a standalone utility there's not really any leak here.
> > 
> > I don't buy this `uglier to read'.  What `return 1' does is make me
> > think `is some resource being leaked' and `do I need to audit this
> > thing'.
> 
> Certainly a matter of taste to some degree - goto-s are always
> ugly to read to my eyes. Irrespective of this I don't buy the leak
> aspect for a non-library like, short running build utility. The close()
> calls are just more code, with absolutely no added benefit to the
> system the code runs on.

<chuckles>

If I turned them in:

	if (..blah..)
	{
		close(infd);
		return -1;
	}

would that satisfy you?

(Irrespective of the 'no added benefit to the system the code runs
on.').

> 
> Jan
>
Jan Beulich Feb. 19, 2016, 11:39 a.m. UTC | #5
>>> On 18.02.16 at 22:12, <konrad.wilk@oracle.com> wrote:
> On Thu, Feb 18, 2016 at 09:45:30AM -0700, Jan Beulich wrote:
>> >>> On 18.02.16 at 17:39, <Ian.Jackson@eu.citrix.com> wrote:
>> > Jan Beulich writes ("Re: [PATCH v3 5/5] mkelf32: Close those file 
> descriptors 
>> > in the error paths."):
>> >> On 12.02.16 at 04:08, <konrad.wilk@oracle.com> wrote:
>> >> > While we are operating here we may as well fix some of the
>> >> > file descriptor leaks.
>> >> 
>> >> I'm not convinced. The added goto-s make the code uglier to read,
>> >> and this being a standalone utility there's not really any leak here.
>> > 
>> > I don't buy this `uglier to read'.  What `return 1' does is make me
>> > think `is some resource being leaked' and `do I need to audit this
>> > thing'.
>> 
>> Certainly a matter of taste to some degree - goto-s are always
>> ugly to read to my eyes. Irrespective of this I don't buy the leak
>> aspect for a non-library like, short running build utility. The close()
>> calls are just more code, with absolutely no added benefit to the
>> system the code runs on.
> 
> <chuckles>
> 
> If I turned them in:
> 
> 	if (..blah..)
> 	{
> 		close(infd);
> 		return -1;
> 	}
> 
> would that satisfy you?

Since presumably this would be on a number of error paths, I'm
afraid ...

> (Irrespective of the 'no added benefit to the system the code runs
> on.').

... this aspect would still be an relevant one.

Jan
Ian Jackson Feb. 19, 2016, 11:42 a.m. UTC | #6
Konrad Rzeszutek Wilk writes ("Re: [PATCH v3 5/5] mkelf32: Close those file descriptors in the error paths."):
> <chuckles>
> 
> If I turned them in:
> 
> 	if (..blah..)
> 	{
> 		close(infd);
> 		return -1;
> 	}
> 
> would that satisfy you?

I would strongly resist that.  That coding style is an error handling
antipattern.

Ian.
diff mbox

Patch

diff --git a/xen/arch/x86/boot/mkelf32.c b/xen/arch/x86/boot/mkelf32.c
index 993a7ee..890ae6d 100644
--- a/xen/arch/x86/boot/mkelf32.c
+++ b/xen/arch/x86/boot/mkelf32.c
@@ -230,9 +230,9 @@  int main(int argc, char **argv)
     u64        final_exec_addr;
     u32        loadbase, dat_siz, mem_siz;
     char      *inimage, *outimage;
-    int        infd, outfd;
+    int        infd, outfd = -1;
     char       buffer[1024];
-    int        bytes, todo, i;
+    int        bytes, todo, i, rc = 1;
 
     Elf32_Ehdr in32_ehdr;
 
@@ -256,7 +256,7 @@  int main(int argc, char **argv)
     {
         fprintf(stderr, "Failed to open input image '%s': %d (%s).\n",
                 inimage, errno, strerror(errno));
-        return 1;
+        goto out;
     }
 
     do_read(infd, &in32_ehdr, sizeof(in32_ehdr));
@@ -264,7 +264,7 @@  int main(int argc, char **argv)
          (in32_ehdr.e_ident[EI_DATA] != ELFDATA2LSB) )
     {
         fprintf(stderr, "Input image must be a little-endian Elf image.\n");
-        return 1;
+        goto out;
     }
 
     big_endian = (*(u16 *)in32_ehdr.e_ident == ((ELFMAG0 << 8) | ELFMAG1));
@@ -273,7 +273,7 @@  int main(int argc, char **argv)
     if ( in32_ehdr.e_ident[EI_CLASS] != ELFCLASS64 )
     {
         fprintf(stderr, "Bad program header class - we only do 64-bit!.\n");
-        return 1;
+        goto out;
     }
     (void)lseek(infd, 0, SEEK_SET);
     do_read(infd, &in64_ehdr, sizeof(in64_ehdr));
@@ -283,14 +283,14 @@  int main(int argc, char **argv)
     {
         fprintf(stderr, "Bad program header size (%d != %d).\n",
                 (int)in64_ehdr.e_phentsize, (int)sizeof(in64_phdr));
-        return 1;
+        goto out;
     }
 
     if ( in64_ehdr.e_phnum != 1 )
     {
         fprintf(stderr, "Expect precisly 1 program header; found %d.\n",
                 (int)in64_ehdr.e_phnum);
-        return 1;
+        goto out;
     }
 
     (void)lseek(infd, in64_ehdr.e_phoff, SEEK_SET);
@@ -327,7 +327,7 @@  int main(int argc, char **argv)
     {
         fprintf(stderr, "Failed to open output image '%s': %d (%s).\n",
                 outimage, errno, strerror(errno));
-        return 1;
+        goto out;
     }
 
     endianadjust_ehdr32(&out_ehdr);
@@ -339,7 +339,7 @@  int main(int argc, char **argv)
     if ( (bytes = RAW_OFFSET - sizeof(out_ehdr) - sizeof(out_phdr)) < 0 )
     {
         fprintf(stderr, "Header overflow.\n");
-        return 1;
+        goto out;
     }
     do_write(outfd, buffer, bytes);
 
@@ -358,10 +358,14 @@  int main(int argc, char **argv)
     do_write(outfd, out_shstrtab, sizeof(out_shstrtab));
     do_write(outfd, buffer, 4-((sizeof(out_shstrtab)+dat_siz)&3));
 
-    close(infd);
-    close(outfd);
+    rc = 0;
+out:
+    if ( infd != -1 )
+        close(infd);
+    if ( outfd != -1 )
+        close(outfd);
 
-    return 0;
+    return rc;
 }
 
 /*