Re: Patch dla mfs.spec
Bartlomiej Zimon
uzi18 at o2.pl
Fri Mar 8 18:41:03 CET 2013
Dnia 7 marca 2013 6:31 Jakub Bogusz <qboosh w pld-linux.org> napisał(a):
> > On Wed, Mar 06, 2013 at 10:38:06PM +0100, Bartlomiej Zimon wrote:
> > Dnia 5 marca 2013 10:01 Paweł Kośka <pawel w viop.pl> napisał(a):
> >
> > > W dniu 5 marca 2013 07:02 użytkownik Jakub Bogusz
> > > <qboosh w pld-linux.org> napisał:
> > > > On Mon, Mar 04, 2013 at 02:14:45PM +0100, Paweł Kośka wrote:
> > >
> > > >> wiesza się na:
> > > >>
> > > >> [root w pavetta pld]# LANG=C poldek -v --noask -s packages/RPMS/
> > > >> --mkidxz
> > > >> Creating pndir index of /home/services/PLD/pld/packages/RPMS/ (type=dir)...
> > > >> Loading [dir]/home/services/PLD/pld/packages/RPMS/...
> > > >> Writing /home/services/PLD/pld/packages/RPMS/packages.ndir.gz...
> > > >
> > > > Jak to wiesza?
> > > > Co pokazuje strace?
> > > > Przy EPERM/EACCESS poldek nie powinien się wieszać, tylko zakończyć działanie.
> > > > Jeśli jest inaczej, to błąd.
> > >
> >
> > Mozna to jakos zreprodukowac bez zabawy w mfs ?
>
> W strace wygląda to tak:
>
> [...]
> 935. write(1, "Writing /home/services/PLD/RPMS/"..., 52) = 52
> 936. stat("/home/services/PLD/RPMS/packages.ndir.gz", 0x7fff804cb1a0) = -1 ENOENT (No such file or directory)
> 937. open("/home/services/PLD/RPMS/packages.ndir.gz.tmpTaxCCA", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
> 938. fchmod(3, 0600) = 0
> 939. rmdir("/home/services/PLD/RPMS/packages.ndir.gz.tmpTaxCCA") = -1 ENOTDIR (Not a directory)
> ^^^^^ po co to BTW??? później też powtarza się kilka razy
> 940. unlink("/home/services/PLD/RPMS/packages.ndir.gz.tmpTaxCCA") = 0
> [...]
> 1198. dup(3) = 6
> [...]
> 1208. open("/home/services/PLD/RPMS/packages.ndir.gz", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
> [...]
> 1213. dup(3) = 7
> [...]
> 1219. lseek(6, 0, SEEK_SET) = 0
> 1220. lseek(7, 0, SEEK_END) = 68
> 1221. read(6, 0x7fff804c70c0, 16384) = -1 EPERM (Operation not permitted)
> 1222. write(7, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4294967295) = -1 EFAULT (Bad address)
> 1223. read(6, 0x7fff804c70c0, 16384) = -1 EPERM (Operation not permitted)
> 1224. write(7, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4294967295) = -1 EFAULT (Bad address)
> [...i tak do ...]
>
> Czyli dwa błędy, albo nawet trzy błędy:
> - brak sprawdzenia statusu read()
> - użycie informacji o błędzie (-1) jako liczby bajtów do zapisu
> - brak sprawdzenia statusu write()
Wszystkie te bledy znajduja sie w bibliotece tndb.
Wyglada to na jakis blad optymalizacji kompilacji,
bo normalnie takie cos dziala w C poprawnie:
(fragment pliku poldek/tndb/write.c:tndbw_close)
ntotal = 0;
while ((nread = read(fdin, buf, sizeof(buf))) > 0) {
if (write(fdout, buf, nread) != (int)nread)
goto l_end;
ntotal += nread;
}
W naszym problemie mamy:
nread = -1, a mimo to petla sie wykonuje.
warunek (-1 > 0) to normalnie false ;/
rmdir tez znajdziemy w tndb - pytanie tylko jak to
powinno dzialac, bo moze rmdir jest nadmiarowe, pozostalosc po starszej implementacji?
Pozdrawiam
Bartlomiej Zimon
More information about the pld-devel-pl
mailing list