undefect. CWE-407 — 63 sites patched across 27 ecosystems

Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com

Patches, unit tests, benchmarks, whitepaper, and outreach briefs.
Public domain — no copyright claimed. Use freely.
This commit is contained in:
russell@unturf.com 2026-03-26 17:11:57 -04:00
commit 0a580b313d
70422 changed files with 17213626 additions and 0 deletions

View file

@ -0,0 +1,160 @@
/*
* Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#include <langinfo.h>
#include <iconv.h>
/* Routines to convert back and forth between Platform Encoding and UTF-8 */
/* Error and assert macros */
#define UTF_ERROR(m) utfError(__FILE__, __LINE__, m)
#define UTF_ASSERT(x) ( (x)==0 ? UTF_ERROR("ASSERT ERROR " #x) : (void)0 )
#define UTF_DEBUG(x)
/* Global variables */
static iconv_t iconvToPlatform = (iconv_t)-1;
static iconv_t iconvFromPlatform = (iconv_t)-1;
/*
* Error handler
*/
static void
utfError(char *file, int line, char *message)
{
(void)fprintf(stderr, "UTF ERROR [\"%s\":%d]: %s\n", file, line, message);
abort();
}
/*
* Initialize all utf processing.
*/
static void
utfInitialize(void)
{
const char* codeset;
#ifndef MACOSX
/* Set the locale from the environment */
(void)setlocale(LC_ALL, "");
/* Get the codeset name */
codeset = (char*)nl_langinfo(CODESET);
if ( codeset == NULL || codeset[0] == 0 ) {
UTF_DEBUG(("NO codeset returned by nl_langinfo(CODESET)\n"));
return;
}
#else /* MACOSX */
/* On Mac, platform string (i.e., sun.jnu.encoding value) is always UTF-8 */
codeset = "UTF-8";
#endif
UTF_DEBUG(("Codeset = %s\n", codeset));
/* If we don't need this, skip it */
if (strcmp(codeset, "UTF-8") == 0 || strcmp(codeset, "utf8") == 0 ) {
UTF_DEBUG(("NO iconv() being used because it is not needed\n"));
return;
}
/* Open conversion descriptors */
iconvToPlatform = iconv_open(codeset, "UTF-8");
if ( iconvToPlatform == (iconv_t)-1 ) {
UTF_ERROR("Failed to complete iconv_open() setup");
}
iconvFromPlatform = iconv_open("UTF-8", codeset);
if ( iconvFromPlatform == (iconv_t)-1 ) {
UTF_ERROR("Failed to complete iconv_open() setup");
}
}
/*
* Do iconv() conversion.
* Returns length or -1 if output overflows.
*/
static int
iconvConvert(iconv_t ic, char *bytes, int len, char *output, int outputMaxLen)
{
int outputLen = 0;
UTF_ASSERT(bytes);
UTF_ASSERT(len>=0);
UTF_ASSERT(output);
UTF_ASSERT(outputMaxLen>len);
output[0] = 0;
outputLen = 0;
if ( ic != (iconv_t)-1 ) {
int returnValue;
size_t inLeft;
size_t outLeft;
char *inbuf;
char *outbuf;
inbuf = bytes;
outbuf = output;
inLeft = len;
outLeft = outputMaxLen;
returnValue = iconv(ic, (void*)&inbuf, &inLeft, &outbuf, &outLeft);
if ( returnValue >= 0 && inLeft==0 ) {
outputLen = outputMaxLen-outLeft;
output[outputLen] = 0;
return outputLen;
}
/* Failed to do the conversion */
UTF_DEBUG(("iconv() failed to do the conversion\n"));
return -1;
}
/* Just copy bytes */
outputLen = len;
(void)memcpy(output, bytes, len);
output[len] = 0;
return outputLen;
}
/*
* Convert UTF-8 to Platform Encoding.
* Returns length or -1 if output overflows.
*/
static int
utf8ToPlatform(char *utf8, int len, char *output, int outputMaxLen)
{
return iconvConvert(iconvToPlatform, utf8, len, output, outputMaxLen);
}
int
convertUtf8ToPlatformString(char* utf8_str, int utf8_len, char* platform_str, int platform_len) {
if (iconvToPlatform == (iconv_t)-1) {
utfInitialize();
}
return utf8ToPlatform(utf8_str, utf8_len, platform_str, platform_len);
}

