From oku.ns @ dream.com Wed Feb 21 00:53:29 2007 From: oku.ns @ dream.com (OKUMURA N. Shin-ya) Date: Wed, 21 Feb 2007 00:53:29 +0900 Subject: [Lha-users] =?iso-2022-jp?b?ZmlsZSAbJEIkSBsoQiAuL2ZpbGUg?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= Message-ID: <20070220155329.GA5528@okupc1.no-ip.org> おひさしぶりです、おくむら@練馬です。 最近、LHa for Unix を使っていて以下のような事象(というか、 仕樣?)に気づきました。 $ lha c a.lzh a.odt # a.odt を a.lzh に凍結 a.odt - Frozen(94%) ooo $ lha u a.lzh ./a.odt # ./a.odt を更新 ./a.odt - Frozen(94%) ooo $ lha a.lzh # a.lzh の中身を確認 PERMISSION UID GID SIZE RATIO STAMP NAME ---------- ----------- ------- ------ ------------ -------------------- -rw-r----- 501/100 20637 94.5% Jan 26 20:34 ./a.odt -rw-r----- 501/100 20637 94.5% Jan 26 20:34 a.odt ---------- ----------- ------- ------ ------------ -------------------- Total 2 files 41274 94.5% Feb 20 23:59 という感じで、 ・file ・./file が別々のファイルとしてアーカイブされてしまいます。 Info-ZIP 2.32 で同様の作業をすると、 $ zip a.zip a.odt updating: a.odt (deflated 6%) $ zip -u a.zip ./a.odt $ unzip -l a.zip Archive: a.zip Length Date Time Name -------- ---- ---- ---- 20637 01-26-07 20:34 a.odt -------- ------- 20637 1 file という感じで両者が同一視されるようです。 私個人としては、file と ./file は同一視された方がよいと思う のですが、他の方の考えはいかがでしょうか? もし修正するとしたら、lhadd.c の append_it の中か、あるいは 呼び出し直前で filev 先頭の「./」を取り除くのが安直でいいの かなと考えています(考えてるだけ)。 -- OKUMURA N. Shin-ya (oku.ns at dream.com) if (it == misfeature && it != bug) it = bug; From oku.ns @ dream.com Wed Feb 21 01:08:36 2007 From: oku.ns @ dream.com (OKUMURA N. Shin-ya) Date: Wed, 21 Feb 2007 01:08:36 +0900 Subject: [Lha-users] =?iso-2022-jp?b?UmU6IGZpbGUgGyRCJEgbKEIgLi9maWxlIA==?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= In-Reply-To: <20070220155329.GA5528@okupc1.no-ip.org> References: <20070220155329.GA5528@okupc1.no-ip.org> Message-ID: <20070220160836.GA5770@okupc1.no-ip.org> おくむら@練馬です。 前言撤回します。 On Wed, Feb 21, 2007 at 12:53:29AM +0900, OKUMURA N. Shin-ya wrote: > もし修正するとしたら、lhadd.c の append_it の中か、あるいは > 呼び出し直前で filev 先頭の「./」を取り除くのが安直でいいの > かなと考えています(考えてるだけ)。 このアイディアはちょっとナイーブ過ぎますね。 「./././file」が救えませんから、もう少しスマートな方法にして あげないといけなさそうです... -- OKUMURA N. Shin-ya (oku.ns at dream.com) if (it == misfeature && it != bug) it = bug; From jca02266 @ gmail.com Wed Feb 21 13:04:25 2007 From: jca02266 @ gmail.com (Koji Arai) Date: Wed, 21 Feb 2007 13:04:25 +0900 Subject: [Lha-users] =?iso-2022-jp?b?UmU6IGZpbGUgGyRCJEgbKEIgLi9maWxlIA==?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= In-Reply-To: <20070220160836.GA5770@okupc1.no-ip.org> References: <20070220155329.GA5528@okupc1.no-ip.org> <20070220160836.GA5770@okupc1.no-ip.org> Message-ID: <5b5763d90702202004j1109a8a0we7a8d2ccf4cf0efa@mail.gmail.com> 新井です。 07/02/21 に OKUMURA N. Shin-ya さんは書きました: > おくむら@練馬です。 > > もし修正するとしたら、lhadd.c の append_it の中か、あるいは > > 呼び出し直前で filev 先頭の「./」を取り除くのが安直でいいの > > かなと考えています(考えてるだけ)。 > > このアイディアはちょっとナイーブ過ぎますね。 > > 「./././file」が救えませんから、もう少しスマートな方法にして > あげないといけなさそうです... 安直に以下だとどうでしょうか?(あまり試してません) diff -ru lha-1.14i-ac20061008/src/header.c lha/src/header.c --- lha-1.14i-ac20061008/src/header.c 2006-10-08 23:20:14.000000000 +0900 +++ lha/src/header.c 2007-02-21 12:56:36.690953600 +0900 @@ -1184,17 +1184,21 @@ char *first = path; char *ptr = 0; + /* just a ".." */ if (strcmp(first, "..") == 0) { warning("Removing leading `..' from member name."); return first+1; /* change to "." */ } - if (strstr(first, "..") == 0) + if (strstr(first, ".") == 0) return first; while (path && *path) { - - if (strcmp(path, "..") == 0) + if (strcmp(path, ".") == 0) + ptr = path = path+1; + else if (strncmp(path, "./", 2) == 0) + ptr = path = path+2; + else if (strcmp(path, "..") == 0) ptr = path = path+2; else if (strncmp(path, "../", 3) == 0) ptr = path = path+3; -- Koji Arai From jca02266 @ gmail.com Wed Feb 21 13:15:28 2007 From: jca02266 @ gmail.com (Koji Arai) Date: Wed, 21 Feb 2007 13:15:28 +0900 Subject: [Lha-users] =?iso-2022-jp?b?UmU6IGZpbGUgGyRCJEgbKEIgLi9maWxlIA==?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= In-Reply-To: <5b5763d90702202004j1109a8a0we7a8d2ccf4cf0efa@mail.gmail.com> References: <20070220155329.GA5528@okupc1.no-ip.org> <20070220160836.GA5770@okupc1.no-ip.org> <5b5763d90702202004j1109a8a0we7a8d2ccf4cf0efa@mail.gmail.com> Message-ID: <5b5763d90702202015y46487c0fpa45c9d13a5d1615@mail.gmail.com> 新井です。 07/02/21 に Koji Arai さんは書きました: > 新井です。 > > > 「./././file」が救えませんから、もう少しスマートな方法にして > > あげないといけなさそうです... > > 安直に以下だとどうでしょうか?(あまり試してません) ごめんなさい。バグってます。安直過ぎました ../lha.exe c a.lzh ././././b/./././a LHa: Warning: Removing leading `././././b/./././' from member name. a - Frozen(0%) ".." の扱いとは処理を分ける必要があるか。 -- Koji Arai From jca02266 @ gmail.com Wed Feb 21 17:41:49 2007 From: jca02266 @ gmail.com (Koji Arai) Date: Wed, 21 Feb 2007 17:41:49 +0900 Subject: [Lha-users] =?iso-2022-jp?b?UmU6IGZpbGUgGyRCJEgbKEIgLi9maWxlIA==?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= In-Reply-To: <5b5763d90702202015y46487c0fpa45c9d13a5d1615@mail.gmail.com> References: <20070220155329.GA5528@okupc1.no-ip.org> <20070220160836.GA5770@okupc1.no-ip.org> <5b5763d90702202004j1109a8a0we7a8d2ccf4cf0efa@mail.gmail.com> <5b5763d90702202015y46487c0fpa45c9d13a5d1615@mail.gmail.com> Message-ID: <5b5763d90702210041h621fe698v99c8152d788c243f@mail.gmail.com> 新井です。 これでいかがでしょう? 07/02/21 に Koji Arai さんは書きました: > 新井です。 > > > 「./././file」が救えませんから、もう少しスマートな方法にして > > > あげないといけなさそうです... > > > > 安直に以下だとどうでしょうか?(あまり試してません) > > ごめんなさい。バグってます。安直過ぎました diff -ru lha-1.14i-ac20061008/src/header.c lha/src/header.c --- lha-1.14i-ac20061008/src/header.c 2006-10-08 23:20:14.000000000 +0900 +++ lha/src/header.c 2007-02-21 17:35:20.057974400 +0900 @@ -1214,6 +1214,55 @@ return first; } +int +copy_one_path(char *dst, const char *src, int size) +{ + int i; + + if (size < 1) return 0; + + for (i = 0; i < size; i++) { + dst[i] = src[i]; + if (dst[i] == '\0') + return i; + if (dst[i] == '/') { + dst[++i] = 0; + return i; + } + } + + dst[--i] = 0; + + return i; +} + +/* remove leading "xxx/../" and "./" */ +static int +remove_dots(char *newpath, char *path, size_t size) +{ + int len; + char *p = newpath; + + path = remove_leading_dots(path); + + while (*path) { + if (path[0] == '.' && path[1] == '/') + path += 2; + else { + int len; + len = copy_one_path(newpath, path, size); + + path += len; + newpath += len; + size -= len; + if (size <= 1) + break; + } + } + + return newpath - p; +} + void init_header(name, v_stat, hdr) char *name; @@ -1232,9 +1281,9 @@ hdr->original_size = v_stat->st_size; hdr->attribute = GENERIC_ATTRIBUTE; hdr->header_level = header_level; - len = str_safe_copy(hdr->name, - remove_leading_dots(name), - sizeof(hdr->name)); + + len = remove_dots(hdr->name, name, sizeof(hdr->name)); + hdr->crc = 0x0000; hdr->extend_type = EXTEND_UNIX; hdr->unix_last_modified_stamp = v_stat->st_mtime; -- Koji Arai From oku.ns @ dream.com Thu Feb 22 01:31:50 2007 From: oku.ns @ dream.com (OKUMURA N. Shin-ya) Date: Thu, 22 Feb 2007 01:31:50 +0900 Subject: [Lha-users] =?iso-2022-jp?b?UmU6IGZpbGUgGyRCJEgbKEIgLi9maWxlIA==?= =?iso-2022-jp?b?GyRCJCxKTCVVJSElJCVrMDckJCQ1JGwkaxsoQg==?= In-Reply-To: <5b5763d90702210041h621fe698v99c8152d788c243f@mail.gmail.com> References: <20070220155329.GA5528@okupc1.no-ip.org> <20070220160836.GA5770@okupc1.no-ip.org> <5b5763d90702202004j1109a8a0we7a8d2ccf4cf0efa@mail.gmail.com> <5b5763d90702202015y46487c0fpa45c9d13a5d1615@mail.gmail.com> <5b5763d90702210041h621fe698v99c8152d788c243f@mail.gmail.com> Message-ID: <20070221163150.GA18674@okupc1.no-ip.org> おくむら@練馬です。 On Wed, Feb 21, 2007 at 05:41:49PM +0900, Koji Arai wrote: > 新井です。 > > これでいかがでしょう? おぉ〜、素晴しいです! 期待通りの動作になりました。 # ヘッダを作った後ではなく作る時に対処すれば簡単でしたね... -- OKUMURA N. Shin-ya (oku.ns at dream.com) if (it == misfeature && it != bug) it = bug;