Sophie

Sophie

distrib > Fedora > 13 > i386 > media > updates-src > by-pkgid > 53e55667a77e89bc0f224734f1c7c669 > files > 1

groff-1.18.1.4-22.fc13.src.rpm

--- groff-1.16/src/roff/troff/input.cc.safer	Wed Jun  7 21:47:48 2000
+++ groff-1.16/src/roff/troff/input.cc	Wed Jun  7 21:50:37 2000
@@ -4404,12 +4406,28 @@
   else {
     while (!tok.newline() && !tok.eof())
       tok.next();
-    errno = 0;
-    FILE *fp = fopen(nm.contents(), "r");
-    if (fp)
-      input_stack::push(new file_iterator(fp, nm.contents()));
-    else
-      error("can't open `%1': %2", nm.contents(), strerror(errno));
+    char cbuf[PATH_MAX], * cwd;
+    char pbuf[PATH_MAX], * path;
+    struct stat st;
+
+    if ((cwd = realpath(".", cbuf)) == NULL)
+      error("realpath on `%1' failed: %2", ".", strerror(errno));
+    else if ((path = realpath(nm.contents(), pbuf)) == NULL)
+      error("realpath on `%1' failed: %2", nm.contents(), strerror(errno));
+    else if (safer_flag && strncmp(cwd, path, strlen(cwd)))
+      error("won't source `%1' outside of `%2' without -U flag", path, cwd);
+    else if (stat(path, &st) < 0)
+      error("can't stat `%1': %2", path, strerror(errno));
+    else if (safer_flag && !S_ISREG(st.st_mode))
+      error("won't source non-file `%1' without -U flag", path);
+    else {
+      errno = 0;
+      FILE *fp = fopen(path, "r");
+      if (fp)
+        input_stack::push(new file_iterator(fp, nm.contents()));
+      else
+        error("can't open `%1': %2", path, strerror(errno));
+    }
     tok.next();
   }
 }