memory fixes

This commit is contained in:
rsc 2006-03-21 16:55:54 +00:00
parent 37c22c89ee
commit acb880af1c

View file

@ -68,6 +68,7 @@ struct Msg
uchar *bp; uchar *bp;
uchar *p; uchar *p;
uchar *ep; uchar *ep;
int bpalloc;
}; };
char adir[40]; char adir[40];
@ -279,6 +280,22 @@ getmp2(Msg *m)
return betomp(p, n, nil); return betomp(p, n, nil);
} }
void
newmsg(Msg *m)
{
memset(m, 0, sizeof *m);
}
void
mreset(Msg *m)
{
if(m->bpalloc){
memset(m->bp, 0, m->ep-m->bp);
free(m->bp);
}
memset(m, 0, sizeof *m);
}
Msg* Msg*
getm(Msg *m, Msg *mm) getm(Msg *m, Msg *mm)
{ {
@ -291,21 +308,35 @@ getm(Msg *m, Msg *mm)
mm->bp = p; mm->bp = p;
mm->p = p; mm->p = p;
mm->ep = p+n; mm->ep = p+n;
mm->bpalloc = 0;
return mm; return mm;
} }
uchar* uchar*
ensure(Msg *m, int n) ensure(Msg *m, int n)
{ {
int len, plen; int len;
uchar *p; uchar *p;
uchar *obp;
if(m->bp == nil)
m->bpalloc = 1;
if(!m->bpalloc){
p = emalloc(m->ep - m->bp);
memmove(p, m->bp, m->ep - m->bp);
obp = m->bp;
m->bp = p;
m->ep += m->bp - obp;
m->p += m->bp - obp;
m->bpalloc = 1;
}
len = m->ep - m->bp; len = m->ep - m->bp;
if(m->p+n > m->ep){ if(m->p+n > m->ep){
plen = m->p - m->bp; obp = m->bp;
m->bp = erealloc(m->bp, len+n+1024); m->bp = erealloc(m->bp, len+n+1024);
m->p = m->bp+plen; m->p += m->bp - obp;
m->ep = m->bp+len+n+1024; m->ep += m->bp - obp;
m->ep += n+1024;
} }
p = m->p; p = m->p;
m->p += n; m->p += n;
@ -406,12 +437,6 @@ putm(Msg *m, Msg *mm)
putn(m, mm->bp, n); putn(m, mm->bp, n);
} }
void
newmsg(Msg *m)
{
memset(m, 0, sizeof *m);
}
void void
newreply(Msg *m, int type) newreply(Msg *m, int type)
{ {
@ -433,10 +458,9 @@ reply(Aconn *a, Msg *m)
p[2] = (n>>8)&0xFF; p[2] = (n>>8)&0xFF;
p[3] = n&0xFF; p[3] = n&0xFF;
if(chatty) if(chatty)
fprint(2, "respond %d: %.*H\n", p[4], n, m->bp+4); fprint(2, "respond %d t=%d: %.*H\n", n, p[4], n, m->bp+4);
write(a->fd, p, n+4); write(a->fd, p, n+4);
free(p); mreset(m);
memset(m, 0, sizeof *m);
} }
typedef struct Key Key; typedef struct Key Key;
@ -605,7 +629,7 @@ putkey2(Msg *m, int (*put)(Msg*,char**,int), char **f, int nf)
if(put(&mm, f, nf) < 0) if(put(&mm, f, nf) < 0)
return -1; return -1;
putm(m, &mm); putm(m, &mm);
free(mm.bp); mreset(&mm);
p = find(f, nf, "comment"); p = find(f, nf, "comment");
if(p == nil) if(p == nil)
p = ""; p = "";
@ -628,7 +652,7 @@ printkey(char *type, int (*put)(Msg*,char**,int), char **f, int nf)
if(chatty) if(chatty)
printattr(f, nf); printattr(f, nf);
print("%s %.*[ %s\n", type, m.p-m.bp, m.bp, p); print("%s %.*[ %s\n", type, m.p-m.bp, m.bp, p);
free(m.bp); mreset(&m);
return 0; return 0;
} }
@ -655,12 +679,12 @@ static int
listkeys(Msg *m, int version) listkeys(Msg *m, int version)
{ {
char buf[8192+1], *line[100], *f[20], *p, *s; char buf[8192+1], *line[100], *f[20], *p, *s;
uchar *pnk; int pnk;
int i, n, nl, nf, nk; int i, n, nl, nf, nk;
CFid *fid; CFid *fid;
nk = 0; nk = 0;
pnk = m->p; pnk = m->p - m->bp;
put4(m, 0); put4(m, 0);
if((fid = nsopen(factotum, nil, "ctl", OREAD)) == nil){ if((fid = nsopen(factotum, nil, "ctl", OREAD)) == nil){
fprint(2, "ssh-agent: open factotum: %r\n"); fprint(2, "ssh-agent: open factotum: %r\n");
@ -693,18 +717,20 @@ listkeys(Msg *m, int version)
nk++; nk++;
} }
} }
if(chatty)
fprint(2, "sending %d keys\n", nk);
fsclose(fid); fsclose(fid);
pnk[0] = (nk>>24)&0xFF; m->bp[pnk+0] = (nk>>24)&0xFF;
pnk[1] = (nk>>16)&0xFF; m->bp[pnk+1] = (nk>>16)&0xFF;
pnk[2] = (nk>>8)&0xFF; m->bp[pnk+2] = (nk>>8)&0xFF;
pnk[3] = nk&0xFF; m->bp[pnk+3] = nk&0xFF;
return nk; return nk;
} }
void void
listkeystext(void) listkeystext(void)
{ {
char buf[4096+1], *line[100], *f[20], *p, *s; char buf[8192+1], *line[100], *f[20], *p, *s;
int i, n, nl, nf; int i, n, nl, nf;
CFid *fid; CFid *fid;
@ -937,7 +963,7 @@ runmsg(Aconn *a)
Identities: Identities:
nk = listkeys(&m, vers); nk = listkeys(&m, vers);
if(nk < 0){ if(nk < 0){
free(m.bp); mreset(&m);
goto Failure; goto Failure;
} }
if(chatty) if(chatty)
@ -990,7 +1016,7 @@ runmsg(Aconn *a)
msig.p-msig.bp, msig.bp); msig.p-msig.bp, msig.bp);
newreply(&m, SSH2_AGENT_SIGN_RESPONSE); newreply(&m, SSH2_AGENT_SIGN_RESPONSE);
putm(&m, &msig); putm(&m, &msig);
free(msig.bp); mreset(&msig);
reply(a, &m); reply(a, &m);
break; break;