fix bugs when buffer is empty.
[apps/madmutt.git] / lib-sys / unix.c
index 38389b2..3e2c23d 100644 (file)
@@ -20,7 +20,7 @@
  * otherwise assume that the GECOS field is a comma-separated list.
  * Replace "&" by a capitalized version of the user's login name.
  */
-ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, regex_t *rx)
+ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, rx_t *rx)
 {
     const char *p, *end;
     ssize_t len;
@@ -31,24 +31,24 @@ ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, regex_t *rx)
     if (!pw->pw_gecos)
         return 0;
 
-    if (rx) {
+    if (rx->rx) {
         regmatch_t pat_match[1];
 
-        if (regexec(rx, pw->pw_gecos, 1, pat_match, 0)) {
+        if (regexec(rx->rx, pw->pw_gecos, 1, pat_match, 0)) {
             return 0;
         }
 
         p   = pw->pw_gecos + pat_match[0].rm_so;
-        end = pw->pw_gecos + pat_match[0].rm_so;
+        end = pw->pw_gecos + pat_match[0].rm_eo;
     } else {
         p   = pw->pw_gecos;
         end = m_strchrnul(pw->pw_gecos, ',');
     }
 
     for (;;) {
-        const char *q = MIN(end, m_strchrnul(p, '&'));
+        const char *q = m_strchrnul(p, '&');
 
-        len += m_strncpy(dst + len, n - len, p, q - p);
+        len += m_strncpy(dst + len, n - len, p, MIN(end, q) - p);
         p = q + 1;
 
         if (!p[-1] || p >= end)