* Reorder checks.
* Use simple string functions instead of regular expressions.
* Check for type flags before validating paths.

The latter ensures we don't treat tarball keywords/flags as directories.
This avoids problems with bsdtar inserting PaxHeader attributes into the
archive which look something like the following to Archive_Tar:

    PaxHeader/xcursor-protozoa
    xcursor-protozoa/
    xcursor-protozoa/PaxHeader/PKGBUILD
    xcursor-protozoa/PKGBUILD

This only occurs on certain filesystems (e.g. jfs), but the tarball is
by no means invalid. When extracted, it will only contain the PKGBUILD
within a single subdirectory.

Addresses FS#28802.

Thanks-to: Dave Reisner <[email protected]>
Signed-off-by: Lukas Fleischer <[email protected]>
---
Dave told me to go ahead and fix this. Here we go!

 web/html/pkgsubmit.php |   26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index 75a4b69..566890b 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -65,23 +65,25 @@ if ($uid):
                        $pkgbuild_raw = '';
                        $dircount = 0;
                        foreach ($tar->listContent() as $tar_file) {
-                               if (preg_match('/^[^\/]+\/PKGBUILD$/', 
$tar_file['filename'])) {
-                                       $pkgbuild_raw = 
$tar->extractInString($tar_file['filename']);
+                               if ($tar_file['typeflag'] == 0) {
+                                       if (strchr($tar_file['filename'], '/') 
=== false) {
+                                               $error = __("Error - source 
tarball may not contain files outside a directory.");
+                                               break;
+                                       }
+                                       elseif (substr($tar_file['filename'], 
-9) == '/PKGBUILD') {
+                                               $pkgbuild_raw = 
$tar->extractInString($tar_file['filename']);
+                                       }
                                }
-                               elseif (preg_match('/^[^\/]+\/$/', 
$tar_file['filename'])) {
-                                       if (++$dircount > 1) {
+                               elseif ($tar_file['typeflag'] == 5) {
+                                       if (substr_count($tar_file['filename'], 
"/") > 1) {
+                                               $error = __("Error - source 
tarball may not contain nested subdirectories.");
+                                               break;
+                                       }
+                                       elseif (++$dircount > 1) {
                                                $error = __("Error - source 
tarball may not contain more than one directory.");
                                                break;
                                        }
                                }
-                               elseif (preg_match('/^[^\/]+$/', 
$tar_file['filename'])) {
-                                       $error = __("Error - source tarball may 
not contain files outside a directory.");
-                                       break;
-                               }
-                               elseif (preg_match('/^[^\/]+\/[^\/]+\//', 
$tar_file['filename'])) {
-                                       $error = __("Error - source tarball may 
not contain nested subdirectories.");
-                                       break;
-                               }
                        }
 
                        if (!$error && empty($pkgbuild_raw)) {
-- 
1.7.9.4

Reply via email to