projects
/
oweals
/
opkg-lede.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Clarify why we're not using fseek(), use fseek() where applicable.
[oweals/opkg-lede.git]
/
libbb
/
unarchive.c
diff --git
a/libbb/unarchive.c
b/libbb/unarchive.c
index 03a63bdd958b7b2c872b99dce85491d9442f1313..62ca2674e4aec15024a0ee1fc91050c30580a12a 100644
(file)
--- a/
libbb/unarchive.c
+++ b/
libbb/unarchive.c
@@
-61,11
+61,15
@@
seek_by_read(FILE* fd, size_t len)
}
static void
}
static void
-seek_sub_file(FILE *
src_stream
, const int count)
+seek_sub_file(FILE *
fd
, const int count)
{
{
- /* Try to fseek as faster */
archive_offset += count;
archive_offset += count;
- seek_by_read(src_stream, count);
+
+ /* Do not use fseek() on a pipe. It may fail with ESPIPE, leaving the
+ * stream at an undefined location.
+ */
+ seek_by_read(fd, count);
+
return;
}
return;
}
@@
-686,7
+690,12
@@
deb_extract(const char *package_filename, FILE *out_stream,
free_header_ar(ar_header);
break;
}
free_header_ar(ar_header);
break;
}
- seek_sub_file(deb_stream, ar_header->size);
+ if (fseek(deb_stream, ar_header->size, SEEK_CUR) == -1) {
+ opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
+ *err = -1;
+ free_header_ar(ar_header);
+ goto cleanup;
+ }
free_header_ar(ar_header);
}
goto cleanup;
free_header_ar(ar_header);
}
goto cleanup;
@@
-696,7
+705,11
@@
deb_extract(const char *package_filename, FILE *out_stream,
FILE *unzipped_opkg_stream;
file_header_t *tar_header;
archive_offset = 0;
FILE *unzipped_opkg_stream;
file_header_t *tar_header;
archive_offset = 0;
- fseek(deb_stream, 0, SEEK_SET);
+ if (fseek(deb_stream, 0, SEEK_SET) == -1) {
+ opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
+ *err = -1;
+ goto cleanup;
+ }
unzipped_opkg_stream = gz_open(deb_stream, &unzipped_opkg_pid);
if (unzipped_opkg_stream == NULL) {
*err = -1;
unzipped_opkg_stream = gz_open(deb_stream, &unzipped_opkg_pid);
if (unzipped_opkg_stream == NULL) {
*err = -1;