From: Paul Eggert Date: Thu, 10 Aug 2006 19:32:38 +0000 (+0000) Subject: * modules/snprintf (Depends-on): Remove minmax. X-Git-Tag: cvs-readonly~2077 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=7e421d1cd6a8752aa527895c759a72a47203959a;p=gnulib.git * modules/snprintf (Depends-on): Remove minmax. (Maintainer): Add self. * lib/.cppi-disable: Add snprintf.h, socket_.h. * lib/snprintf.c: Include and . (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. --- diff --git a/ChangeLog b/ChangeLog index fedabc50e..a8bcb871d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-08-10 Paul Eggert + + * modules/snprintf (Depends-on): Remove minmax. + (Maintainer): Add self. + 2006-08-10 Bruno Haible * gnulib-tool (func_create_testdir): Detect unexpanded macros here diff --git a/lib/.cppi-disable b/lib/.cppi-disable index 7106f0cbc..049783935 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 3ae7e876b..6f2ba3fcb 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,15 @@ +2006-08-10 Paul Eggert + + * .cppi-disable: Add snprintf.h, socket_.h. + * snprintf.c: Include and . + (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 Sync from coreutils. diff --git a/lib/snprintf.c b/lib/snprintf.c index 5870f8dde..c281f7c58 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 +#include #include #include #include -#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 3f53fdfdb..5b1035031 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