diff -ur ./include/freeradius-client.h /tmp/freeradius-client-1.1.6/include/freeradius-client.h --- ./include/freeradius-client.h 2008-02-11 08:54:23.000000000 +0200 +++ /tmp/freeradius-client-1.1.6/include/freeradius-client.h 2010-02-03 14:19:24.333594507 +0200 @@ -420,7 +420,7 @@ void rc_avpair_free(VALUE_PAIR *); int rc_avpair_parse(const rc_handle *, char *, VALUE_PAIR **); int rc_avpair_tostr(const rc_handle *, VALUE_PAIR *, char *, int, char *, int); -char *rc_avpair_log(rc_handle *, VALUE_PAIR *); +char *rc_avpair_log(rc_handle *, VALUE_PAIR *, char *buf, size_t buf_len); VALUE_PAIR *rc_avpair_readin(const rc_handle *, FILE *); /* buildreq.c */ diff -ur ./lib/avpair.c /tmp/freeradius-client-1.1.6/lib/avpair.c --- ./lib/avpair.c 2008-01-09 09:05:11.000000000 +0200 +++ /tmp/freeradius-client-1.1.6/lib/avpair.c 2010-02-03 14:20:09.019457941 +0200 @@ -726,18 +726,16 @@ * Function: rc_avpair_log * * Purpose: format sequence of attribute value pairs into printable - * string. The string is dynamically allocated and is automatically - * freed when rc_handle is destroyed or rc_avpair_log() is called - * again. + * string. The caller should provide a storage buffer and the buffer length. + * Returns pointer to provided storage buffer. * */ char * -rc_avpair_log(rc_handle *rh, VALUE_PAIR *pair) +rc_avpair_log(rc_handle *rh, VALUE_PAIR *pair, char *buf, size_t buf_len) { size_t len, nlen; VALUE_PAIR *vp; char name[33], value[256]; - char *cp; len = 0; for (vp = pair; vp != NULL; vp = vp->next) { @@ -745,16 +743,12 @@ sizeof(value)) == -1) return NULL; nlen = len + 32 + 3 + strlen(value) + 2 + 2; - cp = realloc(rh->ppbuf, nlen); - if (cp == NULL) { - rc_log(LOG_ERR, "rc_avpair_log: can't allocate memory"); - return NULL; - } - sprintf(cp + len, "%-32s = '%s'\n", name, value); - rh->ppbuf = cp; + if(nlen 0) ? rh->ppbuf : NULL; + return buf; } /* diff -ur ./src/radiusclient.c /tmp/freeradius-client-1.1.6/src/radiusclient.c --- ./src/radiusclient.c 2007-01-06 22:15:36.000000000 +0200 +++ /tmp/freeradius-client-1.1.6/src/radiusclient.c 2010-02-03 14:18:14.382459597 +0200 @@ -34,6 +34,8 @@ #include +#define BUF_LEN 4096 + int process(void *, VALUE_PAIR *, int, int); static void @@ -163,13 +165,14 @@ { VALUE_PAIR *received; char msg[4096]; + char buf[BUF_LEN]; int i; received = NULL; if (acct == 0) { i = rc_auth(rh, nas_port, send, &received, msg); if (received != NULL) { - printf("%s", rc_avpair_log(rh, received)); + printf("%s", rc_avpair_log(rh, received, buf, BUF_LEN)); rc_avpair_free(received); } } else {