If privoxy_strlcpy() is called with a "buffer" size
[privoxy.git] / miscutil.c
index 174b10c..ab1ccae 100644 (file)
@@ -1,4 +1,4 @@
-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.49 2007/05/11 11:48:15 fabiankeil Exp $";
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.53 2007/09/09 18:20:20 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.c,v $
@@ -44,6 +44,21 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.49 2007/05/11 11:48:15 fabianke
  *
  * Revisions   :
  *    $Log: miscutil.c,v $
+ *    Revision 1.53  2007/09/09 18:20:20  fabiankeil
+ *    Turn privoxy_strlcpy() into a function and try to work with
+ *    b0rked snprintf() implementations too. Reported by icmp30.
+ *
+ *    Revision 1.52  2007/08/19 12:32:34  fabiankeil
+ *    Fix a conversion warning.
+ *
+ *    Revision 1.51  2007/06/17 16:12:22  fabiankeil
+ *    #ifdef _WIN32 the last commit. According to David Shaw,
+ *    one of the gnupg developers, the changes are mingw32-specific.
+ *
+ *    Revision 1.50  2007/06/10 14:59:59  fabiankeil
+ *    Change replacement timegm() to better match our style, plug a small
+ *    but guaranteed memory leak and fix "time zone breathing" on mingw32.
+ *
  *    Revision 1.49  2007/05/11 11:48:15  fabiankeil
  *    - Delete strsav() which was replaced
  *      by string_append() years ago.
@@ -756,7 +771,7 @@ char *string_toupper(const char *string)
 
    while (*q != '\0')
    {
-      *p++ = toupper((int) *q++);
+      *p++ = (char)toupper((int) *q++);
    }
 
    return result;
@@ -1104,6 +1119,40 @@ long int pick_from_range(long int range)
 }
 
 
+#ifdef USE_PRIVOXY_STRLCPY
+/*********************************************************************
+ *
+ * Function    :  privoxy_strlcpy
+ *
+ * Description :  strlcpy(3) look-alike for those without decent libc.
+ *
+ * Parameters  :
+ *          1  :  destination: buffer to copy into.
+ *          2  :  source: String to copy.
+ *          3  :  size: Size of destination buffer.
+ *
+ * Returns     :  The length of the string that privoxy_strlcpy() tried to create.
+ *
+ *********************************************************************/
+size_t privoxy_strlcpy(char *destination, const char *source, const size_t size)
+{
+   if (0 < size)
+   {
+      snprintf(destination, size, "%s", source);
+      /*
+       * Platforms that lack strlcpy() also tend to have
+       * a broken snprintf implementation that doesn't
+       * guarantee nul termination.
+       *
+       * XXX: the configure script should detect and reject those.
+       */
+      destination[size-1] = '\0';
+   }
+   return strlen(source);
+}
+#endif /* def USE_PRIVOXY_STRLCPY */
+
+
 #ifndef HAVE_STRLCAT
 /*********************************************************************
  *
@@ -1116,7 +1165,7 @@ long int pick_from_range(long int range)
  *          2  :  source: String to copy.
  *          3  :  size: Size of destination buffer.
  *
- * Returns     :  The length of the string that strlcat tried to create.
+ * Returns     :  The length of the string that privoxy_strlcat() tried to create.
  *
  *********************************************************************/
 size_t privoxy_strlcat(char *destination, const char *source, const size_t size)
@@ -1136,8 +1185,8 @@ size_t privoxy_strlcat(char *destination, const char *source, const size_t size)
  *                Copyright (C) 2004 Free Software Foundation, Inc.
  *
  *                Code originally copied from GnuPG, modifications done
- *                for Privoxy: style changed, minor memory leak plugged,
- *                last putenv() call adjusted to work on mingw32.
+ *                for Privoxy: style changed, #ifdefs for _WIN32 added
+ *                to have it work on mingw32.
  *
  *                XXX: It's very unlikely to happen, but if the malloc()
  *                call fails the time zone will be permanently set to UTC.
@@ -1167,15 +1216,19 @@ time_t timegm(struct tm *tm)
          strcpy(old_zone, "TZ=");
          strcat(old_zone, zone);
          putenv(old_zone);
+#ifdef _WIN32
          free(old_zone);
+#endif /* def _WIN32 */
       }
    }
    else
    {
 #ifdef HAVE_UNSETENV
       unsetenv("TZ");
-#else
+#elif defined(_WIN32)
       putenv("TZ=");
+#else
+      putenv("TZ");
 #endif
    }
    tzset();