summaryrefslogtreecommitdiffstats
path: root/fs/binfmt_flat.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-14 21:13:32 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-14 21:13:32 -0400
commit581bfce969cbfc7ce43ee92273be9cb7c3fdfa61 (patch)
tree0a693778ce39c49b9b7d93d0d6795c576896f5cf /fs/binfmt_flat.c
parentcc73fee0bae2d66594d1fa2df92bbd783aa98e04 (diff)
parent9725d4cef62229b4ec4c912e0db0761e7d400650 (diff)
Merge branch 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more set_fs removal from Al Viro: "Christoph's 'use kernel_read and friends rather than open-coding set_fs()' series" * 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fs: unexport vfs_readv and vfs_writev fs: unexport vfs_read and vfs_write fs: unexport __vfs_read/__vfs_write lustre: switch to kernel_write gadget/f_mass_storage: stop messing with the address limit mconsole: switch to kernel_read btrfs: switch write_buf to kernel_write net/9p: switch p9_fd_read to kernel_write mm/nommu: switch do_mmap_private to kernel_read serial2002: switch serial2002_tty_write to kernel_{read/write} fs: make the buf argument to __kernel_write a void pointer fs: fix kernel_write prototype fs: fix kernel_read prototype fs: move kernel_read to fs/read_write.c fs: move kernel_write to fs/read_write.c autofs4: switch autofs4_write to __kernel_write ashmem: switch to ->read_iter
Diffstat (limited to 'fs/binfmt_flat.c')
-rw-r--r--fs/binfmt_flat.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index ce6537c50ec1..475d083f8088 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -176,19 +176,14 @@ static int create_flat_tables(struct linux_binprm *bprm, unsigned long arg_start
176#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ 176#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
177#define RESERVED 0xC0 /* bit 6,7: reserved */ 177#define RESERVED 0xC0 /* bit 6,7: reserved */
178 178
179static int decompress_exec( 179static int decompress_exec(struct linux_binprm *bprm, loff_t fpos, char *dst,
180 struct linux_binprm *bprm, 180 long len, int fd)
181 unsigned long offset,
182 char *dst,
183 long len,
184 int fd)
185{ 181{
186 unsigned char *buf; 182 unsigned char *buf;
187 z_stream strm; 183 z_stream strm;
188 loff_t fpos;
189 int ret, retval; 184 int ret, retval;
190 185
191 pr_debug("decompress_exec(offset=%lx,buf=%p,len=%lx)\n", offset, dst, len); 186 pr_debug("decompress_exec(offset=%llx,buf=%p,len=%lx)\n", fpos, dst, len);
192 187
193 memset(&strm, 0, sizeof(strm)); 188 memset(&strm, 0, sizeof(strm));
194 strm.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); 189 strm.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
@@ -202,13 +197,11 @@ static int decompress_exec(
202 } 197 }
203 198
204 /* Read in first chunk of data and parse gzip header. */ 199 /* Read in first chunk of data and parse gzip header. */
205 fpos = offset; 200 ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos);
206 ret = kernel_read(bprm->file, offset, buf, LBUFSIZE);
207 201
208 strm.next_in = buf; 202 strm.next_in = buf;
209 strm.avail_in = ret; 203 strm.avail_in = ret;
210 strm.total_in = 0; 204 strm.total_in = 0;
211 fpos += ret;
212 205
213 retval = -ENOEXEC; 206 retval = -ENOEXEC;
214 207
@@ -274,7 +267,7 @@ static int decompress_exec(
274 } 267 }
275 268
276 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) { 269 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) {
277 ret = kernel_read(bprm->file, fpos, buf, LBUFSIZE); 270 ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos);
278 if (ret <= 0) 271 if (ret <= 0)
279 break; 272 break;
280 len -= ret; 273 len -= ret;
@@ -282,7 +275,6 @@ static int decompress_exec(
282 strm.next_in = buf; 275 strm.next_in = buf;
283 strm.avail_in = ret; 276 strm.avail_in = ret;
284 strm.total_in = 0; 277 strm.total_in = 0;
285 fpos += ret;
286 } 278 }
287 279
288 if (ret < 0) { 280 if (ret < 0) {