jcs
/subtext
/amendments
/640
util: Minor bugfixes
jcs made amendment 640 1 day ago
--- util.c Fri Feb 16 15:30:48 2024
+++ util.c Tue Sep 22 14:05:04 2026
@@ -305,10 +305,12 @@ void *
xrealloc(void *src, size_t size)
{
void *ptr, *tsrc;
+ size_t osize;
ptr = xmalloc(size);
if (ptr != NULL && src != NULL) {
- memcpy(ptr, src, size);
+ osize = GetPtrSize(src);
+ memcpy(ptr, src, MIN(osize, size));
tsrc = src;
xfree(&tsrc);
}
@@ -1014,7 +1016,7 @@ getpath(short vRefNum, Str255 fileName, Str255 ret, bo
return 1;
}
tmpret = xmalloc(FILENAME_MAX);
- if (tmp == NULL) {
+ if (tmpret == NULL) {
xfree(&tmp);
xfree(&name);
return 1;
@@ -1247,11 +1249,14 @@ FSReadLine(short frefnum, char *buf, size_t buflen)
size_t pos, fsize, rlen = 1, total_read = 0;
short error;
+ if (buflen == 0)
+ return -1;
+
GetFPos(frefnum, &pos);
GetEOF(frefnum, &fsize);
for (; pos <= fsize; pos++) {
- if (total_read > buflen)
+ if (total_read >= buflen - 1)
return -1;
error = FSRead(frefnum, &rlen, &tbuf);
@@ -1259,12 +1264,14 @@ FSReadLine(short frefnum, char *buf, size_t buflen)
return -1;
if (tbuf == '\r')
- return total_read;
+ break;
buf[total_read++] = tbuf;
}
/* nothing found until the end of the file */
+ buf[total_read] = '\0';
+
return total_read;
}
@@ -2041,7 +2048,7 @@ conv: switch (c) {
}
for (i = 0; n; n /= 10, i++)
*--s = n % 10 + '0';
- for (; i < F.precision; i++)
+ for (; i < F.precision && s > buf; i++)
*--s = '0';
if (F.sign) {
*--s = F.sign;
@@ -2070,7 +2077,7 @@ conv: switch (c) {
*--s = '0';
i++;
}
- for (; i < F.precision; i++)
+ for (; i < F.precision && s > buf; i++)
*--s = '0';
break;
@@ -2104,7 +2111,7 @@ conv: switch (c) {
}
for (i = 0; n; n /= 16, i++)
*--s = digits[n % 16];
- for (; i < F.precision; i++)
+ for (; i < F.precision && s > buf; i++)
*--s = '0';
if (F.altForm) {
*--s = c;
@@ -2207,7 +2214,6 @@ vsnprintf(char *s, size_t size, const char *fmt, void
{
FILE f;
int n;
- unsigned char zb;
memset(&f, 0, sizeof(f));
f.refnum = -1;
@@ -2216,18 +2222,12 @@ vsnprintf(char *s, size_t size, const char *fmt, void
f.proc = nullio;
f.dirty = 1;
- if (size == 0)
- zb = s[0];
-
- if ((n = bounded_vfprintf(&f, fmt, p)) >= 0) {
+ if ((n = bounded_vfprintf(&f, fmt, p)) >= 0 && size != 0) {
if (n < size)
s[n] = 0;
else
s[size - 1] = 0;
}
-
- if (size == 0)
- s[0] = zb;
return(n);
}