memory fixes
This commit is contained in:
parent
37c22c89ee
commit
acb880af1c
1 changed files with 51 additions and 25 deletions
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue