From 7e421d1cd6a8752aa527895c759a72a47203959a Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Thu, 10 Aug 2006 19:32:38 +0000
Subject: [PATCH] * modules/snprintf (Depends-on): Remove minmax. (Maintainer):
 Add self. * lib/.cppi-disable: Add snprintf.h, socket_.h. * lib/snprintf.c:
 Include <errno.h> and <limits.h>. (EOVERFLOW): Define if the system does not.
 Do not include "minmax.h"; it wasn't used. (snprintf): Don't assume size_t
 promotes to an unsigned type. Fix bug when generated string was too long for
 the buffer: the buffer's contents are supposed to be the initial prefix of
 the output.  Don't assume vasnprintf returns EOVERFLOW if the size exceeds
 INT_MAX; do the check ourselves.

---
 ChangeLog         |  5 +++++
 lib/.cppi-disable |  2 ++
 lib/ChangeLog     | 12 ++++++++++++
 lib/snprintf.c    | 32 ++++++++++++++++++++++++--------
 modules/snprintf  |  3 +--
 5 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fedabc50ef..a8bcb871d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* modules/snprintf (Depends-on): Remove minmax.
+	(Maintainer): Add self.
+
 2006-08-10  Bruno Haible  <bruno@clisp.org>
 
 	* gnulib-tool (func_create_testdir): Detect unexpanded macros here
diff --git a/lib/.cppi-disable b/lib/.cppi-disable
index 7106f0cbc7..049783935f 100644
--- a/lib/.cppi-disable
+++ b/lib/.cppi-disable
@@ -29,6 +29,8 @@ regex.c
 regex.h
 regex_internal.c
 regex_internal.h
+snprintf.h
+socket_.h
 stat-time.h
 stdbool_.h
 stdint_.h
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 3ae7e876b5..6f2ba3fcb8 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,15 @@
+2006-08-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* .cppi-disable: Add snprintf.h, socket_.h.
+	* snprintf.c: Include <errno.h> and <limits.h>.
+	(EOVERFLOW): Define if the system does not.
+	Do not include "minmax.h"; it wasn't used.
+	(snprintf): Don't assume size_t promotes to an unsigned type.
+	Fix bug when generated string was too long for the buffer: the
+	buffer's contents are supposed to be the initial prefix of the
+	output.  Don't assume vasnprintf returns EOVERFLOW if the size
+	exceeds INT_MAX; do the check ourselves.
+
 2006-08-09  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Sync from coreutils.
diff --git a/lib/snprintf.c b/lib/snprintf.c
index 5870f8dde3..c281f7c583 100644
--- a/lib/snprintf.c
+++ b/lib/snprintf.c
@@ -1,6 +1,6 @@
 /* Formatted output to strings.
-   Copyright (C) 2004 Free Software Foundation, Inc.
-   Written by Simon Josefsson.
+   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Written by Simon Josefsson and Paul Eggert.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -22,13 +22,19 @@
 
 #include "snprintf.h"
 
+#include <errno.h>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "minmax.h"
 #include "vasnprintf.h"
 
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW.  */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
 /* Print formatted output to string STR.  Similar to sprintf, but
    additional length SIZE limit how much is written into STR.  Returns
    string length of formatted string (which may be larger than SIZE).
@@ -49,12 +55,22 @@ snprintf (char *str, size_t size, const char *format, ...)
   if (!output)
     return -1;
 
-  if (str != NULL)
-    if (len > size - 1) /* equivalent to: (size > 0 && len >= size) */
-      str[size - 1] = '\0';
-
   if (output != str)
-    free (output);
+    {
+      if (size)
+	{
+	  memcpy (str, output, size - 1);
+	  str[size - 1] = '\0';
+	}
+
+      free (output);
+    }
+
+  if (INT_MAX < len)
+    {
+      errno = EOVERFLOW;
+      return -1;
+    }
 
   return len;
 }
diff --git a/modules/snprintf b/modules/snprintf
index 3f53fdfdbc..5b1035031f 100644
--- a/modules/snprintf
+++ b/modules/snprintf
@@ -8,7 +8,6 @@ m4/snprintf.m4
 
 Depends-on:
 vasnprintf
-minmax
 
 configure.ac:
 gl_FUNC_SNPRINTF
@@ -23,4 +22,4 @@ License:
 LGPL
 
 Maintainer:
-Simon Josefsson
+Simon Josefsson, Paul Eggert
-- 
2.43.0