From 3e4693fec74ba2ac35a958a36877a431998bfe29 Mon Sep 17 00:00:00 2001
From: in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>
Date: Sun, 6 Feb 2005 07:49:26 +0000
Subject: fix friend[] overflowing when using utmpserver.

git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2472 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
---
 cacheserver/utmpserver.c | 2 ++
 mbbsd/talk.c             | 8 +++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/cacheserver/utmpserver.c b/cacheserver/utmpserver.c
index 592cd7d0..82832b8f 100644
--- a/cacheserver/utmpserver.c
+++ b/cacheserver/utmpserver.c
@@ -117,6 +117,8 @@ int main(int argc, char **argv)
 	if( toread(cfd, &uid, sizeof(uid)) > 0                              &&
 	    toread(cfd, utmp[index].friend, sizeof(utmp[index].friend)) > 0 &&
 	    toread(cfd, utmp[index].reject, sizeof(utmp[index].reject)) > 0 ){
+	    /* �]�� logout ���ɭԨä��|�q�� utmpserver , �i��|�d��@��
+	       �w�g logout ���b���C�ҥH����u�� MAX_FRIEND �ӭn�h���@�� */
 #define MAX_FS   (2 * MAX_FRIEND)
 	    int     iu, nFrs, stat, rstat;
 	    ocfs_t  fs[MAX_FS];
diff --git a/mbbsd/talk.c b/mbbsd/talk.c
index f8799f4e..8765fe40 100644
--- a/mbbsd/talk.c
+++ b/mbbsd/talk.c
@@ -230,12 +230,18 @@ void login_friend_online(void)
 	    towrite(sfd, currutmp->friend, sizeof(currutmp->friend)) > 0 &&
 	    towrite(sfd, currutmp->reject, sizeof(currutmp->reject)) > 0 ){
 	    ocfs_t  fs;
-	    while( toread(sfd, &fs, sizeof(fs)) > 0 )
+	    while( currutmp->friendtotal < MAX_FRIEND &&
+		   toread(sfd, &fs, sizeof(fs)) > 0 )
 		if( SHM->uinfo[fs.index].uid == fs.uid ){
 		    currutmp->friend_online[currutmp->friendtotal++]
 			= fs.friendstat;
 		    SHM->uinfo[fs.index].friend_online[ SHM->uinfo[fs.index].friendtotal++ ] = fs.rfriendstat;
 		}
+
+	    /* �n��ѤU������, �n���M�|�d�� utmpserver */
+	    if( currutmp->friendtotal == MAX_FRIEND )
+		while( toread(sfd, &fs, sizeof(fs)) > 0 )
+		    ;
 	    close(sfd);
 	    return;
 	}
-- 
cgit v1.2.3