OSDN Git Service

* src/prototypes.h (str_safe_copy): newly added.
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 26 Sep 2004 15:41:41 +0000 (15:41 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 26 Sep 2004 15:41:41 +0000 (15:41 +0000)
(build_backup_file, cmd_add, cmd_delete):
added argument the size for build_standard_archive_name() and
build_backup_file().

* src/header.c (init_header): use str_safe_copy() instead of strcpy().

* src/lhadd.c (build_backup_file, cmd_add, cmd_delete):
added argument the size for build_standard_archive_name() and
build_backup_file().

* src/lhext.c (make_parent_path): use str_safe_copy() instead of strcpy().
(extract_one): ditto.

* src/lharc.c (find_files): use str_safe_copy() instead of strcpy().
(build_temporary_name): ditto.
(modify_filename_extention): ditto.
(build_backup_name): ditto.
(build_standard_archive_name): ditto.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@795 6a8cc165-1e22-0410-a132-eb4e3f353aba

src/header.c
src/lhadd.c
src/lharc.c
src/lhext.c
src/prototypes.h

index 614872d..5620619 100644 (file)
@@ -615,8 +615,8 @@ get_extended_header(fp, hdr, header_size, hcrc)
             name_length = sizeof(hdr->name) - dir_length - 1;
             hdr->name[name_length] = 0;
         }
-        strcat(dirname, hdr->name);
-        strcpy(hdr->name, dirname);
+        strcat(dirname, hdr->name); /* ok */
+        strcpy(hdr->name, dirname); /* ok */
         name_length += dir_length;
     }
 
@@ -1127,7 +1127,7 @@ get_header(fp, hdr)
             /* hdr->name is symbolic link name */
             /* hdr->realname is real name */
             *p = 0;
-            strcpy(hdr->realname, p+1);
+            strcpy(hdr->realname, p+1); /* ok */
         }
         else
             error("unknown symlink name \"%s\"", hdr->name);
@@ -1194,8 +1194,7 @@ init_header(name, v_stat, hdr)
     hdr->original_size = v_stat->st_size;
     hdr->attribute = GENERIC_ATTRIBUTE;
     hdr->header_level = header_level;
-    strcpy(hdr->name, name);
-    len = strlen(name);
+    len = str_safe_copy(hdr->name, name, sizeof(hdr->name));
     hdr->crc = 0x0000;
     hdr->extend_type = EXTEND_UNIX;
     hdr->unix_last_modified_stamp = v_stat->st_mtime;
@@ -1237,8 +1236,13 @@ init_header(name, v_stat, hdr)
         memcpy(hdr->method, LZHDIRS_METHOD, METHOD_TYPE_STORAGE);
         hdr->attribute = GENERIC_DIRECTORY_ATTRIBUTE;
         hdr->original_size = 0;
-        if (len > 0 && hdr->name[len - 1] != '/')
-            strcpy(&hdr->name[len++], "/");
+        if (len > 0 && hdr->name[len - 1] != '/') {
+            if (len < sizeof(hdr->name)-1)
+                strcpy(&hdr->name[len++], "/"); /* ok */
+            else
+                warning("the length of dirname \"%s\" is too long.",
+                        hdr->name);
+        }
     }
 
 #ifdef S_IFLNK
