bug-gv
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug-gv] [PATCH] do not replace ~ a shell would not


From: Bernhard R. Link
Subject: [bug-gv] [PATCH] do not replace ~ a shell would not
Date: Fri, 6 May 2011 12:03:27 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

file_translateTildeInPath currently translates the first ~ it finds.
This is different from shell which only translates it if it is the
first character of a word and not if other letters follow.

As file_translateTildeInPath is always called with a single filename,
only replace it if this string is "~" or starts with "~/".

Additionally add an size argument to the function, so that no string
buffers can overrun and do not access a NULL pointer if HOME is not set.
---
 gv/src/file.c     |   27 ++++++++++++---------------
 gv/src/file.h     |    2 +-
 gv/src/main.c     |    4 ++--
 gv/src/resource.c |   10 +++++-----
 4 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/gv/src/file.c b/gv/src/file.c
index 3bbd617..c33e683 100644
--- a/gv/src/file.c
+++ b/gv/src/file.c
@@ -173,7 +173,7 @@ file_getTmpFilename(const char *baseDirectory, const char 
*baseFilename, int *fi
                         len, baseDirectory, tmpName, tmpExt);
         if (l < 0 || l >= sizeof(tempFilename) )
                 break;
-         file_translateTildeInPath(tempFilename);
+         file_translateTildeInPath(tempFilename, sizeof(tempFilename));
         oldumask = umask(0077);
         fd = mkstemp(tempFilename);
         umask(oldumask);
@@ -204,23 +204,20 @@ file_getTmpFilename(const char *baseDirectory, const char 
*baseFilename, int *fi
 /* Replaces tilde in string by user's home directory. */
 /*############################################################*/
 
-void
-file_translateTildeInPath(path)
-   char *path;
+void file_translateTildeInPath(char *path, size_t s)
 {
-   char *pos;
 
    BEGINMESSAGE(file_translateTildeInPath)
-   if ((pos=strchr(path,'~'))) {
-      char *home;
-      char tmp[GV_MAX_FILENAME_LENGTH];
-      home=getenv("HOME");
-      if (strlen(home)+strlen(path)-1 < GV_MAX_FILENAME_LENGTH-1) {
-         *pos='\0'; pos++;
-         strcpy(tmp,path);
-         strcat(tmp,home);
-         strcat(tmp,pos);
-         strcpy(path,tmp);
+   if (path[0] == '~' && (path[1] == '/' || path[1] == '\0')) {
+      char *home = getenv("HOME");
+
+      if (home != NULL) {
+         size_t pl = strlen(path);
+         size_t hl = strlen(home);
+         if (pl + hl - 1 < s - 1) {
+             memmove(path + hl, path + 1, pl - 1 + 1);
+             memcpy(path, home, hl);
+         }
       }
    }
    ENDMESSAGE(file_translateTildeInPath)
diff --git a/gv/src/file.h b/gv/src/file.h
index 402c3ef..e479dab 100644
--- a/gv/src/file.h
+++ b/gv/src/file.h
@@ -36,7 +36,7 @@
 extern char* file_getDirOfPath (char *);
 extern char* file_locateFilename (char *);
 extern char* file_getTmpFilename (const char *, const char *, int *);
-extern void  file_translateTildeInPath (char *);
+extern void  file_translateTildeInPath (char *, size_t);
 extern int   file_fileIsDir (char *);
 extern int   file_fileIsNotUseful (char *);
 extern char* file_pdfname2psname (char *);
diff --git a/gv/src/main.c b/gv/src/main.c
index dc2b773..74296c3 100644
--- a/gv/src/main.c
+++ b/gv/src/main.c
@@ -702,7 +702,7 @@ int main(argc, argv)
         char buffer[512];
        strcpy(buffer, app_res.scratch_dir);
        strcat(buffer,"gv-safe-workdir-XXXXXX");
-       file_translateTildeInPath(buffer);
+       file_translateTildeInPath(buffer, sizeof(buffer));
         gv_safe_gs_workdir = strdup(mkdtemp(buffer));
        gv_safe_gs_tempdir = 1;
 
@@ -721,7 +721,7 @@ int main(argc, argv)
        char* tmp_savepos_filename;
        
main_setInternResource(gv_database,&tmp_savepos_filename,"saveposFilename");
        strcpy(gv_savepos_filename, tmp_savepos_filename);
-       file_translateTildeInPath(gv_savepos_filename);
+       file_translateTildeInPath(gv_savepos_filename, 
sizeof(gv_savepos_filename));
     }
     
     
main_setInternResource(gv_database,&gv_uncompress_command,"uncompressCommand");
diff --git a/gv/src/resource.c b/gv/src/resource.c
index 5316485..1547542 100644
--- a/gv/src/resource.c
+++ b/gv/src/resource.c
@@ -175,7 +175,7 @@ resource_buildDatabase (
   INFMESSAGE(checking for user resources)
 
   strcpy(tmp,USER_DEFAULTS);
-  file_translateTildeInPath(tmp);
+  file_translateTildeInPath(tmp, sizeof(tmp));
   if (!file_fileIsNotUseful(tmp)) {
     s = XtNewString(tmp);
     tildeGv = USER_DEFAULTS;
@@ -254,7 +254,7 @@ resource_buildDatabase (
      
      strcpy(tmp,USER_DEFAULTS "-");
      strcat(tmp, locale1);
-     file_translateTildeInPath(tmp);
+     file_translateTildeInPath(tmp, sizeof(tmp));
      if (!stat(tmp, &buf))
      {
         i18n = 1;
@@ -304,7 +304,7 @@ resource_buildDatabase (
      
      strcpy(tmp,USER_DEFAULTS "-");
      strcat(tmp, locale2);
-     file_translateTildeInPath(tmp);
+     file_translateTildeInPath(tmp, sizeof(tmp));
      if (!stat(tmp, &buf))
      {
         i18n = 1;
@@ -349,7 +349,7 @@ resource_buildDatabase (
      
      strcpy(tmp,USER_DEFAULTS "-");
      strcat(tmp, locale3);
-     file_translateTildeInPath(tmp);
+     file_translateTildeInPath(tmp, sizeof(tmp));
      if (!stat(tmp, &buf))
      {
         i18n = 1;
@@ -874,7 +874,7 @@ static char* resource_mergeFileIntoDatabase(dbP,name)
     }
 
   strcpy(tmp,name);
-  file_translateTildeInPath(tmp);
+  file_translateTildeInPath(tmp, sizeof(tmp));
 
   if (tmp[0] != '/') {
     fprintf(stderr, "Ignoring resource file '%s'='%s' as no absolute path!\n",
-- 
1.5.6.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]