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