unarchive: fix possible segmentation fault in deb_extract() When a not existing or unreachable file path is passed to deb_extract(), the wfopen() call fails, causing a jump to the cleanup: label which leads to a call to gzip_close() on the tar_outer structure. The tar_outer structure however contains uninitialized memory at this point, causing gzip_close() to operate on garbage data. Depending on the nature of the unitialized memory, this might lead to all sorts of issues, e.g. freeing of not allocated memory or invoking fclose() on garbage pointers. Solve this problem by initializing the tar_outer and tar_inner structures right at the declaration. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
treewrite: use Lindent to reformat to kernel coding style Use the kernels "Lindent" script to reformat files using kernel coding style. This should make subsequent refactoring much easier. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
libbb: use external gzip command as I/O layer Remove the builtin inflate code and rely on the external gzip command instead to inflate data streams. This change is needed to properly support vfork(). We cannot use the builtin code because it uses a single global state which will get clobbered when recursively inflating nested archives. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Allow vfork()ing an external gunzip binary instead of using fork(). Patch from Mike Westerhof, with minor modifications to allow the use of both GNU gunzip and busybox gunzip. His original patch header follows. This patch allows a user to set an environment variable to cause opkg to select either the built-in gunzip code or an external gunzip utility, in order to dodge the OOM Killer. The built-in code is, of course, is the most desirable way to use opkg, since it is far more efficient. However, the built-in code can trigger the OOM (out of memory) killer on small-memory machines, like the 32MB NSLU2. This occurs because a standard fork will duplicate the entire address space of the parent. Since opkg reads the entire feed database into memory, this problem is compounded by large feeds. This patch introduces a means for the user to cause opkg to use vfork() instead -- vfork() does not behave in the same manner as fork(), and does not trigger the OOM killer. However, the semantics of vfork() are such that it cannot run the built-in gunzip code. Instead, it must exec() an external utility to perform the gunzip operation. It seems counter-intuitive, but the vfork()/exec() approach is the only good way to avoid triggering the dreaded OOM killer. In order to use this, the user must manually set the OPKG_USE_VFORK environment variable to any value. For example: $ OPKG_USE_VFORK=1 opkg install samba The external utility used to do the gunzip operation is "busybox gunzip". It would have been nice to be able to just invoke "gunzip", but the full gunzip executable behaves slightly differently than does busybox, generating annoying warning messages. This is an update of the original patch by Mike Westerhof, Dec 2008. Mike Westerhof, Feb 2011 git-svn-id: http://opkg.googlecode.com/svn/trunk@604 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
Don't truncate long symlink paths. Patch from Richard Purdie. Tracked as Issue #72. Original patch header follows. If a tarball contains a long symlink (over 100 chars) in a longpath (over 100 chars) then the resulting link or path can be truncated to 100 chars. This is due to a bug where if both 'L' and 'K' entries are found in the tarball, only the first one takes affect due to get_header_tar recursively calling itself. To fix this, process longname and linkname at the end of the function rather than the start after any subcalls have taken place. Richard Purdie 22/12/2010 git-svn-id: http://opkg.googlecode.com/svn/trunk@594 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
Remove trailing whitespace. Sorry if this breaks your patches. git-svn-id: http://opkg.googlecode.com/svn/trunk@552 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
Flush stdout, stderr before forking. From Richard Purdie. Thanks! Patch to remove "duplicate" bits of logs from opkg output, which massively simplifies do_rootfs logs. The reason is we get unflushed data passed to the children and duplicated. RP - 26/1/10 git-svn-id: http://opkg.googlecode.com/svn/trunk@522 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358