index 9b9177c..4ce0dca 100644 (file)
@@ -198,7 +198,7 @@ find_update_files(oafp)
                 add_sp(&sp, hdr.name, strlen(hdr.name) + 1);
         }
         else if ((hdr.unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_DIRECTORY) {
-            strcpy(name, hdr.name);
+            strcpy(name, hdr.name); /* ok */
             len = strlen(name);
             if (len > 0 && name[len - 1] == '/')
                 name[--len] = '\0'; /* strip tail '/' */
@@ -275,7 +275,8 @@ static void
 build_backup_file()
 {
 
-    build_backup_name(backup_archive_name, archive_name);
+    build_backup_name(backup_archive_name, archive_name,
+                      sizeof(backup_archive_name));
     if (!noexec) {
         signal(SIGINT, SIG_IGN);
 #ifdef SIGHUP
@@ -464,7 +465,9 @@ cmd_add()
 
     if (oafp && archive_is_msdos_sfx1(archive_name)) {
         seek_lha_header(oafp);
-        build_standard_archive_name(new_archive_name_buffer, archive_name);
+        build_standard_archive_name(new_archive_name_buffer,
+                                    archive_name,
+                                    sizeof(new_archive_name_buffer));
         new_archive_name = new_archive_name_buffer;
     }
     else {
@@ -592,7 +595,9 @@ cmd_delete()
 
     if (archive_is_msdos_sfx1(archive_name)) {
         seek_lha_header(oafp);
-        build_standard_archive_name(new_archive_name_buffer, archive_name);
+        build_standard_archive_name(new_archive_name_buffer,
+                                    archive_name,
+                                    sizeof(new_archive_name_buffer));
         new_archive_name = new_archive_name_buffer;
     }
     else {
index c5dcdce..9a84f01 100644 (file)
@@ -803,7 +803,7 @@ xstrdup(str)
 {
     int len = strlen(str);
     char *p = (char *)xmalloc(len + 1);
-    strcpy(p, str);
+    strcpy(p, str);             /* ok */
     return p;
 }
 
@@ -1000,11 +1000,12 @@ find_files(name, v_filec, v_filev)
     struct stat     tmp_stbuf, arc_stbuf, fil_stbuf;
     int exist_tmp = 1, exist_arc = 1;
 
-    strcpy(newname, name);
-    len = strlen(name);
+    len = str_safe_copy(newname, name, sizeof(newname));
     if (len > 0 && newname[len - 1] != '/') {
-        newname[len++] = '/';
-        newname[len] = 0;
+        if (len < sizeof(newname)-1)
+            strcpy(&newname[len++], "/"); /* ok */
+        else
+            warning("the length of pathname \"%s\" is too long.", name);
     }
 
     dirp = opendir(name);
@@ -1089,20 +1090,31 @@ build_temporary_name()
 #ifdef TMP_FILENAME_TEMPLATE
     /* "/tmp/lhXXXXXX" etc. */
     if (extract_directory == NULL) {
-        strcpy(temporary_name, TMP_FILENAME_TEMPLATE);
+        str_safe_copy(temporary_name, TMP_FILENAME_TEMPLATE,
+                      sizeof(temporary_name));
     }
     else {
         xsnprintf(temporary_name, sizeof(temporary_name),
                   "%s/lhXXXXXX", extract_directory);
     }
 #else
-    char           *p, *s;
-
-    strcpy(temporary_name, archive_name);
-    for (p = temporary_name, s = (char *) 0; *p; p++)
-        if (*p == '/')
-            s = p;
-    strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+    char *s;
+
+    str_safe_copy(temporary_name, archive_name, sizeof(temporary_name));
+    s = strrchr(temporary_name, '/');
+    if (s) {
+        int len;
+        len = s - temporary_name;
+        if (len + strlen("lhXXXXXX") < sizeof(temporary_name))
+            /* use directory at archive file */
+            strcpy(s, "lhXXXXXX"); /* ok */
+        else
+            /* use current directory */
+            str_safe_copy(temporary_name, "lhXXXXXX", sizeof(temporary_name));
+    }
+    else
+        /* use current directory */
+        str_safe_copy(temporary_name, "lhXXXXXX", sizeof(temporary_name));
 #endif
 #ifdef HAVE_MKSTEMP
     {
@@ -1129,9 +1141,10 @@ build_temporary_name()
 
 /* ------------------------------------------------------------------------ */
 static void
-modify_filename_extention(buffer, ext)
+modify_filename_extention(buffer, ext, size)
     char           *buffer;
     char           *ext;
+    size_t size;
 {
     register char  *p, *dot;
 
@@ -1145,28 +1158,30 @@ modify_filename_extention(buffer, ext)
     if (dot)
         p = dot;
 
-    strcpy(p, ext);
+    str_safe_copy(p, ext, size - (p - buffer));
 }
 
 /* ------------------------------------------------------------------------ */
 /* build backup file name */
 void
-build_backup_name(buffer, original)
+build_backup_name(buffer, original, size)
     char           *buffer;
     char           *original;
+    size_t size;
 {
-    strcpy(buffer, original);
-    modify_filename_extention(buffer, BACKUPNAME_EXTENTION);    /* ".bak" */
+    str_safe_copy(buffer, original, size);
+    modify_filename_extention(buffer, BACKUPNAME_EXTENTION, size);    /* ".bak" */
 }
 
 /* ------------------------------------------------------------------------ */
 void
-build_standard_archive_name(buffer, orginal)
+build_standard_archive_name(buffer, original, size)
     char           *buffer;
-    char           *orginal;
+    char           *original;
+    size_t size;
 {
-    strcpy(buffer, orginal);
-    modify_filename_extention(buffer, ARCHIVENAME_EXTENTION);   /* ".lzh" */
+    str_safe_copy(buffer, original, size);
+    modify_filename_extention(buffer, ARCHIVENAME_EXTENTION, size);   /* ".lzh" */
 }
 
 /* ------------------------------------------------------------------------ */
index 3fdbd65..1092c27 100644 (file)
@@ -88,7 +88,7 @@ make_parent_path(name)
     register char  *p;
 
     /* make parent directory name into PATH for recursive call */
-    strcpy(path, name);
+    str_safe_copy(path, name, sizeof(path));
     for (p = path + strlen(path); p > path; p--)
         if (p[-1] == '/') {
             *--p = '\0';
@@ -250,8 +250,7 @@ extract_one(afp, hdr)
     if (extract_directory)
         xsnprintf(name, sizeof(name), "%s/%s", extract_directory, q);
     else
-        strcpy(name, q);
-
+        str_safe_copy(name, q, sizeof(name));
 
     /* LZHDIRS_METHOD¤ò»ý¤Ä¥Ø¥Ã¥À¤ò¥Á¥§¥Ã¥¯¤¹¤ë */
     /* 1999.4.30 t.okamoto */
index 413bdbe..7947ace 100644 (file)
@@ -87,8 +87,8 @@ void cleaning_files P_((int *v_filec, char ***v_filev));
 boolean find_files P_((char *name, int *v_filec, char ***v_filev));
 void free_files P_((int filec, char **filev));
 int build_temporary_name P_((void));
-void build_backup_name P_((char *buffer, char *original));
-void build_standard_archive_name P_((char *buffer, char *orginal));
+void build_backup_name P_((char *buffer, char *original, size_t size));
+void build_standard_archive_name P_((char *buffer, char *orginal, size_t size));
 boolean need_file P_((char *name));
 FILE *xfopen P_((char *name, char *mode));
 FILE *open_old_archive P_((void));
@@ -127,6 +127,7 @@ char *xstrchr P_((const char *s, int c));
 char *xstrrchr P_((const char *s, int c));
 char *xmemchr P_((const char *s, int c, size_t n));
 char *xmemrchr P_((const char *s, int c, size_t n));
+int str_safe_copy P_((char *dst, const char *src, int dstsz));
 
 /* util.c */
 #if !HAVE_MEMMOVE