diff options
author | John Kohl <jtkohl@mit.edu> | 1988-06-23 13:56:01 +0000 |
---|---|---|
committer | John Kohl <jtkohl@mit.edu> | 1988-06-23 13:56:01 +0000 |
commit | 509355ee5d2a8a469df0f657b776dd2d6dae52a2 (patch) | |
tree | 15d4f578984ef218e1fe828f2f9be77eea9bfaf4 /server/subscr.c | |
parent | bbc5590aac20c97bce532609767806e24557072c (diff) |
check answer if NULL before freeing.
use ZFormatSmallRawNoticeList so that multi-packet notice doesn't ensue.
initialize default_notice.z_sender on each pass through copy_def_subs.
Diffstat (limited to 'server/subscr.c')
-rw-r--r-- | server/subscr.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/server/subscr.c b/server/subscr.c index 0cb01dd..6408132 100644 --- a/server/subscr.c +++ b/server/subscr.c @@ -317,10 +317,10 @@ char *person; *cp = '\0'; default_notice.z_message = def_sub_area; default_notice.z_message_len = statbuf.st_size + 1; - /* these are needed later for access_check() */ - default_notice.z_sender = person; default_notice.z_auth = 1; } + /* needed later for access_check() */ + default_notice.z_sender = person; subs = extract_subscriptions(&default_notice); /* replace any non-* recipients with "person" */ @@ -854,7 +854,7 @@ struct sockaddr_in *who; register ZSubscr_t *subs; Code_t retval; ZNotice_t reply; - char *reppacket; + ZPacket_t reppacket; int packlen, i, found = 0; char **answer = (char **) NULL; @@ -879,7 +879,7 @@ struct sockaddr_in *who; /* coalesce the subscription information into a list of char *'s */ if ((answer = (char **) xmalloc(found * NUM_FIELDS * sizeof(char *))) == (char **) 0) { - syslog(LOG_ERR, "subscr no mem(answer)"); + syslog(LOG_ERR, "old_subscr_sendlist no mem(answer)"); found = 0; } else for (i = 0, subs = client->zct_subs->q_forw; @@ -890,7 +890,7 @@ struct sockaddr_in *who; answer[i*NUM_FIELDS + 2] = subs->zst_recipient; } } - /* note that when there are no subscriptions, found == 0, so + /* note that when there are no subscriptions, found == 0, so we needn't worry about answer being NULL */ reply = *notice; @@ -900,34 +900,38 @@ struct sockaddr_in *who; /* if it's too long, chop off one at a time till it fits */ - while ((retval = ZFormatRawNoticeList(&reply, + while ((retval = ZFormatSmallRawNoticeList(&reply, answer, found * NUM_FIELDS, - &reppacket, + reppacket, &packlen)) == ZERR_PKTLEN) { found--; reply.z_opcode = OLD_CLIENT_INCOMPSUBS; } if (retval != ZERR_NONE) { - syslog(LOG_ERR, "subscr_sendlist format: %s", + syslog(LOG_ERR, "old_subscr_sendlist format: %s", error_message(retval)); - xfree(answer); + if (answer) + xfree(answer); return; } if ((retval = ZSetDestAddr(who)) != ZERR_NONE) { syslog(LOG_WARNING, "subscr_sendlist set addr: %s", error_message(retval)); - xfree(answer); + if (answer) + xfree(answer); return; } if ((retval = ZSendPacket(reppacket, packlen, 0)) != ZERR_NONE) { syslog(LOG_WARNING, "subscr_sendlist xmit: %s", error_message(retval)); - xfree(answer); + if (answer) + xfree(answer); return; } zdbug((LOG_DEBUG,"subscr_sendlist acked")); - xfree(answer); + if (answer) + xfree(answer); return; } #endif /* OLD_COMPAT */ |