From: Alexey Tourbin <at@altlinux.ru> To: ALT Devel discussion list <devel@lists.altlinux.org> Subject: Re: [devel] bad paths in rpm packages Date: Tue, 25 Mar 2008 05:50:03 +0300 Message-ID: <20080325025003.GJ31135@solemn.turbinal> (raw) In-Reply-To: <20080324232051.GC21713@wo.int.altlinux.org> [-- Attachment #1: Type: text/plain, Size: 3282 bytes --] On Tue, Mar 25, 2008 at 02:20:51AM +0300, Dmitry V. Levin wrote: > > > > $ rpmpeek /ALT/Sisyphus/files/SRPMS/pear-core-1.6.2-alt6.src.rpm fgrep /. pear-core.spec > > > > %pear_dir/.* > > > > > > Надо просто добавить проверку в rpm-build. > > > Аналогичная проверка на то, что все пути начинаются от корня, > > > там уже есть. Такие пакеты просто не должны собираться. > > > > Посмотри повнимательнее. > > Мне кажется это (ещё и) проблема глоба для %files. > > Ещё и. Собственно, встал вопрос, как определить: какноничен ли путь, или не каноничен? Пришлось написать ахтомат (см. ниже). Но тут всплыла другая проблема: путь может быть каноничен, но не кошерен. rpm позволяет запаковать некошерный путь: %install install -pD /dev/null %buildroot/etc/rc.d/init.d/functions ln -s rc.d/init.d %buildroot/etc/init.d %files /etc/init.d/functions $ rpm -bb test.spec ... warning: Installed (but unpackaged) file(s) found: /etc/init.d /etc/rc.d/init.d/functions Wrote: /home/at/RPM/RPMS/athlon/test-1.0-alt1.athlon.rpm $ rpm -qlvp /home/at/RPM/RPMS/athlon/test-1.0-alt1.athlon.rpm -rwxr-xr-x 1 root root 0 Mar 20 18:50 /etc/init.d/functions $ Куда ни кинь, всюду клин. А ты говоришь "загадка". commit 44a9bc68edcc01c08a2483dd90b2159fe9b35e36 Author: Alexey Tourbin <at@altlinux> Date: Tue Mar 25 05:33:59 2008 +0300 file.c (addFile): file path must be canonical (new function pathIsCanonical) diff --git a/build/files.c b/build/files.c index 114d575..35d34be 100644 --- a/build/files.c +++ b/build/files.c @@ -1487,6 +1487,66 @@ static /*@null@*/ FileListRec freeFileList(/*@only@*/ FileListRec fileList, return NULL; } +/* Written by Alexey Tourbin! */ +static int pathIsCanonical(const char *path) +{ + enum { + ST_NONE, + ST_SLASH, + ST_SLASHDOT, + ST_SLASHDOTDOT + } state = ST_NONE; + const char *p = path; + while (1) { + int c = *p; + switch (c) { + case '/': + switch (state) { + case ST_SLASH: + case ST_SLASHDOT: + case ST_SLASHDOTDOT: + return 0; + default: + state = ST_SLASH; + break; + } + break; + case '.': + switch (state) { + case ST_SLASH: + state = ST_SLASHDOT; + break; + case ST_SLASHDOT: + state = ST_SLASHDOTDOT; + break; + default: + state = ST_NONE; + break; + } + break; + case '\0': + switch (state) { + case ST_SLASHDOT: + case ST_SLASHDOTDOT: + return 0; + case ST_SLASH: + if (p > path + 1) + return 0; + return 1; + default: + return 1; + } + break; + default: + state = ST_NONE; + break; + } + p++; + } + /* not reachable */ + return 0; +} + /** * Add a file to the package manifest. * @param fl package file tree walk data @@ -1553,6 +1613,13 @@ static int addFile(FileList fl, const char * diskURL, return RPMERR_BADSPEC; } + if (!pathIsCanonical(fileURL)) { + rpmError(RPMERR_BADSPEC, + _("File path must be canonical: %s\n"), fileURL); + fl->processingFailed = 1; + return RPMERR_BADSPEC; + } + /* If we are using a prefix, validate the file */ if (!fl->inFtw && fl->prefix) { const char *prefixTest; [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
next prev parent reply other threads:[~2008-03-25 2:50 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2008-03-24 23:07 Alexey Tourbin 2008-03-24 23:13 ` Dmitry V. Levin 2008-03-24 23:17 ` Alexey Tourbin 2008-03-24 23:20 ` Dmitry V. Levin 2008-03-25 2:50 ` Alexey Tourbin [this message] 2008-03-25 3:08 ` Alexey Tourbin 2008-03-25 22:29 ` Alexey Tourbin 2008-03-25 4:04 ` Alexey Tourbin 2008-03-25 0:05 ` Alexey Tourbin 2008-03-24 23:13 ` Alexey Tourbin 2008-03-24 23:42 ` Alexey Tourbin 2008-03-24 23:44 ` Alexey Tourbin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080325025003.GJ31135@solemn.turbinal \ --to=at@altlinux.ru \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git