On 11/17/2010 05:41 PM, Pádraig Brady wrote:

> Yes that is marginally safer but less useful in the common
> case of using an isolated +...
> 
> $ sort --debug +1
> sort: using `en_US.utf8' sorting rules
> sort: non-portable file name +1; use ./+1 instead
> sort: open failed: +1: No such file or directory

Is the issue here that the two error messages are confusing, and
that there should be just one?  If so, that's easy to fix by adding
a call to 'access', as follows.  Normally I'd use euidaccess but
that would introduce more dependencies than this issue is worth.
(PS. This patch spells it "nonportable", for consistency with
pathchk.)

diff --git a/src/sort.c b/src/sort.c
index 7e25f6a..1ad7386 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -3990,6 +3990,7 @@ main (int argc, char **argv)
   bool need_random = false;
   unsigned long int nthreads = 0;
   size_t nfiles = 0;
+  size_t unprotected_file_names = 0;
   bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
   bool obsolete_usage = (posix2_version () < 200112);
   char **files;
@@ -4113,6 +4114,7 @@ main (int argc, char **argv)
           if (argc <= optind)
             break;
           files[nfiles++] = argv[optind++];
+          unprotected_file_names += (c != -1);
         }
       else switch (c)
         {
@@ -4165,7 +4167,10 @@ main (int argc, char **argv)
                 }
             }
           if (! key)
-            files[nfiles++] = optarg;
+            {
+              files[nfiles++] = optarg;
+              unprotected_file_names++;
+            }
           break;
 
         case SORT_OPTION:
@@ -4470,6 +4475,15 @@ main (int argc, char **argv)
                quote (setlocale (LC_COLLATE, NULL)));
       else
         error (0, 0, _("using simple byte comparison"));
+
+      for (size_t i = 0; i < unprotected_file_names; i++)
+        if (files[i][0] == '+' && access (files[i], R_OK) == 0)
+          {
+            char const *q = quotearg_style (shell_quoting_style, files[i]);
+            error (0, 0, _("nonportable file name %s; use ./%s instead"),
+                   q, q);
+          }
+
       key_warnings (&gkey, gkey_only);
     }
 



Reply via email to