vac: fix segfault on DMSYMLINK or DMDEVICE
Fix segfault when the first archived file is DMSYMLINK or DMDEVICE. Reinitialize the buffer to zero before calling readlink. R=rsc CC=plan9port.codebot http://codereview.appspot.com/5500097
This commit is contained in:
parent
258cfab2fe
commit
68e24566b6
1 changed files with 6 additions and 4 deletions
|
|
@ -502,11 +502,16 @@ vac(VacFile *fp, VacFile *diffp, char *name, Dir *d)
|
||||||
if(vacfilesetdir(f, &vd) < 0)
|
if(vacfilesetdir(f, &vd) < 0)
|
||||||
warn("vacfilesetdir %s: %r", name);
|
warn("vacfilesetdir %s: %r", name);
|
||||||
|
|
||||||
|
bsize = fs->bsize;
|
||||||
|
if(buf == nil)
|
||||||
|
buf = vtmallocz(bsize);
|
||||||
|
|
||||||
#ifdef PLAN9PORT
|
#ifdef PLAN9PORT
|
||||||
if(d->mode&(DMSOCKET|DMNAMEDPIPE)){
|
if(d->mode&(DMSOCKET|DMNAMEDPIPE)){
|
||||||
/* don't write anything */
|
/* don't write anything */
|
||||||
}
|
}
|
||||||
else if(d->mode&DMSYMLINK){
|
else if(d->mode&DMSYMLINK){
|
||||||
|
memset(buf, 0, sizeof buf);
|
||||||
n = readlink(name, buf, sizeof buf);
|
n = readlink(name, buf, sizeof buf);
|
||||||
if(n > 0 && vacfilewrite(f, buf, n, 0) < 0){
|
if(n > 0 && vacfilewrite(f, buf, n, 0) < 0){
|
||||||
warn("venti write %s: %r", name);
|
warn("venti write %s: %r", name);
|
||||||
|
|
@ -539,9 +544,6 @@ vac(VacFile *fp, VacFile *diffp, char *name, Dir *d)
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
off = 0;
|
off = 0;
|
||||||
bsize = fs->bsize;
|
|
||||||
if(buf == nil)
|
|
||||||
buf = vtmallocz(bsize);
|
|
||||||
if(fdiff){
|
if(fdiff){
|
||||||
/*
|
/*
|
||||||
* Copy fdiff's contents into f by moving the score.
|
* Copy fdiff's contents into f by moving the score.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue