From a461151d1c95600f859ac8b898e3c4771a6a4e03 Mon Sep 17 00:00:00 2001 From: piaip Date: Fri, 10 Jul 2009 05:47:59 +0000 Subject: * code refine: prevent double free / memory leaks git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4735 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- daemon/logind/logind.c | 51 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/daemon/logind/logind.c b/daemon/logind/logind.c index c720624a..8587c670 100644 --- a/daemon/logind/logind.c +++ b/daemon/logind/logind.c @@ -771,46 +771,56 @@ static char *welcome_screen, *goodbye_screen, *ban_screen; static void load_text_screen_file(const char *filename, char **pptr) { - FILE *fp; - off_t sz, wsz, psz; + FILE *fp = NULL; + off_t sz, wsz=0, psz; char *p, *s = NULL; int max_lines = MAX_TEXT_SCREEN_LINES; sz = dashs(filename); - if (sz < 1) + if (sz > 1) { - free(*pptr); - *pptr = NULL; - return; + wsz = sz*2 +1; // *2 for cr+lf, extra one byte for safe strchr(). + fp = fopen(filename, "rt"); } - wsz = sz*2 +1; // *2 for cr+lf, extra one byte for safe strchr(). + // check valid file assert(pptr); s = *pptr; - s = realloc(s, wsz); + if (!fp) + { + if (s) free(s); + *pptr = NULL; + return; + } + + // check memory buffer + s = realloc(*pptr, wsz); *pptr = s; if (!s) + { + fclose(fp); return; + } + // prepare buffer memset(s, 0, wsz); p = s; psz = wsz; - fp = fopen(filename, "rt"); - if (!fp) - { - free(s); - return; - } while ( max_lines-- > 0 && fgets(p, psz, fp)) { - psz -= strlen(p); - p += strlen(p); - *p ++ = '\r'; + size_t l = strlen(p); + psz -= l; + p += l; + if (l > 0 && *(p-1) == '\n') + { + // convert \n to \r\n + *(p-1)= '\r'; + *p ++ = '\n'; + } } fclose(fp); - *pptr = s; } static void regular_check(); @@ -1586,7 +1596,8 @@ client_cb(int fd, short event, void *arg) { login_conn_ctx *conn = (login_conn_ctx*) arg; int len, r; - unsigned char buf[64], ch, *s = buf; + unsigned char buf[64], ch; + char *s = (char*)buf; // for time-out, simply close connection. if (event & EV_TIMEOUT) @@ -1639,7 +1650,7 @@ client_cb(int fd, short event, void *arg) while (len > 0) { - int c = _handle_term_keys((char**)&s, &len); + int c = _handle_term_keys(&s, &len); // for zero, ignore. if (!c) -- cgit v1.2.3