View file

@ -0,0 +1,172 @@
/*
* Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FileSystemSupport_md.h"
/*
* Solaris/Linux implementation of the file system support functions.
*/
#define slash '/'
char* basePath(const char* path) {
char* last = strrchr(path, slash);
if (last == NULL) {
return (char*)path;
} else {
int len = last - path;
char* str = (char*)malloc(len+1);
if (str == NULL) {
fprintf(stderr, "OOM error in native tmp buffer allocation");
return NULL;
}
if (len > 0) {
memcpy(str, path, len);
}
str[len] = '\0';
return str;
}
}
int isAbsolute(const char* path) {
return (path[0] == slash) ? 1 : 0;
}
/* Ported from src/solaris/classes/java/io/UnixFileSystem.java */
/* A normal Unix pathname contains no duplicate slashes and does not end
with a slash. It may be the empty string. */
/* Normalize the given pathname, whose length is len, starting at the given
offset; everything before this offset is already normal. */
static char* normalizePath(const char* pathname, int len, int off) {
char* sb;
int sbLen, i, n;
char prevChar;
if (len == 0) return (char*)pathname;
n = len;
while ((n > 0) && (pathname[n - 1] == slash)) n--;
if (n == 0) return strdup("/");
sb = (char*)malloc(strlen(pathname)+1);
if (sb == NULL) {
fprintf(stderr, "OOM error in native tmp buffer allocation");
return NULL;
}
sbLen = 0;
if (off > 0) {
memcpy(sb, pathname, off);
sbLen = off;
}
prevChar = 0;
for (i = off; i < n; i++) {
char c = pathname[i];
if ((prevChar == slash) && (c == slash)) continue;
sb[sbLen++] = c;
prevChar = c;
}
return sb;
}
/* Check that the given pathname is normal. If not, invoke the real
normalizer on the part of the pathname that requires normalization.
This way we iterate through the whole pathname string only once. */
char* normalize_path(const char* pathname) {
int i;
int n = strlen(pathname);
char prevChar = 0;
for (i = 0; i < n; i++) {
char c = pathname[i];
if ((prevChar == slash) && (c == slash))
return normalizePath(pathname, n, i - 1);
prevChar = c;
}
if (prevChar == slash) return normalizePath(pathname, n, n - 1);
return (char*)pathname;
}
char* resolve(const char* parent, const char* child) {
int len;
char* theChars;
int pn = strlen(parent);
int cn = strlen(child);
int childStart = 0;
int parentEnd = pn;
if (pn > 0 && parent[pn-1] == slash) {
parentEnd--;
}
len = parentEnd + cn - childStart;
if (child[0] == slash) {
theChars = (char*)malloc(len+1);
if (theChars == NULL) {
fprintf(stderr, "OOM error in native tmp buffer allocation");
return NULL;
}
if (parentEnd > 0)
memcpy(theChars, parent, parentEnd);
if (cn > 0)
memcpy(theChars+parentEnd, child, cn);
theChars[len] = '\0';
} else {
theChars = (char*)malloc(len+2);
if (theChars == NULL) {
fprintf(stderr, "OOM error in native tmp buffer allocation");
return NULL;
}
if (parentEnd > 0)
memcpy(theChars, parent, parentEnd);
theChars[parentEnd] = slash;
if (cn > 0)
memcpy(theChars+parentEnd+1, child, cn);
theChars[len+1] = '\0';
}
return theChars;
}
char* fromURIPath(const char* path) {
int len = strlen(path);
if (len > 1 && path[len-1] == slash) {
// "/foo/" --> "/foo", but "/" --> "/"
char* str = (char*)malloc(len);
if (str == NULL)
{
fprintf(stderr, "OOM error in native tmp buffer allocation");
return NULL;
}
memcpy(str, path, len-1);
str[len-1] = '\0';
return str;
} else {
return (char*)path;
}
}

View file

@ -0,0 +1,30 @@
/*
* Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stddef.h>
#include <stdint.h> /* For uintprt_t */
#include <stdlib.h>
#include <sys/param.h> /* For MAXPATHLEN */