ret = malloc(strlen(buffer)+1);
ret = smalloc(strlen(buffer)+1);
static char *dss_fingerprint(void *key) {    struct dss_key *dss = (struct dss_key *)key;    struct MD5Context md5c;    unsigned char digest[16], lenbuf[4];    char buffer[16*3+40];    char *ret;    int numlen, i;    MD5Init(&md5c);    MD5Update(&md5c, "\0\0\0\7ssh-dss", 11);#define ADD_BIGNUM(bignum) \    numlen = (ssh1_bignum_bitcount(bignum)+8)/8; \    PUT_32BIT(lenbuf, numlen); MD5Update(&md5c, lenbuf, 4); \    for (i = numlen; i-- ;) { \        unsigned char c = bignum_byte(bignum, i); \        MD5Update(&md5c, &c, 1); \    }    ADD_BIGNUM(dss->p);    ADD_BIGNUM(dss->q);    ADD_BIGNUM(dss->g);    ADD_BIGNUM(dss->y);#undef ADD_BIGNUM    MD5Final(digest, &md5c);    sprintf(buffer, "%d ", ssh1_bignum_bitcount(dss->p));    for (i = 0; i < 16; i++)        sprintf(buffer+strlen(buffer), "%s%02x", i?":":"", digest[i]);    ret = malloc(strlen(buffer)+1);    if (ret)        strcpy(ret, buffer);    return ret;}