]> git.llucax.com Git - software/mutt-debian.git/blobdiff - lib.c
upstream/543467-thread-segfault.patch: patch to prevent mutt from segfaulting when...
[software/mutt-debian.git] / lib.c
diff --git a/lib.c b/lib.c
index 146f363f713a31a94571a0838bc473e16872768f..c1f124ec9ba34ef58493ac43030f95abd6ac0df9 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -220,11 +220,10 @@ int safe_fsync_close (FILE **f)
     if (fflush (*f) || fsync (fileno (*f)))
     {
       r = -1;
-      fclose (*f);
+      safe_fclose (f);
     }
     else
-      r = fclose(*f);
-    *f = NULL;
+      r = safe_fclose (f);
   }
 
   return r;
@@ -345,7 +344,7 @@ void mutt_unlink (const char *s)
        fwrite (buf, 1, MIN (sizeof (buf), sb.st_size), f);
        sb.st_size -= MIN (sizeof (buf), sb.st_size);
       }
-      fclose (f);
+      safe_fclose (&f);
     }
   }
 }
@@ -739,7 +738,7 @@ int mutt_rx_sanitize_string (char *dest, size_t destlen, const char *src)
  * If a line ends with "\", this char and the linefeed is removed,
  * and the next line is read too.
  */
-char *mutt_read_line (char *s, size_t *size, FILE *fp, int *line)
+char *mutt_read_line (char *s, size_t *size, FILE *fp, int *line, int flags)
 {
   size_t offset = 0;
   char *ch;
@@ -760,10 +759,12 @@ char *mutt_read_line (char *s, size_t *size, FILE *fp, int *line)
     if ((ch = strchr (s + offset, '\n')) != NULL)
     {
       (*line)++;
+      if (flags & M_EOL)
+       return s;
       *ch = 0;
       if (ch > s && *(ch - 1) == '\r')
        *--ch = 0;
-      if (ch == s || *(ch - 1) != '\\')
+      if (!(flags & M_CONT) || ch == s || *(ch - 1) != '\\')
        return s;
       offset = ch - s - 1;
     }
@@ -1005,3 +1006,58 @@ mutt_strsysexit(int e)
   
   return sysexits_h[i].str;
 }
+
+int mutt_atos (const char *str, short *dst)
+{
+  int rc;
+  long res;
+  short tmp;
+  short *t = dst ? dst : &tmp;
+
+  *t = 0;
+
+  if ((rc = mutt_atol (str, &res)) < 0)
+    return rc;
+  if ((short) res != res)
+    return -2;
+
+  *t = (short) res;
+  return 0;
+}
+
+int mutt_atoi (const char *str, int *dst)
+{
+  int rc;
+  long res;
+  int tmp;
+  int *t = dst ? dst : &tmp;
+
+  *t = 0;
+
+  if ((rc = mutt_atol (str, &res)) < 0)
+    return rc;
+  if ((int) res != res)
+    return -2;
+
+  *t = (int) res;
+  return 0;
+}
+
+int mutt_atol (const char *str, long *dst)
+{
+  long r;
+  long *res = dst ? dst : &r;
+  char *e = NULL;
+
+  /* no input: 0 */
+  if (!str || !*str)
+  {
+    *res = 0;
+    return 0;
+  }
+
+  *res = strtol (str, &e, 10);
+  if (e && *e != '\0')
+    return -1;
+  return 0;
+}