-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.56 2007/12/01 12:59:05 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/miscutil.c,v $
*
* Revisions :
* $Log: miscutil.c,v $
+ * Revision 1.56 2007/12/01 12:59:05 fabiankeil
+ * Some sanity checks for pick_from_range().
+ *
+ * Revision 1.55 2007/11/03 17:34:49 fabiankeil
+ * Log the "weak randomization factor" warning only
+ * once for mingw32 and provide some more details.
+ *
+ * Revision 1.54 2007/09/19 20:28:37 fabiankeil
+ * If privoxy_strlcpy() is called with a "buffer" size
+ * of 0, don't touch whatever destination points to.
+ *
+ * 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.
while (*q != '\0')
{
- *p++ = toupper((int) *q++);
+ *p++ = (char)toupper((int) *q++);
}
return result;
{
return(1);
}
- for(i = lastchar; i <= *pat; i++)
+ for (i = lastchar; i <= *pat; i++)
{
- charmap[i / 8] |= (1 << (i % 8));
+ charmap[i / 8] |= (unsigned char)(1 << (i % 8));
}
}
else
{
- charmap[*pat / 8] |= (1 << (*pat % 8));
+ charmap[*pat / 8] |= (unsigned char)(1 << (*pat % 8));
lastchar = *pat;
}
}
long int pick_from_range(long int range)
{
long int number;
+
+ assert(range != 0);
+ assert(range > 0);
+
+ if (range <= 0) return 0;
+
#ifdef HAVE_RANDOM
number = random() % range + 1;
#elif defined(FEATURE_PTHREAD)
*
* Currently we don't have mutexes for mingw32, and for
* our purpose this cludge is probably preferable to crashes.
+ *
+ * The warning is shown once on startup from jcc.c.
*/
- log_error(LOG_LEVEL_INFO, "No thread-safe PRNG available? Using weak \'randomization\' factor.");
number = (range + GetCurrentThreadId() % range) / 2;
#else
/*
#endif /* (def HAVE_RANDOM) */
- return (number);
+ return number;
}
+#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
/*********************************************************************
*
* 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)
* 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.
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();