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;
}
/* 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);
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;
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
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 '/' */
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
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 {
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 {
{
int len = strlen(str);
char *p = (char *)xmalloc(len + 1);
- strcpy(p, str);
+ strcpy(p, str); /* ok */
return p;
}
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);
#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
{
/* ------------------------------------------------------------------------ */
static void
-modify_filename_extention(buffer, ext)
+modify_filename_extention(buffer, ext, size)
char *buffer;
char *ext;
+ size_t size;
{
register char *p, *dot;
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" */
}
/* ------------------------------------------------------------------------ */
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';
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 */
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));
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