diff options
Diffstat (limited to 'meta-oe/recipes-support/libtar/files/0005-fix-file-descriptor-leaks-reported-by-cppcheck.patch')
-rw-r--r-- | meta-oe/recipes-support/libtar/files/0005-fix-file-descriptor-leaks-reported-by-cppcheck.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/meta-oe/recipes-support/libtar/files/0005-fix-file-descriptor-leaks-reported-by-cppcheck.patch b/meta-oe/recipes-support/libtar/files/0005-fix-file-descriptor-leaks-reported-by-cppcheck.patch new file mode 100644 index 0000000000..627c270163 --- /dev/null +++ b/meta-oe/recipes-support/libtar/files/0005-fix-file-descriptor-leaks-reported-by-cppcheck.patch | |||
@@ -0,0 +1,101 @@ | |||
1 | From d998b9f75c79aab68255dace641dd30db239eff6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Kamil Dudka <kdudka@redhat.com> | ||
3 | Date: Tue, 15 Oct 2013 19:48:41 -0400 | ||
4 | Subject: [PATCH] fix file descriptor leaks reported by cppcheck | ||
5 | |||
6 | Bug: https://bugzilla.redhat.com/785760 | ||
7 | |||
8 | Authored by Kamil Dudka <kdudka@redhat.com>. | ||
9 | |||
10 | Upstream-Status: Backport [https://repo.or.cz/libtar.git/commit/abd0274e6b2f708e9eaa29414b07b3f542cec694] | ||
11 | |||
12 | Signed-off-by: Katariina Lounento <katariina.lounento@vaisala.com> | ||
13 | --- | ||
14 | lib/append.c | 14 +++++++++----- | ||
15 | lib/extract.c | 4 ++++ | ||
16 | libtar/libtar.c | 3 +++ | ||
17 | 3 files changed, 16 insertions(+), 5 deletions(-) | ||
18 | |||
19 | diff --git a/lib/append.c b/lib/append.c | ||
20 | index e8bd89d..ff58532 100644 | ||
21 | --- a/lib/append.c | ||
22 | +++ b/lib/append.c | ||
23 | @@ -216,6 +216,7 @@ tar_append_regfile(TAR *t, const char *realname) | ||
24 | int filefd; | ||
25 | int i, j; | ||
26 | size_t size; | ||
27 | + int rv = -1; | ||
28 | |||
29 | filefd = open(realname, O_RDONLY); | ||
30 | if (filefd == -1) | ||
31 | @@ -234,25 +235,28 @@ tar_append_regfile(TAR *t, const char *realname) | ||
32 | { | ||
33 | if (j != -1) | ||
34 | errno = EINVAL; | ||
35 | - return -1; | ||
36 | + goto fail; | ||
37 | } | ||
38 | if (tar_block_write(t, &block) == -1) | ||
39 | - return -1; | ||
40 | + goto fail; | ||
41 | } | ||
42 | |||
43 | if (i > 0) | ||
44 | { | ||
45 | j = read(filefd, &block, i); | ||
46 | if (j == -1) | ||
47 | - return -1; | ||
48 | + goto fail; | ||
49 | memset(&(block[i]), 0, T_BLOCKSIZE - i); | ||
50 | if (tar_block_write(t, &block) == -1) | ||
51 | - return -1; | ||
52 | + goto fail; | ||
53 | } | ||
54 | |||
55 | + /* success! */ | ||
56 | + rv = 0; | ||
57 | +fail: | ||
58 | close(filefd); | ||
59 | |||
60 | - return 0; | ||
61 | + return rv; | ||
62 | } | ||
63 | |||
64 | |||
65 | diff --git a/lib/extract.c b/lib/extract.c | ||
66 | index 36357e7..9fc6ad5 100644 | ||
67 | --- a/lib/extract.c | ||
68 | +++ b/lib/extract.c | ||
69 | @@ -228,13 +228,17 @@ tar_extract_regfile(TAR *t, char *realname) | ||
70 | { | ||
71 | if (k != -1) | ||
72 | errno = EINVAL; | ||
73 | + close(fdout); | ||
74 | return -1; | ||
75 | } | ||
76 | |||
77 | /* write block to output file */ | ||
78 | if (write(fdout, buf, | ||
79 | ((i > T_BLOCKSIZE) ? T_BLOCKSIZE : i)) == -1) | ||
80 | + { | ||
81 | + close(fdout); | ||
82 | return -1; | ||
83 | + } | ||
84 | } | ||
85 | |||
86 | /* close output file */ | ||
87 | diff --git a/libtar/libtar.c b/libtar/libtar.c | ||
88 | index 9fa92b2..bb5644c 100644 | ||
89 | --- a/libtar/libtar.c | ||
90 | +++ b/libtar/libtar.c | ||
91 | @@ -83,7 +83,10 @@ gzopen_frontend(char *pathname, int oflags, int mode) | ||
92 | return -1; | ||
93 | |||
94 | if ((oflags & O_CREAT) && fchmod(fd, mode)) | ||
95 | + { | ||
96 | + close(fd); | ||
97 | return -1; | ||
98 | + } | ||
99 | |||
100 | gzf = gzdopen(fd, gzoflags); | ||
101 | if (!gzf) | ||